Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
6
Добавлен:
02.02.2015
Размер:
50.15 Кб
Скачать

Примеры оформления фразы exports:

exports   MyFunc index 1,   MyProc index 2;          // Явно добавлены номера после слова Index

exports   MyFunc name 'NewFunc';   // После слова Name задано иное внешнее имя

exports   MyFunc Resident;         // Установлен признак Resident, ускорит обращение к ПП

Вызывающая программа может вызвать подпрограмму:

  • По имени. Это медленно. Имен много и они длинные. Время затрачивается на поиск имени в таблице имен DLL.

  • При вызове по имени можно ускорить обращение, добавив слово Resident.

  • По индексу, это быстрее. Позиция в таблице выбирается сразу.

10.3.3. DLL комплексной арифметики       

Это иллюстративный пример. Подпрограммы такие же, как в ранее рассмотренном модуле комплексной арифметики. Их внешние имена такие же, а внутренние имена другие.

library DLL_Complex;                            // ЗаголовокDLL type                                            // Глобальный тип. Не экспортируется   TComplex =  record                         // Запись   Re, Im: real;                                  // Два поля – вещественные числа end; function CAdd(x,y: TComplex):TComplex; export;  // Экспортируемая функция сложения   begin     Result.Re:=x.Re + y.Re;     Result.Im:=x.Im + y.Im;   end;   // CAdd function SubC(x,y: TComplex):TComplex; export  // Экспортируемая функция вычитания   begin     Result.Re:=x.Re – y.Re;     Result.Im:=x.Im – y.Im;   end; // CSub function CMult(x,y: TComplex):TComplex; export // Экспортируемая функция умножения   begin     Result.Re:=x.Re*y.Re – x.Im*y.Im;     Result.Im:=x.Re*y.Im +  x.Im*y.Re;   end;   // CMult function CDiv(x,y: TComplex):TComplex; export  // Экспортируемая функция деления   var  z: Real;                         // Вспомогательная локальная переменная   begin     z:=sqr(y.Re)+sqr(y.Im);              // Расчет знаменателя     try                                  // Защита от краха при делении на ноль       Result.Re:=(x.Re*y.Re + x.Im*y.Im)/z;       Result.Im:=(x.Re*y.Im – x.Im*y.Re)/z;     except       Result.Re:=1.1e309;                // При делении на 0 ответ очень большой       Result.Im:=1.1.e309;     end;   end;   // CDiv end; exports   CAdd index 1 'AddC' resident,   CSub index 2,   CMult index 3,   CDiv index 4; begin end.

10.3.4. Доступ к объектам DLL       

Для создания DLL и ее использования нужно:

  1. New Командой Файл=>Новый =>Другое вызвать окно архива и выбрать в нем Мастер DLL. Заголовок Project1 по умолчанию.Комментарий напоминает о том, что при использовании длинных строк в список модулей, используемых в библиотеке и проекте в первой позиции должен быть модуль ShareMem.

  2. В редакторе кода занести код DLL.

  3. Сохранить DLL. В нашем примере с именем DLL_Complex.Pas.

  4. Откомпилировать модуль. Сделать откомпилированный модуль DLL доступным в вызывающей программе.

В коде вызывающей программы нужно:

  • Описание типов, используемых в DLL.

  • Добавить имена вызываемых процедур с указанием для каждой после директивы external имени DLL (в нашем примере 'DLL_Complex'). Если предполагается особый доступ к ПП, то нужно указать признаки, как в списках экспорта DLL.

  • Лучше создать для этого дополнительный модуль, описанный ниже (Complex1). Если  дополнительный модуль использован, то в вызывающей программу нужно в строке uses добавить ссылку на него.

unit Complex1; interface type   TComplex = record        // Описан тип, так как он не экспортируется из DLL     Re, Im: real;   end; function AddC(x,y:TComplex):TComplex; external 'DLL_Complex' index 1; function SubC(x,y:TComplex):TComplex; external 'DLL_Complex' index 2; function MultC(x,y:TComplex):TComplex; external 'DLL_Complex' index 3; function DivC(x,y:TComplex):TComplex; external 'DLL_Complex' index 4;

implementation

end.

Вызов функций по индексу. Имя не анализируется, поэтому допускается внешнее имя не такое, как в DLL.