CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

为什么我从dll中调出的模式窗体在任务栏上显示呢?

楼主lixuebin2002(彬彬)2002-11-11 15:55:00 在 Delphi / VCL组件开发及应用 提问

为什么我从dll中调出的模式窗体在任务栏上显示呢?怎样像一个真正的dll被主程序调用而不在任务栏上出现一个线程? 问题点数:100、回复次数:17Top

1 楼lws0472(期待2008)回复于 2002-11-11 16:45:08 得分 0

因为你在dll中做函数时没有把调用程序的句柄传进去。  
  在程序中加参数   Ahandle   :   Thandle  
   
  函数中加Application.handle   :=   Ahandle;  
   
  在别的程序中调用函数时把程序的句柄传进去Top

2 楼lixuebin2002(彬彬)回复于 2002-11-11 17:06:17 得分 0

这两个东西加在哪?Top

3 楼lws0472(期待2008)回复于 2002-11-11 17:12:06 得分 0

加在你dll的函数中,就是你dll的原程序中,你在dll的函数中是通过函数来动态创建的窗体,就是那个函数。  
      如果dll不是你做的,那只能找dll的开发人了  
      我要回家玩三国群侠传了,有问题明天解答Top

4 楼xzhifei(饭桶超人(最讨厌两种人,一种是有种族歧视的人,一种是日本人!))回复于 2002-11-11 17:14:37 得分 0

SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE)   and   (not   WS_EX_APPWINDOW)   or   WS_EX_TOOLWINDOW);  
  Top

5 楼lixuebin2002(彬彬)回复于 2002-11-11 17:17:37 得分 0

我说飞仙,dll也是我写的,我不知把这两个东西放在哪?  
  我把Ahandle   :   Thandle放入了窗体的var中,  
  把Application.handle   :=   Ahandle放入了我的返回函数中,也就是被exe调用的函数!   这样不行,错在哪?Top

6 楼Impylm(韩冰)回复于 2002-11-11 17:18:35 得分 0

一般放在DLL中导出函数里Top

7 楼lixuebin2002(彬彬)回复于 2002-11-11 17:32:06 得分 0

我说兄弟们,能不能说的详细一点呀,我很急呀!  
  exe那边写什么?dll那边写什么?Top

8 楼xzhifei(饭桶超人(最讨厌两种人,一种是有种族歧视的人,一种是日本人!))回复于 2002-11-11 17:41:53 得分 0

EXE不用写,只需要调用就行了,在DLL的窗口创建过程中加入:  
  SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE)   and   (not   WS_EX_APPWINDOW)   or   WS_EX_TOOLWINDOW);  
   
  Top

9 楼78(2008奥运痴狂症)回复于 2002-11-11 17:46:33 得分 0

DLL在中这样写:  
   
  library   myDll;  
  uses  
      SysUtils,  
      Classes;  
   
  {$R   *.res}  
   
  var  
      SaveDLLApp:TApplication;  
   
  procedure   myProc(MainApp:TApplication;)export;   stdcall;  
  var  
      Child:TfrmRy;   //YourFrom  
  begin  
      if   not   Assigned(SaveDllApp)   then  
      begin  
          SaveDllApp:=Application;  
          Application:=MainApp;  
      end;  
        Child:=TfrmRy.Create(Application);  
   
    try  
          Child.ShowModal;  
      finally  
          Child.Free();  
      end;  
   
  procedure   MyLibraryProc(Reason:integer);  
  begin  
      if   Reason=DLL_PROCESS_DETACH     then  
      begin  
        if   Assigned(SaveDllApp)   then  
              Application:=SaveDllApp;  
        end;  
  end;  
   
  Exports  
      myProc;  
   
  begin  
      DLLProc   :=   @MyLibraryProc;  
  end;  
   
  在调用的EXE文件中:  
  unit   unit1;  
  interface  
  uses   ....  
   
  type  
      Tmyproc=procedure(mainApp;TApplication);stdcall;  
      tform1=class(Form1)  
  ...  
  procedure   TForm1.button1onClick(Sender:Tobject);  
  var  
    DllHandle:   THandle;  
      ProcAddr:   FarProc;  
      ProvaChild:   TShowMe;  
  begin  
      DllHandle   :=   LoadLibrary(PChar(   myDll));  
      ProcAddr   :=   GetProcAddress(DllHandle,   'myProc');  
   
      try  
        if   ProcAddr   <>   nil   then  
        begin  
               
            ProvaChild:=ProcAddr;  
              ProvaChild(Application);  
            end;  
      Except  
            FreeLibrary(Dllhandle);  
            MessageBox(Application.Handle,PChar(DllName+'文件接口错误'),'错误',  
                                                                                          MB_ICONWARNING+MB_OK);  
   
      End;  
   
        FreeLibrary(Dllhandle);  
  end;Top

10 楼yang6130(柳轻风)回复于 2002-11-11 17:53:50 得分 0

模式窗体在任务栏上显示是因为EXSTYLE中含有WS_EX_APPWINDOW,  
  xzhifei(飞)   的方法应该是可行的,你为什么不试一下?Top

11 楼lws0472(期待2008)回复于 2002-11-12 08:26:47 得分 0

