![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов немодальной формы из 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]
> выдается ошибка "Недопустимый дескриптор окна"
В каком месте ?