Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];
ВнизВызов немодальной формы из DLL. Найти похожие ветки
← →
Maverick © (2005-09-08 17:53) [0]Вызываю немодальную форму из 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;
← →
Игорь Шевченко © (2005-09-08 17:59) [1]
> выдается ошибка "Недопустимый дескриптор окна"
В каком месте ?
← →
Maverick © (2005-09-08 18:10) [2]что то под вечер я уже туплю :)
ошибка выскакивает на строчке
ShowForm(Application.Handle, self.Handle);
главного приложения, запустив дебагер в dll - ShowForm даже не выполняется.
← →
Игорь Шевченко © (2005-09-08 18:12) [3]
> if Addr(ShowForm) <> nil then
if Assigned(ShowForm) then
← →
Maverick © (2005-09-08 18:18) [4]не помогло :(
← →
Игорь Шевченко © (2005-09-08 18:20) [5]
> procedure ShowForm(Appl, Form: THandle); stdcall;
А тип TShowForm в основном приложении как объявлен ?
← →
Maverick © (2005-09-08 18:22) [6]вот так :
type
TShowForm = procedure (Appl, Form: THandle);
← →
Maverick © (2005-09-08 18:25) [7]но ведь если я dll-ку гружу статически то все ок, ни каких ошибок
← →
jack128 © (2005-09-08 18:27) [8]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 не надо долго перед компьютером сидеть, а то уже совсем зрение посадил..
← →
Игорь Шевченко © (2005-09-08 18:28) [9]Maverick © (08.09.05 18:22) [6]
type
TShowForm = procedure (Appl, Form: THandle); stdcall;
← →
isasa © (2005-09-08 18:30) [10]Недавно был предмет спора, что есть Application в DLL?
...
Application.Handle:= Appl;
fMain:= TfMain.Create(Application);
.....
может так...
fMain:= TfMain.Create(nil);
...
все равно руками закрываем форму.
← →
Maverick © (2005-09-08 18:31) [11]:))
да, спасибо большое:))
действительно вредно сидеть долго перед компом.
← →
Игорь Шевченко © (2005-09-08 18:31) [12]
> Недавно был предмет спора, что есть Application в DLL?
Спорить не о чем.
← →
Maverick © (2005-09-08 18:33) [13]isasa © (08.09.05 18:30) [10]
согласен
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c