
Снежинкам / Dll
.odtПримеры оформления фразы 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 и ее использования нужно:
-
New Командой Файл=>Новый =>Другое вызвать окно архива и выбрать в нем Мастер DLL.
Заголовок Project1 по умолчанию.Комментарий напоминает о том, что при использовании длинных строк в список модулей, используемых в библиотеке и проекте в первой позиции должен быть модуль ShareMem.
-
В редакторе кода занести код DLL.
-
Сохранить DLL. В нашем примере с именем DLL_Complex.Pas.
-
Откомпилировать модуль. Сделать откомпилированный модуль 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.