Пример 13.2.

Повторить задание 1, реализовав модуль в виде DLL Complex2. Проект – приложение.

  1. Командой Файл=>Создать вызываем окно выбора и выбираем в нем Library (для Windows это DLL). Получаем в окне Редактора кода страницу шаблона DLL с именем Project1.
  2. В редакторе кода заносим в нее код DLL. Подпрограммы те же, что в модуле Complex задания 1. Секция begin…end – пустая.
  3. Сохраним DLL с именем Complex2.lpr.
  4. Компилируем DLL.  Итог Complex2.dll.
  5. Так как DLL не экспортирует типов, то создаем вспомогательный модуль Complex1, содержащий только интерфейсную часть с описанием типа TComplex и имен вызываемых подпрограмм DLL. Сохраняем его под именем Complex1.
  6. Командой Файл=>Создать вызываем окно выбора и выбираем в нем Приложение, чтобы создать проект вызывающей программы. Форму делаем аналогичной заданию 1.
  7. В коде модуля формы вызывающей программы добавляем:
  • В строку uses ссылку на модуль Complex1.
  • В раздел var переменные a, b, c, d типа real, Comp1, Comp2, Comp3 типа TComplex.
  1. Создаем обработчики нажатия кнопок.
  2. Сохраняем проект под именем 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 – динамически связываемая библиотека. Подключается только при вызове ее подпрограмм.
TwitterSEO CommunityВаау!News2.ruChippKoricaSMI2Google BookmarksDiggI.uaЗакладки YandexLinkstoreMyscoopCommunizmRu-marksWebmarksRuspaceLinkomaticKli.kzWeb-zakladkaZakladok.netRedditdeliciousMa.gnoliaTechnoratiSlashdotYahoo My WebБобрДобр.ruMemori.rurucity.comМоёМесто.ruMister Wong



Copyright © 2009-2010 Программирование на паскале.