Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11276 / 456 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 25:

Библиотека классов VCL среды проектирования Delphi. Приложения и диалоги

< Лекция 24 || Лекция 25: 123 || Лекция 26 >

Статическое и динамическое подключения DLL-библиотеки

DLL-библиотека может подключаться или статически, или динамически. При подключении DLL-библиотеки она загружается в память приложения.

При статическом подключении DLL-библиотека загружается один раз при запуске приложения.

На всем протяжении выполнения приложения имя функции, импортируемой из DLL-библиотеки, которая была подключена статически, указывает на одну и ту же функцию (точку входа в DLL) в одной и той же DLL.

В отличие от статического подключения DLL-библиотеки, выполняемого в момент загрузки приложения, динамическое подключение может быть выполнено в любой точке выполнения программы. После вызова функции из DLL-библиотеки ее можно отключить. При одновременном использовании нескольких DLL-библиотек это дает ощутимую экономию памяти.

Для динамического подключения DLL-библиотеки применяются функции Windows API. Windows API - это набор стандартных функций, используемый для реализации взаимодействия с операционной системой.

Все функции из статически подключаемой DLL-библиотеки, которые будут использоваться в приложении, первоначально должны быть объявлены как внешние.

При этом следует указать, если требуется, модификатор вызова. Если функция вызывается по индексу, то для нее следует задать имя, используемое в приложении и индекс функции в DLL-библиотеке.

Объявления внешних функций выполняется в секции implementation до использования этих функций.

Объявление внешней функции с ключевым словом external определяет, что будет применено статическое связывание.

Например:

function F1 (i: Integer): Integer; stdcall;
                          external 'MyLib.dll';

При вызове функции из динамически подключаемой DLL-библиотеки, вместо определения имени функции как external, в случае статического связывания, следует определить новый тип, соответствующий типу вызываемой функции, и создать переменную данного типа.

Определение типа функции или процедуры описывается так:

Новый_тип =function(список_параметров):тип_функции; 
модификатор_доступа; 
или

Новый_тип=procedure(список_параметров); модификатор доступа;.

Следующий пример иллюстрирует вызов функции из динамически подключаемой DLL-библиотеки:

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, 
  Controls, Forms, Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
  end;
  TMyF1=function( i:Integer):Integer; stdcall; {Создание 
                                             типа  функции}
var
  Form1: TForm1;
  MyF1 : TMyF1;   {Объявление переменной типа функции}
implementation
{$R *.dfm}
procedure TForm1.Button3Click(Sender: TObject);
var
h: Integer;
begin
h:=LoadLibrary('MyLib.dll'); // Динамическое подключение
if  h <> 0 then
 begin
 @MyF1:=GetProcAddress(h,'F1'); // Получение адреса функции
   if  @MyF1 <> nil then
   ShowMessage(IntToStr(MyF1(20));   // Вызов Функции
 FreeLibrary(h);     // Освобождение dll-библиотеки
 end;
end;
end.
< Лекция 24 || Лекция 25: 123 || Лекция 26 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);