设置你DLL种Application的Handle为主程序的某个窗口句柄,例如Application.Handle

解决方案 »

  1.   

    Application.ShowMainForm := False;
    Application.MainFormOnTaskBar := False;
      

  2.   


    这个是针对 exe 的。跟 dll form 无关。
    谢谢。
      

  3.   


    武稀松?
    拜读过您的部分博文。
    受益匪浅,非常感谢。对于您说的方法,我开始就是这么做的。
    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
      

  4.   

    好吧。我知道错误的地方。
    但是,还不知道怎么解决。
    在 Dll 中,Form 上有一个按钮,触发的事件当中,有一句 Sleep(1000)
    把这个注释掉,就ok了。
      

  5.   


    武稀松?
    拜读过您的部分博文。
    受益匪浅,非常感谢。对于您说的方法,我开始就是这么做的。
    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的处理。
      

  6.   

    dll中不能用application创建窗体,要用窗口类构造函数创建
      

  7.   

    谢谢大家。
    事情其实是这样的。
    我有 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 尝试完成;
      

  8.   

    所以前面说明的关闭,其实是未正常退出(程序无响应)。你的改法,应该是在sleep前面加上Application.ProcessMessages;?
    不论怎样,sleep太久又未做处理,确实会造成“程序死掉”的现象。
      

  9.   


    为什么不在A中sleep?
    调用b中socket连接,失败返回,a中循环sleep三次错误后退出