Пример 13.2.
Повторить задание 1, реализовав модуль в виде DLL Complex2. Проект – приложение.
- Командой Файл=>Создать вызываем окно выбора и выбираем в нем Library (для Windows это DLL). Получаем в окне Редактора кода страницу шаблона DLL с именем Project1.
- В редакторе кода заносим в нее код DLL. Подпрограммы те же, что в модуле Complex задания 1. Секция begin…end – пустая.
- Сохраним DLL с именем Complex2.lpr.
- Компилируем DLL. Итог Complex2.dll.
- Так как DLL не экспортирует типов, то создаем вспомогательный модуль Complex1, содержащий только интерфейсную часть с описанием типа TComplex и имен вызываемых подпрограмм DLL. Сохраняем его под именем Complex1.
- Командой Файл=>Создать вызываем окно выбора и выбираем в нем Приложение, чтобы создать проект вызывающей программы. Форму делаем аналогичной заданию 1.
- В коде модуля формы вызывающей программы добавляем:
- В строку uses ссылку на модуль Complex1.
- В раздел var переменные a, b, c, d типа real, Comp1, Comp2, Comp3 типа TComplex.
- Создаем обработчики нажатия кнопок.
- Сохраняем проект под именем Prg_11_2.
Листинг DLL Complex2
library complex2;
{$mode objfpc}{$H+}
uses
Classes
{ you can add units after this };
type
TComplex = record // Тип комплексного числа
Re, Im: Real
end;
function CAdd(x,y: TComplex):TComplex;
begin
Result.Re:=x.Re + y.Re;
Result.Im:=x.Im + y.Im;
end;
function CSub(x,y: TComplex):TComplex;
begin
Result.Re:=x.Re – y.Re;
Result.Im:=x.Im – y.Im;
end; //CSub
function CMult(x,y: TComplex):TComplex;
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;
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 // Если делитель 0, результат .
Result.Re:=1.1e309;
Result.Im:=1.1e309
end;
end; {CDiv}
exports //Список экспорта
CAdd index 1 name ‘AddC’ resident,
CSub index 2 name ‘SubC’,
CMult index 3 name ‘MultC’,
CDiv index 4 name ‘DivC’;
begin
end.
Листинг модуля Complex1
unit complex1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
Type
TComplex = Record // Тип комплексного числа
Re, Im: Real
End;
Function AddC(x,y:TComplex):TComplex;External ‘Complex2′; //Компл. сложение
Function SubC(x,y:TComplex):TComplex;External ‘Complex2′; // Комп. вычитание
Function MultC(x,y:TComplex):TComplex;External ‘Complex2′; // Комп. умножение
Function DivC(x,y: TComplex):TComplex; External ‘Complex2′; //Комп. деление
implementation
end.
Листинг модуля формы вызывающей программы
Такой же, как в задании 1, только в строке uses ссылка на модуль Complex заменена на Complex1. В этом модуле устанавливается связь с DLL. Результат прогона программы такой же, как в задании 1.
Выводы
- Для работы с часто используемыми подпрограммами применяются модули.
- Модуль – это набор готовых подпрограмм, хранящихся в компилированном виде.
- Модуль связывается с вызывающей программой при компоновке.
- DLL – динамически связываемая библиотека. Подключается только при вызове ее подпрограмм.