Программирование для защищенного режима 237

Add, Sub, Mul, CDiv: TComplexProc;

Handle: Word;

begin

{Исходные комплексные числа: 1+li, 1+2i} a. Re := 1;

a. Im : = 1;

b.Re := 1;

b.Im := 2;

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

if Handle = 0 then begin

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

Halt end;

{Определяем адреса процедур. Три первые вызываем по

индексу, четвертую - по имени. При вызове по индексу

младшее слово PChar должно содержать индекс,

поэтому делаем приведение типов:} @Add := GetProcAddress(Handle,PChar(Longint(1)));

@Sub := GetProcAddress(Handle,PChar(Longint(2)));

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

@CDiv := GetProcAddress(Handle,'CmplxDiv');

{Используем библиотеку} Add(a,b,с) ;

WriteLn('Сложение : ', с.Re:3:0, с.Im:4:0,'i') ;

Sub(a,b,с) ;

WriteLn('Вычитание: ', c.Re:3:0, c.Im:4:0,'i');

Mul(a,b,c) ;

WriteLn('Умножение: ', c.Re:3:0, c.Im:4:0,'i');

CDiv(a,b,c) ;

WriteLn('Деление : ', c.Re:3:1, c.Im:4:1,'i');

{После использования удаляем библиотеку из памяти} FreeLibrary(Handle) end.

При вызове DLL—подпрограмм в большинстве случаев бывает необходимо передавать структурированные параметры типа записей, как тип TComplex в предыдущем примере. Поскольку DLL не могут экспортировать типы, приходится объявлять эти типы в вызывающей программе. Если Вы часто обращаетесь в своих программах к той или иной DLL, удобно создать интерфейсный модуль, содержащий объявления как подпрограмм, так и связанных с ними типов. Например:

Unit Cmplx;

{$N+,E+}

Interface type

TComplex = record