我将主程序做成exe,功能模块窗体封装在dll中,调用后,dll中的窗体和主程序的窗体不同,并且在任务栏上有单独的一部分,也就是说,我希望
1,将dll中的窗体调用出来后,图标与主程序一致
2,不在工具栏上出现单独的一块,也就是MDI的效果,
之所以不用MDI,是因为试验了很久都不行,直接调用dll的普通窗体倒是很容易,以下是相关代码:
dll中的代码
.....
procedure Load_frmTest;stdcall;
begin
  try
    frmTest := TfrmTest.Create(nil);
    frmTest.ShowModal;
  finally
    frmTest.Freel;
  end;
end;exports
  Load_frmTest;
....

解决方案 »

  1.   

    调用DLL的时候传递进来一个指针(父窗体的Handle),DLL中创建的窗体的Parent值写成这个handle就行了.
    procedure   Load_frmTest;stdcall; 
    begin 
        try 
            frmTest   :=   TfrmTest.Create(nil); 
            frmTest.ShowModal;
            frmTest.Parent := Handle; 
        finally 
            frmTest.Freel; 
        end; 
    end; 
      

  2.   

    从任务栏隐藏   
      var   
          style   :   integer   
      begin   
      style   :=   GetWindowLong(Application.Handle,   GWL_EXSTYLE   );   
      style   :=   style   or   WS_EX_TOOLWINDOW   and   not   WS_EX_APPWINDOW;   
      SetWindowLong(Application.Handle,   GWL_EXSTYLE,   style   );   
      end;   
      再显示的话,只要把第二句改成   
      style   :=   style   or   WS_EX_APPWINDOW   and   not   WS_EX_TOOLWINDOW;   
      就行了。   
    是用MDI很方便,不知道你说的为什么不行,另外,你也可以直接使用一个Frm做为主窗体,上面放个Pannel
    创建出来的窗体的Parent属性都设置为这个Pannel就行,这样很方便.建议你看下Raise控件的源代码,个人感觉这个架构不错.
      

  3.   


    //DLL部分procedure Load_frmTest(App: THandle);stdcall;
    var
      sHandle: THandle;
    begin
      sHandle := Application.Handle;
      Application.Handle := App;
      frmTest := TfrmTest.Create (Application);
      try
        frmTest.ShowModal;
      finally
        frmTest.Free;
      end;
      Application.Handle := sHandle;
    end;exports
      Load_frmTest;//调用部分
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Load_frmTest(Application.Handle) ;
    end;
      

  4.   

    “调用DLL的时候传递进来一个指针(父窗体的Handle),DLL中创建的窗体的Parent值写成这个handle就行了”:这是一个通用的办法(通用的意思是只要是windows窗口都有效,不管什么语言创建的),但不是一个好办法,因为该方式虽然让dll窗口有了父窗口,但dll窗口还是一个“窗口”,而不是一个控件,这句话有点拗口,简单的说窗口比一般控件多了一些东西,例如可以接收关闭等系统消息,有激活和非激活状态。
    理想的办法是:在dll接口函数中创建窗口(new)后返回窗口指针(而不是handle,且不要show),然后在主窗口中将dll窗口“拖”到一个panel中,我比较喜欢把他“拖”到一个pagecontrol中,这样就能形成“标签页”。至于拖动的代码,可以参考borland提供的demo
      

  5.   

    你在调用 DLL时,把句柄和图标传进去就可以啊.
      

  6.   

    procedure Load_frmTest(AHandle: THandle);stdcall;
    var
      OldHandle: THandle;
    begin 
      OldHandle := Application.Handle;
      Application.Handle := AHandle;
      frmTest :=  TfrmTest.Create(Nil);
      try
        frmTest.ShowModel;
      finally
        frmTest.Free;
        Application.Handle := OldHandle;
      end;
    end;