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

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

Вызов немодальной формы из DLL. [D7, WinXP]


Maverick ©   (2005-09-08 17:53:00) 

Вызываю немодальную форму из DLL. Если dll загружается статически то все ок. а вот с динамической загрузкой возникли проблемы :( . При вызове формы из главного приложения выдается ошибка "Недопустимый дескриптор окна"

Привожу код :

library FormInDll;
uses
 SysUtils,
 Classes,
 Unit1 in 'Unit1.pas' {fMain};

{$R *.res}
exports
 ShowModalForm, ShowForm, FreeForm;
begin
end.

Форма в DLL:
unit Unit1;
interface

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

type
 TfMain = class(TForm)
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
 public
 end;

 procedure ShowForm(Appl, Form: THandle); stdcall;
 procedure FreeForm; stdcall;

var
 fMain: TfMain;
 CallForm: THandle; //Дескриптор вызывающей формы

implementation
{$R *.dfm}

procedure ShowForm(Appl, Form: THandle); stdcall;
begin
 Application.Handle:= Appl;
 fMain:= TfMain.Create(Application);
 CallForm:= Form;
 fMain.Show;
end;

procedure FreeForm; stdcall;
begin
 fMain.Free;
end;

procedure TfMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if CallForm <> 0 then
   SendMessage(CallForm, wm_User, 0, 0)
end;
end.

Вызов формы из главного приложения осуществляется так:

procedure TForm1.Button4Click(Sender: TObject);
var
 ShowForm : TShowForm;
 hndDLLHandle: THandle;
begin
 try
   hndDLLHandle := loadLibrary ( 'FormInDll.dll' );
   if hndDLLHandle <> 0 then
   begin
     @ShowForm := getProcAddress ( hndDLLHandle, 'ShowForm' );
     if Addr(ShowForm) <> nil then
     begin
       ShowForm(Application.Handle, self.Handle);
     end
     else
       showMessage ( 'Function not exists...' );
   end
   else
     showMessage ( 'DLL not found...' );
 finally
   freeLibrary ( hndDLLHandle );
 end;
end;


Maverick   (2005-09-08 18:33:00) [1]

isasa ©   (08.09.05 18:30) [10]

согласен


Maverick   (2005-09-08 18:31:00) [2]

:))
да, спасибо большое:))
действительно вредно сидеть долго перед компом.


Игорь Шевченко   (2005-09-08 18:31:00) [3]


> Недавно был предмет спора, что есть Application в DLL?


Спорить не о чем.


isasa   (2005-09-08 18:30:00) [4]

Недавно был предмет спора, что есть Application в DLL?
...
Application.Handle:= Appl;
fMain:= TfMain.Create(Application);
.....


может так
...
fMain:= TfMain.Create(nil);
...

все равно руками закрываем форму.


Игорь Шевченко   (2005-09-08 18:28:00) [5]

Maverick ©   (08.09.05 18:22) [6]

type
TShowForm = procedure (Appl, Form: THandle); stdcall;


jack128   (2005-09-08 18:27:00) [6]

Maverick ©   (08.09.05 18:22) [6]
TShowForm = procedure (Appl, Form: THandle);

Maverick ©   (08.09.05 17:53)
procedure ShowForm(Appl, Form: THandle); stdcall;


ps не надо долго перед компьютером сидеть, а то уже совсем зрение посадил..


Maverick   (2005-09-08 18:25:00) [7]

но ведь если я dll-ку гружу статически то все ок, ни каких ошибок


Maverick   (2005-09-08 18:22:00) [8]

вот так :

type
 TShowForm = procedure (Appl, Form: THandle);


Игорь Шевченко   (2005-09-08 18:20:00) [9]


>  procedure ShowForm(Appl, Form: THandle); stdcall;


А тип TShowForm в основном приложении как объявлен ?


Maverick   (2005-09-08 18:18:00) [10]

не помогло :(


Игорь Шевченко   (2005-09-08 18:12:00) [11]


>  if Addr(ShowForm) <> nil then


if Assigned(ShowForm) then


Maverick   (2005-09-08 18:10:00) [12]

что то под вечер я уже туплю :)
ошибка выскакивает на строчке
ShowForm(Application.Handle, self.Handle);
главного приложения, запустив дебагер в dll - ShowForm даже не выполняется.


Игорь Шевченко   (2005-09-08 17:59:00) [13]


> выдается ошибка "Недопустимый дескриптор окна"


В каком месте ?


Наверх

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