13.4.2. Динамическая загрузка

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

Стандартных функций : LoadLibrary, GetProcAddress И FreeLibrary.

Следующий пример иллюстрирует технику такой загрузки DLL Cmplx:

type

TComplex = record Re, Im: Real;

end;

TComplexFunc = function (x, y: TComplex): TComplex;

stdcall;

procedure TfmExample.bbRunClick(Sender: TObject);

var

x,y,z: TComplex;

AddC,SubC,MulC,DivC: TComplexFunc;

Handle: LongWord;

procedure Output(Operation: Char);

....//Тело процедуры Output остается без изменений

end; //Output

begin //bbRunClick

// Загружаем библиотеку CMPLX.DLL Handle := LoadLibrary('Cmplx.dll');

if Handle = 0 then

begin

ShowMessage('He найдена библиотека CMPLX.DLL') ;

Halt

end;

{Определяем адреса функций. Три первые вызываем по индексу, четвертую - по имени. При вызове по индексу младшее слово PChar должно содержать индекс, поэтому делаем приведение типов:} @AddC := GetProcAddress(Handle,PChar(Longint (1)));

PSubC := GetProcAddress(Handle,PChar(Longint(2)));

@MulC := GetProcAddress(Handle,PChar(Longint(3)));

@DivC := GetProcAddress(Handle,'DivC');

x.re := Random;

x.im := Random;

y.re := Random;

y.im := Random; Output('+');

Output('-');

Output ('*');

Output ('/');

mmOutput.Lines.Add('');

// Освобождаем библиотеку FreeLibrary(Handle)

end;