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

动态加载 “动态连接库” 的问题————————在线等待!!!!

楼主wangchuanbin(飘零)2005-01-08 10:44:34 在 Delphi / Windows SDK/API 提问

大家好:  
          我写了一个动态连接库名字为:testdll.dll   。其中有一个输出过程的代码如下:  
  Procedure   HelloDll(Myform:TForm);  
  begin  
      MessageBox(Myform.Handle,'Hello   Dll','DLL   Message   Box',MB_OK);  
  end   ;  
   
          我动态加载的代码如下:  
  Procedure   TForm1.Button1Click(Sender:TObject);  
  type  
      ThelloDll=Procedure(Myform:TForm);  
  var  
      DLLInstance:THandle   ;  
      PFunc   :TFarProc   ;  
  begin  
      DLLInstance   :=   LoadLibrary('testdll.dll');  
      if   DLLInstance   =   0   then  
          begin  
              showmessage('can   not   load   DLL');  
              exit   ;  
          end;  
      PFunc   :=   GetProcAddress(DLLInstance,'HelloDll');  
      if   PFunc   <>   nil   then  
          ThelloDll(PFunc)(form1)  
      else  
          showmessage('can   not   find   the   function');  
      FreeLibrary(DLLInstance);  
  end   ;  
   
  我的问题是:为什么在程序中调用这个动态连接库的过程还要说明一个类来描述这个过程??????  
                        ThelloDll=Procedure(Myform:TForm);ThelloDll这个类为什么要这样定义呢????  
                        PFunc   :TFarProc   ;   TFarProc   这个类型是什么意思?????  
  请各位前辈回答我这三个问题好吗?????????????????????????????????????????????????????????????????????????????????????????????????拜托了拜托!!  
  问题点数:50、回复次数:12Top

1 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2005-01-08 11:28:27 得分 0

ThelloDll=Procedure(Myform:TForm);ThelloDll;  
   
  定義函數指針...然後獲得你dll得導出函數得入口地址 函數地調用就是跳轉到函數地入口地址處而已  
  看上面跟你dll的函數的定義完全相同...要求必須這樣...  
   
  PFunc   :TFarProc   ;   TFarProc   这个类型是什么意思?????  
  // 這個只是一個指針轉換而已 可以不用定義...  
  PFunc   :TFarProc   ;  
  ->  
  PFunc:   ThelloDll;   就可以了   
   
  ThelloDll(PFunc)(form1)  
  它這樣 還多轉換了一次 不必要了  
   
  唉 繁體打字麻煩 我知道可能還沒說清。。。啊啊啊啊  
  Top

2 楼zhangyanxxxx(张言)回复于 2005-01-08 12:08:04 得分 0

PFunc   :TFarProc    
  PFunc   :=   GetProcAddress(DLLInstance,'HelloDll');  
  是获取DLL中过程名为HelloDll的句柄  
   
  ThelloDll=Procedure(Myform:TForm);  
  是定义DLL中过程的对象Top

3 楼wangchuanbin(飘零)回复于 2005-01-10 10:39:23 得分 0

还有没有高手啊俺还不明白啊???Top

4 楼iriscat(猫小)回复于 2005-01-10 11:09:41 得分 0

GetProcAddress只是得到函数的地址以便于调用  
   
  但是参数如何传递,编译器需要知道函数原形,明白?Top

5 楼wangchuanbin(飘零)回复于 2005-01-10 11:57:14 得分 0

有没有高手啊!·!!能不能说到点子上啊   !!那几个API函数我都明白。为什么不回答我提出的那几个问题呢???我不提的问题请不要回答!!还有请不要答非所问!!答不了的请不要回答!!!!Top

6 楼nicotine(尼古丁)回复于 2005-01-10 17:42:24 得分 0

这几位老大说的不就是你问的么?有什么不明白的?哪里有答非所问?Top

7 楼wangchuanbin(飘零)回复于 2005-01-11 09:24:44 得分 0

大家好!我的问题上就提了三个问题啊请你们对号入座的给我回答好吗?不会的不要乱发言!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Top

8 楼kiboisme(蓝色光芒)(www.1284.net/)(软件开发机器人for delphi)回复于 2005-01-11 13:02:11 得分 0

为什么在程序中调用这个动态连接库的过程还要说明一个类来描述这个过程?  
   
  ThelloDll=Procedure(Myform:TForm);ThelloDll这个类为什么要这样定义呢????  
   
  第一:如果不定义参数和接口形式,怎么传递参数?Delphi怎么编译呀?  
  第二:这不是类定义,这是函数参数形式和接口定义。  
   
  PFunc   :TFarProc   ;   TFarProc   这个类型是什么意思?????  
  这个确实没有必要  
  Top

9 楼kiboisme(蓝色光芒)(www.1284.net/)(软件开发机器人for delphi)回复于 2005-01-11 13:03:08 得分 0

TFarProc   =   Pointer;  
  这下应该明白了吧Top

10 楼zwjchina(蒲石)回复于 2005-01-11 13:09:08 得分 50

其实以上都说清楚了,只不过是你自己觉得不习惯而不愿意接受这种使用方法罢了!  
   
  我的问题是:为什么在程序中调用这个动态连接库的过程还要说明一个类来描述这个过程??????  
   
  那我反问你,不声明这个类型,你如何调用???  
   
  你应该也看到你写的代码了:  
  if   PFunc   <>   nil   then  
          ThelloDll(PFunc)(form1)      
  这里做了强制转换,   你不会告诉我你直接使用PFunc(form1)吧?如果不声明ThellDll,编译  
          ^^^^^^^^^  
  Top

11 楼zwjchina(蒲石)回复于 2005-01-11 13:14:10 得分 0

器怎么知道PFun具体是个什么东西!?  
   
  PFunc   :TFarProc   ;   TFarProc   这个类型是什么意思?????  
  是指针,你可以把它理解为Pointer的一个具体类型,如上面的高手们说的,可以不要这个TFarProc  
  直接PFunc:ThelloDll;  
  那么就可以这样了:    
  if   PFunc   <>   nil   then  
        PFunc(form1);  
   
  ThelloDll=Procedure(Myform:TForm);ThelloDll这个类为什么要这样定义呢????  
   
  原因是你的testdll.dll中是   Procedure   HelloDll(Myform:TForm);  
  如果你的testdll.dll中是function   HelloDll:   boolean;  
  你还要把定义改成:  
      ThelloDll=function:   boolean;  
  Top

12 楼wangchuanbin(飘零)回复于 2005-01-12 10:13:48 得分 0

谢谢各位高手谢谢了啊Top

相关问题

  • js如何动态加载一个文件啊?在线等待
  • 如何动态加载动态链接库?
  • 动态加载动态库问题--在线等
  • 动态加载DLL!!!!!!!!!!!!!!!!!!!
  • 动态加载dll
  • 动态加载Banner?
  • 动态加载Combo
  • 请问,如何在Form中,动态加载多个checkbox控件?在线等待.....
  • 如何在动态连结库中加载无模框?
  • 如何实现DLL动态库的程序中加载

关键词

  • 函数
  • 连接
  • 代码
  • thellodll
  • tfarproc
  • pfunc
  • hellodll
  • dllinstance
  • myform
  • 调用

得分解答快速导航

  • 帖主:wangchuanbin
  • zwjchina

相关链接

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

广告也精彩

反馈

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