关于DLL的 问题(100分)

  • 主题发起人 主题发起人 土拨鼠
  • 开始时间 开始时间

土拨鼠

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在做dll封装窗口时遇到一个怪问题。在dll窗口关闭时,原动态调用dll的主程序中主窗口会不显示,但程序也不报错。只要把主窗口最小化然后再打开窗口就显示了。不知道那位也 碰到 过这样的 问题。有没有解决的 办法!谢谢!
 
问题: DLL反回以后,主窗体看不见了是怎么回事? ( 积分: 50 )
分类: Windows API

来自: Killer1225, 时间: 2004-02-23 21:41:00, ID: 2468055
请问我在Delphi中动态的加载一个封装有一个窗体的DLL,该DLL返

回一个Integer型数据,当这个DLL返回以后,我的主窗体总是变地看

不见了,然后我把主窗体最小化后,再最大化就可以看见的,请问这个

问题如何解决.谢谢!

来自: wind28, 时间: 2004-02-23 21:45:31, ID: 2468064
没碰过,看看窗体属性有没有设成最小。

来自: dirk, 时间: 2004-02-23 22:35:43, ID: 2468151
是Application.Handle的问题,在dll中定义一个全局HWnd:
var
AppHwnd:HWnd;

把调用dll的Application传过去(FApp),并用AppHwnd记录下原Application的Handle:
AppHwnd:=Application.Handle;
然后把传过去的FApp.Handle赋给Application,
Application.Handle :=FApp.Handle ;
退出dll时再将Application.Handle 还原即可
Application.Handle :=AppHwnd ;

呵呵,写的这么罗嗦是因为我不知道怎么说。

来自: zxdcj, 时间: 2004-02-28 15:32:55, ID: 2475648
楼上说的对,我也遇见过,
因为DLL中的application对象与调用它的应用程序是分离的
为使DLL中的窗体成为真正成为应用程的窗体必须将应用程序的句柄传给DLL的Application.handle,

你可以给dll加一个HANDLE参数,用于接收当前程序的APPLICATION。HANDLE
你在调用DLL的窗体的时候一定要把当前application.handle传给DLL的application.handle

问题讨论没有结束 ...
 
应该是句柄传递造成的。
 
我的封装窗体文件如下
unit depWh;

interface

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

type
TDepWhFrm = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
DepWhFrm: TDepWhFrm;
procedure SynAPP(App:THandle);stdcall;
procedure ShowDepWhFrm;stdcall;

implementation
{$R *.dfm}
procedure SynAPP(App:THandle);stdcall;
begin
Application.Handle:=App;
end;

procedure ShowDepWhFrm;stdcall;
begin
try
DepWhFrm:=TDepWhFrm.Create(Application);
try
DepWhFrm.ShowModal;
finally
DepWhFrm.Free;
end;
except
on E:Exception do
Messagedlg('Error in DLLForm:'+
E.Message,mtError,[mbOK],0);
end;
end;

end.

DLL项目文件为
Library DLLDepWh32;
uses
Forms,
depWh in 'depWh.pas' {DepWhFrm};
exports
SynAPP,ShowDepWhFrm;
{$R *.res}

begin
end.
采用动态调用dll
type
TSynAPP=procedure(App:THandle);stdcall;
TShowDepWhFrm=procedure;stdcall;
。。。。。。
procedure TfrmMain.F14Click(Sender: TObject);
var handle:THandle;
FPointer:TFarProc;
proc1:TSynAPP;
proc2:TShowDepWhFrm;
begin
handle:=LoadLibrary('DLL/DLLDepWh32.DLL');
if handle<>0 then
try
FPointer:=GetProcAddress(handle,'SynAPP');
if FPointer<>nil then
begin
proc1:=TSynAPP(FPointer);
proc1(Application.Handle);
end;

FPointer:=GetProcAddress(handle,'ShowDepWhFrm');
if Fpointer<>nil then
begin
proc2:=TShowDepWhFrm(FPointer);
proc2;
end;
finally
FreeLibrary(handle);
end
else
showmessage('未找到动态链接库 DLL/DLLDepWh32.DLL');
end;
请高手帮忙看看问题出在哪里?
 
to weiliu
我的问题已经解决,你说的应该是对的,不过我只是把我代码中
proc1(Application.Handle);这句换成了
proc1(self.Handle);就可以了;想跟你探讨一下这是为什么?
 
好巧今天刚刚碰到这个问题,而且解决了。我是在DLL里的创建窗体时改了一下语句就可可以了
function chk_password(AppHandle:Thandle):SmallInt;stdcall;
var
Frm_password: TFrm_password;
begin
Result:=3;
Application.Handle:=AppHandle;
Application.CreateForm(TFrm_password,Frm_password);
{如果是用这句来创建窗口,在关闭后,则调用程序就会被隐藏,只有图标在任务栏上。
Frm_password:=TFrm_password.Create(Application);
}
// Frm_password.Hide;
Result:=Frm_password.ShowModal;
end;
 
后退
顶部