Использование. Статическая загрузка

Статическая загрузка

В следующей программе используется библиотека Сmpix, описанная на предыдущей странице.

type
TComplex = record
Re, Im: Real;
end;


function ADDC(x, y: TComplex): TComplex; stdcall; External 'Cmplx';
function SubC(x, y: TComplex): TComplex; stdcall; External 'Cmplx';
function MulC(x, y: TComplex): TComplex; stdcall; External 'Cmplx';
function DivC(x, y: TComplex): TComplex; stdcall; External 'Cmplx';
procedure TfmExample.bbRunClick(Sender: TObject);
var
x,y,z: TComplex;


..... // Далее смотри текст обработчика bbRunClick в п.12.6 end; end.


Обратите внимание: библиотечная функция cmpixAdd имеет внешнее имя addc. Именно так (заглавными буквами) описана эта функция в приведенном выше примере. Если бы мы использовали function AddC(x, у: TComplex): TComplex; stdcall; External

'Cmplx';

компоновщик не смог бы ее идентифицировать.

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

Описанный выше способ определения функций и процедур DLL (с помощью директивы External) заставит компилятор поместить в заголовок программы список всех DLL, и загрузчик загрузит библиотеки в память одновременно с загрузкой самой программы. Программа может загружать DLL и без External с помощью трех cтандартных функций: 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;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: