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;