我在Dll中创建的窗口,在任务栏会显示很多个窗口出来,不知道如何合并为一个窗口,这些窗口都是一个Application啊,为什么会出现额外的窗口呢,连一个MessageBox都会在任务栏生成一个新的窗口。?

解决方案 »

  1.   

    把主程序的application.handle种用参数传到Dll中,然后,当前窗体的handle:=application.handle即可
      

  2.   

    下面是源码:
        Project1.DPR {主叫程序}
        Unit1.PAS {主叫程序单元}
        Project2.DPR {DLL}
        Unit2.PAS {DLL单元}
    {---------- DLL 主程序 Project2.DPR ----------}library Project2;uses
      SysUtils,
      Classes,
      Unit2 in 'Unit2.pas' {Form1};{$R *.RES}{ 下面的语句用于向调用该 DLL的程序提供调用接口 }
    exports
      DoTest;       { 过程来自单元Unit2 }begin
    end.
    {---------- DLL中的单元 Unit2.PAS ----------}unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, ADODB, StdCtrls, Menus;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;{ 本地数据库连接 }
        Memo1: TMemo;                  { 用于显示信息   }
      private
      public
      end;{ 该过程向外提供 }
    procedure DoTest(H: THandle;           { 获得调用者的句柄       }
                     AConn: TADOConnection;{ 获得调用者的数据库连接 }
                     S: string;            { 获得一些文本信息       }
                     N: Integer);          { 获得一些数值信息       }
                     cdecl;                { 指定调用协议           } implementation{$R *.DFM}procedure DoTest(H: THandle; AConn: TADOConnection; S: string; N: Integer);
    begin
      Application.Handle := H;              { 将过程的句柄赋值为调用者的句柄 }
      { 上面语句的作用在于, DLL的句柄和调用者的句柄相同,在任务栏中就不会   }
      { 各自出现一个任务标题了。                                             }
      with TForm1.Create(Application) do try{ 创建窗体                       }
        Memo1.Lines.Append('成功调用');     { 显示一行信息                   }
        ADOConnection1 := AConn;            { 获得数据库连接的实例           }
        Memo1.Lines.Append(
          ADOConnection1.ConnectionString +
          ' - ' + S + ' - ' + IntToStr(N)); { 根据得到的参数显示另一行信息   }
        ShowModal;                          { 模式化显示窗体                 }
      finally
        Free;                               { 调用结束时销毁窗口             }
      end;
    end;end.
    {---------- 调用者 Project1.DPR,很普通的工程文件 ----------}program Project1;uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1};{$R *.RES}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    {---------- 调用者单元Unit1.PAS ----------}unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Db, ADODB;type
      TForm1 = class(TForm)
        Button1: TButton;   { 按此按钮进行调用 }
        ADOConnection1: TADOConnection;         { 本地数据库连接,将传递给 DLL }
        procedure Button1Click(Sender: TObject);{ 调用 DLL}
      private
      public
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ 外部声明必须和 DLL中的参数列表一致,否则会运行时错误    }
    procedure DoTest(H: THandle;             { 传递句柄       }
                     AConn: TADOConnection;  { 传递数据库连接 }
                     S: string;              { 传递文本信息   }
                     N: Integer);            { 传递数值信息   }
                     cdecl;                  { 指定调用协议   }
                     external 'Project2.dll';{ 指定过程来源   }{ 调用过程 }
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      DoTest(Application.Handle,
             ADOConnection1,
             'Call OK',
             256);
    end;end. 
      

  3.   

    把窗体属性设成toolwindow试试。