Содержание материала

Code:

library DllForms;

 

uses

SysUtils,

Classes,

Forms,

DllFormUnit in 'DllFormUnit.pas' {DllForm};

 

{$R *.RES}

 

function ShowForm : Integer; stdcall;

var

Form : TDLLForm;

begin

Form := TDLLForm.Create(Application);

Result := Form.ShowModal;

Form.Free;

end;

 

begin

end.

 

Code:

unit TestAppUnit;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

private

   { Private declarations }

public

   { Public declarations }

end;

var

Form1: TForm1;

function ShowForm : Integer; stdcall;

external 'dllforms.dll';

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowForm;

end;

end.

 

 

Прошу заметить, что при экспорте функции также было использовано ключевое слово stdcall.

 

Следует обратить особое внимание на работу с дочерними формами в DLL. Если, к примеру,

в вызывающем приложении главная форма имеет значение свойства FormStyle, равным MDIForm,

то при попытке вызова из DLL MDIChild-формы, на экране появится сообщение об ошибке,

в котором будет говориться, что нет ни одной активной MDI-формы.

 

В тот момент, когда вы пытаетесь показать ваше дочернее окно, VCL проверяет корректность

свойства FormStyle главной формы приложения. Однако в нашем случае все вроде бы верно.

Так в чем же дело? Проблема в том, что при проведении такой проверки, рассматривается объект Application,

принадлежащий не вызывающему приложению, а собственно динамической библиотеке.

Ну, и естественно, поскольку в DLL нет главной формы, проверка выдает ошибку.

Для того чтобы избежать такой ситуации, надо назначить объекту Application динамической библиотеки

объект Application вызывающего приложения. Естественно, это заработает только в том случае,

когда вызывающая программа - VCL-приложение. Кроме того, перед выгрузкой библиотеки из памяти

необходимо вернуть значение объекта Application библиотеки в первоначальное состояние.

Это позволит менеджеру памяти очистить оперативную память, занимаемую библиотекой.

Следовательно, вам нужно сохранить указатель на «родной» для библиотеки объект Application

в глобальной переменной, которая может быть использована при восстановлении его значения.

 

Итак, вернемся немного назад и перечислим шаги, необходимые нам для работы с помещенным

в DLL MDIChild-формами.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить