从主程序exe中调用dll中的form,调用成功但free form之后,主程序隐藏(100分)

  • 主题发起人 主题发起人 goodshilei
  • 开始时间 开始时间
G

goodshilei

Unregistered / Unconfirmed
GUEST, unregistred user!
从主程序exe中调用dll中的form,调用成功但free form之后,主程序被隐藏。我在主程序
中用的是dll的动态联编,如果不Freelibrary则一切正常,但是如果freelibrary则程序
主exe被隐藏,即使在Freelibrary之后对主程序窗体show一下也无法使其显示,不知那位
大仙能够给我解答一下,thanks!
 
请把dll中 showform 和主程序中调用 dll 函数的代码贴出来。
 
你是不是在DLL中用了Application.Handle:=XXX这样的句子,如果将Application.Handle
设为主程序的Handle就会出现这个问题,不过你如果将主程序最小化一下好象又会出来了
吧。
 
我也遇到类似情况,dll中的form上只放了一个button,按下button后form1.close
主窗体中调用dll中form时,按下button后则主程序就不见了,不知什么原因,
哪位解释一下
 
在DLL中窗体建立之间先将应用程序的HANDLE保存到一个变量中,FREE窗体时再将其返回给
应用程序即可。
 
Redberet大侠,我的Dll调用如下
procedure TMainForm.FormCreate(Sender: TObject);
var
Handle: THandle;
AppHandle:THandle;
passwd:function(AppWnd:LongInt;table:TClientDataSet):boolean
begin
mainform.Visible:=false;
Handle := LoadLibrary('Extra/Extra.dll');
if Handle <> 0 then
begin
@passwd := GetProcAddress(Handle, 'login');
if @passwd <> nil then
begin
AppHandle:=Application.Handle;
if passwd(application.handle,(datamodule1.passwdtable)) then
begin
mainform.Visible:=true;
try
Application.Handle:=AppHandle;
FreeLibrary(Handle);
except
showmessage('library unloaded failed!');
end;
end
else
begin
try
FreeLibrary(Handle);
Application.Handle:=AppHandle;
except
showmessage('library unloaded failed!');
end;
free;
end;

end;
end
else showmessage('cannot load library');
end;
这样将Handle保存并返回应该可以吧,可不管加不加如下两行都一样
AppHandle:=Application.Handle;
Application.Handle:=AppHandle;
有趣的是,如果去掉Freelibrary(Handle)那么问题就解决了,而且在以后的程序代码中
再调用动态Dll也不会出现任何问题,可加上这一句以后每一次调用Dll中的Form都会隐藏
主窗体,我是在nt workstation 4。0 Delphi 5下调试的,谢谢帮忙诊治
 
关键是 Application 包含着一个隐藏的窗口,Handle 就是这窗口的句柄,而主 exe 和
Dll 中各有一个 Application 对象变量,你 Dll 中的函数将 dll 中的那一份 Application
的 Handle 设为与主 exe 中的一样了,那么 FreeLibrary 时,dll 中的 Application 会
被 Free 掉,而 Application 的 Destroy 方法中会调用 DestroyWnidow(Handle), 这就
把主 exe 的 Application 所创建的隐藏窗口给销毁掉了。
因此,设置 dll 中 Application 的 Handle 时必须先保存它原先的 Handle 值,Dll 被卸载
要将 Application 的 Handle 还原才行。你可以看看 ID 为 540766 的帖子,讨论谈到了
这个问题,有例子的。
 
看看我以前回答的问题吧
 
不应该在主程序中保存HANDLE,应该在DLL中创建窗体之前保存HANDLE,代码如下:

OldApplication.Handle := Application.Handle;
Application.Handle := AHandle;
AboutForm := TAboutForm.Create(Application);
try
AboutForm.Caption := Caption;
AboutForm.fcLabel1.Caption := Caption;
AboutForm.ShowModal;
finally
AboutForm.Free;
Application.Handle := OldApplication.Handle; //将句柄返回给应用程序。
end;
 
感谢RedBeret问题解决了!
 
后退
顶部