Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Закрытие окна згружаемого из dll


Kostafey ©   (2006-10-14 22:52:00) 

Прошу помощи в следующем вопросе.
Необходимо разработать dll которая будет использовать свои окна, при этом закрывая эти окна не должно закрываться окно основного приложения.
Это текст dll (за основу взял пример с вычислением сумммы)

library DLL_WinForm;
uses
 SysUtils,
 Classes,
 Forms,
 Unit1 in 'Unit1.pas' {FormDll};

{$R *.res}

/////////////////////////////////////////
function getSum(const n1: integer; const n2: integer): integer;
begin
 Result := n1 + n2;
 Application.CreateForm(TFormDll, FormDll);
 FormDll.Show;
end;

/////////////////////////////////////////
exports
 getSum;

begin
end.

В Unit1 (окно, вызываемое из dll) изменений нет - пустое окно.

Код формы приложения, вызывающего dll:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Unit2;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Label1: TLabel;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
   hModule: THandle;
   // объявляем переменную типа "указатель на функцию"
   pGetSum: function(const n1, n2: integer): integer;
   n: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   hModule := LoadLibrary('DLL_WinForm.dll');
   assert(hModule <> 0, 'Can''t load DLL!');

   pGetSum := GetProcAddress(hModule, 'getSum');
   assert(@pGetSum <> nil, 'Can''t find the getSum function!');
   n := pGetSum(10, 20);
   Label1.Caption:='n = '+ inttostr(n);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if (hModule<>0) then
 begin
   FreeLibrary(hModule);
   hModule:=0;
 end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if (hModule<>0) then
 begin
  FreeLibrary(hModule);
  CanClose:=false;
  hModule:=0;
end;
end;

end.
На форме 2 кнопки:
Button1 - запускает dll и отображается окно (из dll)
Button2 - выгружает dll (окошко благополучно закрывается, но приложение продолжает работать)
А если щелкнуть по кнопке (X) закрытия окна dll, то происходит закрытие не только окна dll, но и окна самого приложения.

ВОПРОС: как сделать так чтобы при закрытии dll-окна проложение бы не закрывалось.


Leonid Troyanovsky   (2006-10-15 10:04:00) [1]


> vain ©   (14.10.06 23:18) [1]

> Я тебе на мыло скинул пример к книге Фаронова по работе
> с dll с формами. Я думаю,


И мне скинь, плиз, lv.t@rambler.ru
Или, если он невелик, то сюда.

--
Regards, LVT.


Kostafey   (2006-10-14 23:24:00) [2]

> [1] vain ©   (14.10.06 23:18)

Спасибо огромное, похоже это то что нужно !


vain   (2006-10-14 23:18:00) [3]

Я тебе на мыло скинул пример к книге Фаронова по работе с dll с формами. Я думаю, разобраться сможешь.


Наверх

Титульная страница Поиск, карта сайта Написать письмо