如何在主程序中关闭动态链接库中生成的窗口?(100分)

  • 主题发起人 主题发起人 alan stephen
  • 开始时间 开始时间
终于可以为这个问题划上句号了,以前没想过,也没做过。谢谢你。alan stephen, 让我又学
到了新的东东,你请等等,我在找一个可以上传的服务器把它上传上来。
 
To:kingdeezj
你要谢谢谁?
 
这么多的包我的机器上不一定有呀?
 
加上包之后很多申明了的函数都用不了了
 
to onlyonekgx:你给我的例子中如果不把screen传进动态链接库那么就不能关闭,但是在这
个例子中也是传入了screen却不会出现我所碰到的'cannot assign a TFont to a TFont'
错误,为什么?
 
本来说上传的,但没找到服务器,不知道哪位老兄告知一二。
TO alan stephen:
请试试如下代码:
procedure TForm1.closeClick(Sender: TObject);
var
i:integer;
hCurrentWindow: HWnd;
szText: array[0..254] of char;
begin
if Edit1.Text<>'' then begin
hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);
i:=hCurrentWindow;
While hCurrentWindow <> 0 Do
Begin
If GetWindowText(hCurrentWindow, @szText, 255) > 0 Then begin
if Strpas(@szText)=Edit1.Text then
postmessage(hCurrentWindow,WM_SYSCOMMAND,SC_CLOSE,0);
end;
hCurrentWindow := GetNextWindow(hCurrentWindow, GW_HWNDNEXT);
End;
end;
end;
 
to kingdeezj:现在的问题是如何将screen传入动态链接库中?以前我只传入application和
session都没有问题,但是现在再把screen传入的时候就出错,代码如下:
procedure PRA_InitEnvironment(SendSession: TSession;
SendApplication: TApplication; SendDatabaseName: string;
SendScreen: TScreen); stdcall; // 传送session和Application
begin
OldApplication := Application;
OldSession := Session;
OldScreen := Screen;

dmDll := TdmDll.Create(Application);
frmProcess := TfrmProcess.Create(Application);
Session := SendSession;
Application := SendApplication;
Screen := SendScreen;
end;
 
我的代码已经可以做到关闭DLL引出的窗口啊,你把SCANREEN导入干嘛?
 
不仅可以关闭DLL窗口,而且可以关闭所有程序的窗口。只要你保证窗体标题正确。你试过
了没有?
 
问题是我打开的多个mdi子窗体都是同一个标题?
 
看来我得和你一样做一个为子窗体的DLL了:(
 
我的例子之所以不会出现那种错误,
是因为我里面用到的包少!
 
procedure PRA_InitEnvironment(SendSession: TSession;
SendApplication: TApplication; SendDatabaseName: string;
SendScreen: TScreen); stdcall; // 传送session和Application
begin
OldApplication := Application;
OldSession := Session;
OldScreen := Screen;


Session := SendSession;
Application := SendApplication;
Screen := SendScreen;


dmDll := TdmDll.Create(Application);
frmProcess := TfrmProcess.Create(Application);
end;
 
http://vcl.vclxx.org/DELPHI/D32SAMPL/MDIDLL.ZIP
刚才找到深度历险中的一篇源码,大伙儿先看看再说。
 
to onlyonekgx:调换顺序后还是会出现错误,并且在程序退出的时候会出现内存读取的错误
 
你说的问题都是我以前遇到的,
而且都已经解决,就是用我告诉你的方法。
如果你的问题还是不能解决,
只能把源码发过来我帮你调试一下看看!

出现内存读取的错误,是不是因为你在卸载DLL时没有写:
Application:=OldApplication ;
Session:= OldSession ;
Screen := OldScreen;

 
to onlyonekgx:源代码已经发过去
 
你发给我的程序运行不起来,所以无法调试。我初步看了一下你的EditDate.dpr
里的代码,总体感觉写得比较乱,而且里面用了一些第三方控件,而我的机子上没装
我猜想你应该把所有可能用的包都加进去,包括第三方控件的包。

出现内存读取的错误,应该是你在卸载DLL时没有写:
Application:=OldApplication ;
Session:= OldSession ;
Screen := OldScreen;


由于无法运行所以无法进行跟踪调试,抱歉
 
谢谢各位的帮助
 
多人接受答案了。
 
后退
顶部