Главная » Delphi » Экспорт функций из пакетов

0

Исходя  из того,  что пакет можно  рассматривать как улучшенную разновидность биб лиотеки DLL, справедливо предположить, что  существует  возможность экспорта про цедур и функций из пакетов, точно так же как и из DLL. Так и есть, эта возможность су ществует. В настоящем разделе описано, как использовать пакеты подобным образом.

Загрузка формы из функции, расположенной в пакете

Листинг 14.3 представляет собой модуль, содержащийся внутри пакета. Листинг 14.3. Модуль пакета с двумя экспортируемыми функциями unit FunkFrm;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

type

TFunkForm = class(TForm)

Label1: TLabel;

Button1: TButton;

private

{ Закрытые объявления }

public

{ Открытые объявления }

end;

// Объявление функции пакета в соответствии с

// соглашением о вызовах StdCall

procedure FunkForm; stdcall;

function AddEm(Op1, Op2: Integer): Integer; stdcall;

// Экспорт функций. exports

FunkForm, AddEm;

implementation

{$R *.dfm}

procedure FunkForm;

var

FunkForm: TFunkForm;

begin

FunkForm := TFunkForm.Create(Application);

try

FunkForm.ShowModal;

finally

FunkForm.Free;

end;

end;function AddEm(Op1, Op2: Integer): Integer;

begin

Result := Op1+Op2;

end;

end.Процедура  FunkForm() просто  отображает  объявленную в  модуле  модальную форму,  и ничего более.  Функция  AdEm() получает  два операнда и возвращают их сум му. Обратите внимание, что функции объявлены в разделе интерфейса модуля в соот ветствии с соглашением о вызовах StdCall.

Листинг 14.4  содержит  исходный  код   приложения,  демонстрирующего вызов функций из пакета.

Листинг 14.4. Пример приложения

unit MainFrm;

interface uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, Mask;

const

cFunkForm = ‘FunkForm';

cAddEm         = ‘AddEm';

type

TForm1 = class(TForm)

btnPkgForm: TButton;

meOp1: TMaskEdit;

meOp2: TMaskEdit;

btnAdd: TButton;

lblPlus: TLabel;

lblEquals: TLabel;

lblResult: TLabel;

procedure btnAddClick(Sender: TObject);

procedure btnPkgFormClick(Sender: TObject);

private

{ Закрытые объявления }

public

{ Открытые объявления }

end;

// Определение сигнатур методов

TAddEmProc = function(Op1, Op2: Integer): integer; stdcall;

TFunkFormProc = procedure; stdcall;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnAddClick(Sender: TObject);

var

PackageModule: THandle;

AddEmProc: TAddEmProc;

Rslt: Integer;

Op1, Op2: integer;

begin

PackageModule := LoadPackage(‘ddgPackFunk.bpl’);

try

@AddEmProc := GetProcAddress(PackageModule, PChar(cAddEm));

if not (@AddEmProc = nil) then begin

Op1 := StrToInt(meOp1.Text);

Op2 := StrToInt(meOp2.Text);

Rslt := AddEmProc(Op1, Op2);

lblResult.Caption := IntToStr(Rslt);

end;

finally

UnloadPackage(PackageModule);

end;

end;

procedure TForm1.btnPkgFormClick(Sender: TObject);

var

PackageModule: THandle;

FunkFormProc: TFunkFormProc;

begin

PackageModule := LoadPackage(‘ddgPackFunk.bpl’);

try

@FunkFormProc := GetProcAddress(PackageModule,

PChar(cFunkForm));

if not (@FunkFormProc = nil) then

FunkFormProc;

finally

UnloadPackage(PackageModule);

end;

end;

end.Обратите внимание: вначале необходимо объявить два процедурных типа,  TAd- dEmProc и TFunkFormProc. Они объявлены точно так же, как и в пакете.

Обсудим  сначала  обработчик события btnPkgFormClick(). Подобный код  уже обсуждался  в главе  6, “Динамически компонуемые библиотеки”, но  здесь  вместо  об ращения  к  функции  LoadLibrary() используется   LoadPackage().  Фактически LoadPackage() завершается вызовом LoadLibrary(). Затем  с помощью функции GetProcAddress() получаем  ссылку на процедуру.  Более  подробная информация обэтой  функции  приведена  в  главе  6,  “Динамически  компонуемые  библиотеки”.  Кон

станта cFunkForm содержит имя функции в пакете.

Как можно заметить, способ экспорта функций и процедур из пакетов почти точно

такой же, как и при экспорте из динамических библиотек.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии