CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

关于DLL中调用FORM

楼主locususer(我是一头小奶牛)2002-05-24 11:56:23 在 Delphi / VCL组件开发及应用 提问

在FORM1中调用DLL,在DLL中扫描FORM1的控件,如何传递FORM1给DLL,实现扫描???我给DLL传递FORM1:TFORM,报错 问题点数:40、回复次数:16Top

1 楼locususer(我是一头小奶牛)回复于 2002-05-24 12:05:25 得分 0

拱拱Top

2 楼yansea(思宏)回复于 2002-05-24 12:29:02 得分 1

我想问问,你怎么实现扫描呢?  
  如果要此dll可以通用的话,传递它的handle好了。  
  另,看看你是否在dll中use了formsTop

3 楼locususer(我是一头小奶牛)回复于 2002-05-24 13:01:36 得分 0

HANNDLE传过去以后,怎么用???  
   
  没办法通过HANDLE使用FORM的属性呀Top

4 楼yansea(思宏)回复于 2002-05-24 13:06:46 得分 0

哦,你误会了。  
  我的意思是如果要使dll可以通用,那么只能传递句柄之类的东西。  
  不清楚你的“扫描”,是遍历form上所有的控件吗Top

5 楼lanbada(lanbada)回复于 2002-05-24 13:08:24 得分 0

gzTop

6 楼locususer(我是一头小奶牛)回复于 2002-05-24 13:39:53 得分 0

是的  
   
  我就是想问问传过句柄以后,怎么使用这个句柄Top

7 楼chinaway(溪之)回复于 2002-05-24 15:09:06 得分 1

delphi会自动生成这句话  
  Unit1   in   'Unit1.pas'   {Form1};  
  然后你就可以用了Top

8 楼locususer(我是一头小奶牛)回复于 2002-05-27 12:59:45 得分 0

DELPHI怎样自动生成???  
   
  我传递给DLL一个句柄,在DLL中怎样使用这个句柄????Top

9 楼locususer(我是一头小奶牛)回复于 2002-05-29 17:30:23 得分 0

拱拱Top

10 楼locususer(我是一头小奶牛)回复于 2002-05-30 09:39:29 得分 0

大家帮帮忙啦Top

11 楼fuction(我是东北那旮来地)回复于 2002-05-30 10:03:26 得分 5

