谢谢大家。 事情其实是这样的。 我有 2 个 dll(A,B),1 个主程序(E)。 1. A 是界面 DLL,B 是Socket DLL。 2. E 调用 A 中的界面。 3. A 中有个按钮,会调用 B 中连接 Socket 的方法。 4. B 中,如果连接失败(反馈 10061),我会尝试 3 次重连,每次间隔 1 秒。 5. 只要出发这个 Sleep,就会产生空白任务栏。原因大概吧,就是 2 个 DLL 中有两套 Application。 最终,我貌似是解决了。 在 B 中写法如下:repeat if 连接错误 then begin Application.ProcessMessages; Sleep(1000); end; until 尝试完成;
Application.MainFormOnTaskBar := False;
这个是针对 exe 的。跟 dll form 无关。
谢谢。
武稀松?
拜读过您的部分博文。
受益匪浅,非常感谢。对于您说的方法,我开始就是这么做的。
1. 保存 Dll App.Handle
2. 用 exe App.Handle 赋值 Dll App.Handle
3. 使用
4. 归还 Dll App.Handle。(释放 Dll 前)原本用的好好的。
不过,也不清楚是哪里出的问题。
当调用 MessageBox (第一个参数,就是 Dll Form. Handle)之后,
有一半的几率,会出现一个没有文字的框,在任务栏里。多出来的,与主程序并存。
特别是 exception 的时候,出现率高。
关闭它,也会跟主程序的那个框,一样。会关闭程序。只有当任务栏里,存在一个 Dll Form 的标题框时,同样的代码,不会增加这个无文字的框。Win7 64 位 + Delphi 2007
但是,还不知道怎么解决。
在 Dll 中,Form 上有一个按钮,触发的事件当中,有一句 Sleep(1000)
把这个注释掉,就ok了。
武稀松?
拜读过您的部分博文。
受益匪浅,非常感谢。对于您说的方法,我开始就是这么做的。
1. 保存 Dll App.Handle
2. 用 exe App.Handle 赋值 Dll App.Handle
3. 使用
4. 归还 Dll App.Handle。(释放 Dll 前)原本用的好好的。
不过,也不清楚是哪里出的问题。
当调用 MessageBox (第一个参数,就是 Dll Form. Handle)之后,
有一半的几率,会出现一个没有文字的框,在任务栏里。多出来的,与主程序并存。
特别是 exception 的时候,出现率高。
关闭它,也会跟主程序的那个框,一样。会关闭程序。只有当任务栏里,存在一个 Dll Form 的标题框时,同样的代码,不会增加这个无文字的框。Win7 64 位 + Delphi 2007
从描述的状况看,dll弹出窗口会提交退出程序消息(WM_QUIT)。窗口应该是调用了application.Terminate,提交了该消息。
VCL窗体内部处理,除非是主窗口,否则不会调用方法。可以先确认一下以下两个问题:
1、在Application.Terminate设置断点,出现问题时,分析栈:看谁调用?
2、dll中的窗口是如何创建?application.CreateForm?注意其中FMainForm及MainFormOnTaskBar的处理。
事情其实是这样的。
我有 2 个 dll(A,B),1 个主程序(E)。
1. A 是界面 DLL,B 是Socket DLL。
2. E 调用 A 中的界面。
3. A 中有个按钮,会调用 B 中连接 Socket 的方法。
4. B 中,如果连接失败(反馈 10061),我会尝试 3 次重连,每次间隔 1 秒。
5. 只要出发这个 Sleep,就会产生空白任务栏。原因大概吧,就是 2 个 DLL 中有两套 Application。
最终,我貌似是解决了。
在 B 中写法如下:repeat
if 连接错误 then
begin
Application.ProcessMessages;
Sleep(1000);
end;
until 尝试完成;
不论怎样,sleep太久又未做处理,确实会造成“程序死掉”的现象。
为什么不在A中sleep?
调用b中socket连接,失败返回,a中循环sleep三次错误后退出