Программирование для защищенного режима 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