我又回来了,昨天晚上玩三国群英传玩到12点,累死了。  
  先解释一下:  
      DLL也是一个应用程序,他也有Application,而调用DLL的应用程序也有Application,如果你不把两个Application通一的话,在任务栏上就会出现两个。  
  下面是一个在DLL用于动态创建窗口的范例,此函数也就是你的引出函数。  
  unit   Unit2;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls;  
   
  type  
      TForm1   =   class(TForm)  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  Function   Thistest(Ahandle   :   Thandle):bool;stdcall;  
  implementation  
  {$R   *.dfm}  
  Function   Thistest(Ahandle   :   Thandle):bool;  
  var  
      Form1:   TForm1;  
  begin  
      Application.Handle   :=   Ahandle;  
      Form1   :=   Tform1.Create(application);  
      try  
          Form1.ShowModal;  
          result   :=   true;  
      finally  
          Form1.Free;  
      end;  
  end;  
  end.  
   
  调用时把程序的句柄传进去,如Thistest(Form1.handle):Top

12 楼lixuebin2002(彬彬)回复于 2002-11-12 09:55:24 得分 0

兄弟们,不知道是不是我笨,还是没有成功,因为我这个dll中有很多窗体,所以我在dll的返回函数中让第一个窗体create并且showmodal,其它的窗体在相应的事件中create。对了,我返回的函数是boolean型的,有没有关系?“天外飞仙”的程序的“thistest(formx.handle)”我放到了返回函数中,结果出现异常,各位帮帮兄弟吧!Top

13 楼lws0472(期待2008)回复于 2002-11-12 10:38:01 得分 0

怎么会有问题呢,这是我刚做的,并且测试通过。  
  我也做过在DLL里放n个FORM,只要动态创建就行了,没有问题的。你的程序有没有保密的地方,没有的话把程序贴出来吧Top

14 楼lixuebin2002(彬彬)回复于 2002-11-12 11:29:58 得分 0

dll部分:  
  library   landchange;  
   
   
  uses  
      SysUtils,  
      Classes,  
      forms,  
      frmfirsttz   in   'frmfirsttz.pas'   {firsttz},  
      ............;  
   
  exports  
      change   name   'change';  
  {$R   *.res}  
  begin  
  end.  
   
  dll中一个窗体的内容:  
  unit   frmfirsttz;  
   
  interface  
   
  uses   ...........;  
   
  type  
      Tfirsttz   =   class(TForm);  
      ......;  
    private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
  var  
      firsttz:   Tfirsttz;  
      function   change:   Boolean;export;  
  implementation  
   
  uses   ....  
            ....;  
   
  {$R   *.dfm}  
  function   change;export;  
      begin  
      firsttz:=tfirsttz.Create(Application);  
      firsttz.ShowModal;  
      firsttz.Free;  
      end;  
   
  exe部分:  
  unit   Unit1;  
   
  interface  
   
  uses  
      ..........;  
   
  type  
      TForm1   =   class(TForm)  
          .......;  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
  function   nowchange:   Boolean;  
  external   'landchange.dll'   name   'change';  
   
  我只在某一事件中写了一句“change;”,不知把你的程序放在哪?Top

15 楼78(2008奥运痴狂症)回复于 2002-11-12 12:33:10 得分 0

直接传Application比较好.在DLL中可以控制EXE文件的一些内容.  
   
  Top

16 楼lws0472(期待2008)回复于 2002-11-12 12:40:58 得分 100

dll部分:  
  library   landchange;  
  uses  
      SysUtils,  
      Classes,  
      forms,  
      frmfirsttz   in   'frmfirsttz.pas'   {firsttz},  
      ............;  
  exports  
      change   ;     //这里没必要写name  
  {$R   *.res}  
  begin  
  end.  
   
  dll中一个窗体的内容:  
  unit   frmfirsttz;  
   
  interface  
   
  uses   ...........;  
   
  type  
      Tfirsttz   =   class(TForm);  
      ......;  
    private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
  var  
      firsttz:   Tfirsttz;  
      function   change(Ahandle   :   Thandle):   Boolean;stdcall;   //这里修改  
  implementation  
   
  uses   ....  
            ....;  
   
  {$R   *.dfm}  
  function   change(Ahandle   :   Thandle):   Boolean;   //这里修改  
  var   //这里修改  
      myfirsttz   :   Tfirsttz;  
  begin  
      Application.handle   :=   Ahandle;     //这里修改  
      firsttz:=tfirsttz.Create(Application);  
      try     //这里修改  
        firsttz.ShowModal;  
        result   :=   true;  
      finally  
        firsttz.Free;  
        end;  
  end;  
   
  exe部分:  
  unit   Unit1;  
   
  interface  
   
  uses  
      ..........;  
   
  type  
      TForm1   =   class(TForm)  
          .......;  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
  function   change(Ahandle   :   Thandle):   Boolean;stdcall;external   'landchange.dll';     这里修改  
   
  //在这里调用  
  change(Form1.handle);  
   
  Top

17 楼lixuebin2002(彬彬)回复于 2002-11-12 13:05:08 得分 0

“仙”谢谢你,我给你给分了!Top

相关问题

  • 窗体与任务栏的问题!
  • 如何去掉dll中创建的窗体ShowModal显示之后在任务栏出现的标题(40)
  • 从DLL调用一个窗体时,在Windows的任务栏会多出一个任务,请问如何解决??
  • 高分求解: dll中的窗体最小化后到任务栏并加载图标
  • 请问如何隐藏一个 DLL 窗体的任务栏按钮,我的窗体来自 DLL 无法通过 Application 来实现
  • VB中无标题的窗体,怎样在任务栏显示???
  • 主窗体Close后,怎么任务栏上还有图标?
  • 怎样使窗体显示在任务栏中?
  • 如何让窗体最小化到任务栏上
  • 怎么在任务栏里注册子窗体(巨难)

关键词

  • 函数
  • dll
  • 修改
  • 模式
  • application
  • 窗体
  • firsttz
  • tfirsttz
  • ahandle
  • 任务栏

得分解答快速导航

  • 帖主:lixuebin2002
  • lws0472

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo