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

  • 主题发起人 主题发起人 alan stephen
  • 开始时间 开始时间
A

alan stephen

Unregistered / Unconfirmed
GUEST, unregistred user!
我在主程序中调用了一个动态链接库中的函数来生成一个窗口并显示出来,但是我想在主
程序中通过写代码来关闭这个窗口,请问应该怎么写?
 
提供一个思路给你:
可以在DLL的窗体中写一个导出函数来得到窗体的句柄,
然后再这样SendMessage(GetFormHandle,WM_Close,0,0);
注:
GetFormHandle为DLL中窗体的句柄导出函数

如果要例子留下你的EMAIL
 
onlyonekgx,你好,谢谢你能帮我解答,我采用了下面这种方法:
for i := Screen.FormCount - 1 downto 0 do
if Screen.Forms.Handle <> Application.MainForm.Handle then
SendMessage(Screen.Forms.Handle,WM_Close,0,0);
但是还是不能关闭动态链接库生成的窗口,难道通过Screen.Forms.Handle得到的句柄
是无效的?但是实际上是有值的,难道一定要通过动态链接库的导出函数得到的句柄才有效?
希望你能帮我解答:)我的email是xubinworld@263.net
 
呵呵,给你的DLL窗体加上标题,就可以发送消息关闭它了。
var
hwndwindow:hwnd;
begin
hwndwindow:=findwindow(nil,'DLL窗体名字');
if hwndwindow<>0 then
postmessage(hwndwindow,WM_SYSCOMMAND,SC_CLOSE,0);
 
不用那么麻烦吧,我感觉就在动态链接库中导出一个 关闭的方法 不就都行了。
 
你可以这样:
For I:=0 To Application.MainForm.MDIChildCount-1 do
Application.MainForm.MDIChildren.Close;
注:
从主程序向DLL传参数时有两个参数是必须的:Application,Screen
如果只传了Application而没有传Screen,
则Application.MainForm.MDIChildCount 的值将始终为0
 
SendMessage(‘DLL 中窗体的句柄’,WM_Close,0,0);
 
例子已经发出,
请查收!!!!
 
我上面说的是针对MDICHILD窗体。
对于你用的方法我试了可以实现(对非MDICHILD窗体),可能是你没有把主程序的Screen
参数传给DLL.
 
做一个过程好,带参数,可以关好多个。
 
我在动态链接库中就是生成mdichild,但是当我把screen传过去以后会出现错误,说什么
不能从一种字体转为另一种字体?既然生成的是mdi子窗体,那么就可以同时打开多个窗体,
这时候要一个一个地关闭窗体就只能通过
For I:=0 To Application.MainForm.MDIChildCount-1 do
Application.MainForm.MDIChildren.Close;
或者
for i := Screen.FormCount - 1 downto 0 do
if Screen.Forms.Handle <> Application.MainForm.Handle then
SendMessage(Screen.Forms.Handle,WM_Close,0,0);
但是都没有效果????????
 
以上你说的两种方法我都试了,
完全可以实现!
我发给你的例子中就实现了!
 
如果把screen传进动态连接库中,以上两种方法确实可以实现,但是当我把screen传进动态
链接库后,出现一个错误提示,我不知道如何解决?'cannot assign a TFont to a TFont'???
 
如果你用的是Delphi5(因为我用的就是Delphi5)
请单击菜单:
project->options|packages|Runtime Packages

中加入
Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;
Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;
Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;
dclocx50;dclaxserver50;dbx50;dcl31w50;dclado50;dclbde50;
dcldb50;dcldss50;dclib50;dclie50;dclisp50;dclmid50;dclnet50;
dclnmf50;dcloffice2k50;dclqrt50;dclsmp50;dclstd50;dcltee50;dcltqr50;
dclwbm50;dsnide50;vcljpg50

声明:
上面加入的一些包对你来说可能是多余的。
主程序和DLL中都必须如此.
 
加入这些包对于解决那个错误有什么意义呢?我加了之后反而程序无法运行,出现运行错误?
 
可能是你的包加得不对,
把你的源码发过来,
我调试一下看行不行。
onlyonekgx@163.com
我之所以如此肯定是因为以前我碰到相同的问题就是这样解决的!
 
我的程序是数据库程序,所以没有库的话程序是不能运行的,所以程序发过去也不能调试!
这个问题真的很麻烦
 
只要是窗口就应该能够被关闭,我觉得你的问题和程序的子窗口关闭差不多,试试下面的代码:
if FindWindowEx(0,0,nil,'DLL子窗体名')<>0 then
DO SOMETHING;
 
CloseWindow(Screen.Forms.Handle)行不行?
另外我觉得
if Screen.Forms.Handle <> Application.MainForm.Handle then
SendMessage(Screen.Forms.Handle,WM_Close,0,0);
是不是狠了点,会不会关错了东西啊
 
我觉得你还是按照我的方法把一些包加进去,如果你不能确定要哪些包那就加入所有的包。
注:
不要把我贴的包粘贴到你的程序中,因为我只提供一个参考,可能对你的程序并不是
这样(环境不同包也不同),你应该使用Add 按钮自己去加入一些包。
 
后退
顶部