Главная » Delphi » Применение DLL с совместно используемой памятью

0

Для иллюстрации применения DLL с совместно используемой памятью было созда но два работающих с ней приложения. Первое приложение (проект App1.dpr) позво ляет   модифицировать  глобальные  данные    библиотеки  DLL.   Второе  приложение (проект App2.dpr) обращается к этим  данным  и периодически обновляет два компо нента  TLabel, используя для этого  компонент TTimer. При  запуске обоих  приложений можно  увидеть  последствия совместного доступа  к данным  библиотеки DLL, т.е. окно приложения App2 будет отображать изменения, внесенные в окне приложения App1.

В листинге 6.13 содержится исходный код проекта App1.

Листинг 6.13. Главная форма приложения  App1.dpr

unit MainFrmA1;

interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls, ExtCtrls, Mask;

{$I DLLDATA.INC}

type

TMainForm = class(TForm)edtGlobDataStr: TEdit; btnGetDllData: TButton; meGlobDataInt: TMaskEdit;

procedure btnGetDllDataClick(Sender: TObject); procedure edtGlobDataStrChange(Sender: TObject); procedure meGlobDataIntChange(Sender: TObject); procedure FormCreate(Sender: TObject);

public

GlobalData: PGlobalDLLData;

end;

var

MainForm: TMainForm;

{ Определение экспортируемой процедуры библиотеки DLL }

procedure GetDLLData(var AGlobalData: PGlobalDLLData);

StdCall External ‘SHARELIB.DLL';

implementation

{$R *.DFM}

procedure TMainForm.btnGetDllDataClick(Sender: TObject);

begin

{ Получить указатель на данные библиотеки DLL }

GetDLLData(GlobalData);

{ Обновление элементов управления для отражения

значений полей GlobalData. }

edtGlobDataStr.Text := GlobalData^.S;

meGlobDataInt.Text      := IntToStr(GlobalData^.I);

end;

procedure TMainForm.edtGlobDataStrChange(Sender: TObject);

begin

{ Обновление данных библиотеки DLL в соответствии с внесенными

изменениями. }

GlobalData^.S := edtGlobDataStr.Text;

end;

procedure TMainForm.meGlobDataIntChange(Sender: TObject);

begin

{ Обновление данных библиотеки DLL в соответствии с внесенными

изменениями. }

if meGlobDataInt.Text = EmptyStr then

meGlobDataInt.Text := ‘0’;

GlobalData^.I := StrToInt(meGlobDataInt.Text);

end;

procedure TMainForm.FormCreate(Sender: TObject);

begin

btnGetDllDataClick(nil);

end;

end.В состав  этого  приложения также  входит  подключаемый файл  DllData.inc, в кото ром определен тип данных  TGlobalDLLData и указатель  на эти данные. Обработчик со бытия btnGetDllDataClick() с помощью вызова  функции GetDLLData() получает ука затель  на глобальные данные библиотеки DLL, доступ к которым возможен с помощью отображенного в память  файла, принадлежащего библиотеке. Затем, используя значение этого  указателя  GlobalData, выполняется обновление элементов управления формы. Обработчики события OnChange для полей  ввода изменяют значение области памяти, на которую  указывает  переменная GlobalData. Поскольку указатель GlobalData ссылается на глобальные данные  библиотеки DLL, модификации подвергаются те данные, на кото рые ссылается отображенный в память файл, созданный библиотекой DLL.

В листинге 6.14 представлен исходный код главной формы приложения App2.dpr.

Листинг 6.14. Главная форма приложения  App2.dpr

unit MainFrmA2;

interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls;

{$I DLLDATA.INC}

type

TMainForm = class(TForm) lblGlobDataStr: TLabel; tmTimer: TTimer; lblGlobDataInt: TLabel;

procedure tmTimerTimer(Sender: TObject);

public

GlobalData: PGlobalDLLData;

end;

{ Определение экспортируемой процедуры библиотеки DLL }

procedure GetDLLData(var AGlobalData:

PGlobalDLLData); StdCall External ‘SHARELIB.DLL';

var

MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.tmTimerTimer(Sender: TObject);

begin

GetDllData(GlobalData);      // Получить доступ к данным

{ Представление содержимого полей GlobalData. }

lblGlobDataStr.Caption := GlobalData^.S;lblGlobDataInt.Caption := IntToStr(GlobalData^.I);

end;

end.

Эта форма содержит два компонента TLabel, которые обновляются во время  об работки события OnTimer объекта tmTimer. Если  пользователь изменит значения глобальных данных  библиотеки DLL в приложения App1, приложение App2 отобра зит эти изменения.

Оба приложения можно запустить и поработать с ними. Они содержаться на при

лагаемом компакт диске (см. также www.williamspublishing.com).

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

По теме:

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