给你个例子吧  
   
  一.函数过程的写法:  
  library   FIRSTDLL;  
  uses       SysUtils,   Classes;  
  {$R   *.RES}  
  //   1.定义函数具体过程和输出接口方式       //   函数   1         //   功能:事数据3倍放大函数  
  function   PenniesToSoins(SourceResult:Integer):Integer;stdCall;  
  begin  
    if   SourceResult>0   then  
        Result:=SourceResult*3   //结果存放于Result  
    else  
        Result:=SourceResult;  
  end;  
  exports    
    PenniesToSoins;   //2.函数输出口定义  
  end.  
  二.在DLL中创建Form  
  1.一步,创建DLL工程,及加入设置好的Form  
  library   MGRPERSN;  
  uses       SysUtils,   Classes,  
    MGRPERFM   in   'MGRPERFM.pas'   {FormPERSON};//1.Form的代码(与一般的Form一样)  
  {$R   *.RES}  
  exports  
      ShowPerSN;//2.函数输出口定义  
  begin  
  end.  
  2.   在DLL设定的Form的设置    
  unit   MGRPERFM;  
  interface  
  uses   Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
    ComCtrls,   ToolWin,   ImgList;  
  type  
    TFormPERSON   =   class(TForm)  
    private  
        {   Private   declarations   }  
    public  
        {   Public   declarations   }  
    end;  
  //些处的变量不再用,给其改个地方,如下(改变之一)  
  //var     FormPERSON:   TFormPERSON;  
  {   Declare   the   export   function   宣布Form函数出口}//改变之二  
  function   ShowPerSN(AHandle:   THandle;   ACaption:   String):BOOL;   StdCall;  
  implementation  
  {$R   *.DFM}       //函数据过程定义  
  function   ShowPerSN(AHandle:   THandle;   ACaption:   String):BOOL;  
  var       FormPERSON:   TFormPERSON;   //定义窗体类(上面的放到了此处)  
  begin  
  //拷贝应用程式句柄给DLL的应有程式对象  
    Application.Handle   :=   AHandle;  
    FormPERSON   :=   TFormPERSON.Create(Application);//创建控件TForm  
    try  
        FormPERSON.Caption   :=   ACaption;  
        FormPERSON.ShowModal;//显示此Form              
        Result   :=   False;   //反回成功值  
    finally  
        FormPERSON.Free;  
    end;  
  end;  
  三.DLL中函数及窗体的调用  
  1.调用方法一  
  implementation   //在此的下方写明调用函数的DLL  
  {$R   *.DFM}//DLL内函数调用  
  function   PenniesToSoins(SourceResult:Integer):Integer;     StdCall   external   'FIRSTDLL.DLL';  
  2.调用方法二  
  type     //在此创建一个函数类  
  {   First,   define   a   procedural   data   type,   this   should   reflect   the   procedure   that   is   exported   from   the   DLL.   }  
    {   Create   a   new   exception   class   to   reflect   a   failed   DLL   load   }  
    TShowPerSN   =   function   (AHandle:   THandle;   ACaption:   String):   BOOL;   StdCall;  
    EDLLLoadError   =   class(Exception);//同时创建一个出错记录类  
  TMAINCLTR   =   class(TForm)   //这里不变,系统自动生成  
  procedure   TMAINCLTR.ToolButton1Click(Sender:   TObject);  
  var     //按钮的调用事件:调用过程  
    LibHandle:   THandle;       ShowPerSN:   TShowPerSN;  
  begin  
    Application.Title:='人力资源管理系统DLL文件测试程式';  
    LibHandle   :=   LoadLibrary('MGRPERSN.DLL');   {   Attempt   to   load   the   DLL   尝试装入DLL文件}  
    try  
        if   LibHandle   =   0   then  
            raise   EDLLLoadError.Create('Unable   to   Load   DLL(无法成功装入MGRPERSN.DLL)');  
        @ShowPerSN   :=   GetProcAddress(LibHandle,   'ShowPerSN');  
        if   not   (@ShowPerSN   =   nil)     then     ShowPerSN(Application.Handle,   '人事资料管理')//呼叫出窗体  
        else           RaiseLastWin32Error;  
    finally  
        FreeLibrary(LibHandle);   //   Unload   the   DLL.  
    end;  
  end;  
  Top

12 楼wenzm(魔术师)回复于 2002-05-30 10:16:36 得分 1

同意楼上的  
  我有一个分布式的系统,包含很多的工程在系统中  
  有跟多的模块很类似  
  我就是把这些类似的东西定义在一个DLL中的  
  做法么?   先和做普通的工程一样  
  完成以后只要把Project该为Liblary然后定义好export就可以调用了!Top

13 楼locususer(我是一头小奶牛)回复于 2002-05-30 11:01:06 得分 0

我是想通过主窗体FORM1调用DLL   ,同时将主窗体的HANDLE传递给DLL,该DLL  
   
   
  的功能是修改主窗体控件属性。谢谢大家了,我还是不太会  
   
  Top

14 楼locususer(我是一头小奶牛)回复于 2002-05-30 13:12:44 得分 0

接着拱Top

15 楼locususer(我是一头小奶牛)回复于 2002-06-05 12:54:37 得分 0

谢谢大家,帮帮忙啦Top

16 楼budi(http://lysee.oicp.net)回复于 2002-06-05 13:09:24 得分 32

可以试试:  
  ----------------------  
  1.   使用WINDOWS消息机制通过发送消息实现DLL和窗体间的通讯  
  2.   在程序中编写两个过程,一个用于读取窗体属性,另一个用于修改窗体属性,  
        装载DLL时将这两个过程作为参数传递到DLL中,形成回叫  
  3.   使用WINDOWS   APITop

相关问题

  • com+中调用dll
  • 在dll中调用dll?
  • 调用DLL中的form,到Form里的Panel里面的问题
  • DLL中的MDI调用
  • Asp中如何调用Dll?
  • dll中的窗体调用
  • asp中怎么调用dll?
  • 调用Dll中的类
  • Delphi中调用DLL问题
  • Delphi DLL 中不能创建含ActiveX 的 Form,如何调用CoInitialize()

关键词

  • dll
  • 函数
  • 属性
  • 控件
  • 窗体
  • 句柄
  • 调用
  • mgrperfm
  • 传递
  • sourceresult

得分解答快速导航

  • 帖主:locususer
  • yansea
  • chinaway
  • fuction
  • wenzm
  • budi

相关链接

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

广告也精彩

反馈

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