DLL开发及调用的一种方法

原创 2007年09月23日 01:18:00

一、新建一个WIN32 DLL工程或MFC DLL工程. 

二、定义模块文件(.def文件).

.DEF文件定义的一般形式如下:

LIBRARY    "Test.dll"

EXPORTS
    DllRegisterServer          @1 private
    DllUnregisterServer      @2 private
    DllFunction                      @3 private
  

''LIBRARY''是一个必需的部分。它告诉链接器(linker)如何命名你的DLL

''EXPORTS''是另一个必需的部分;这个部分使得该函数可以被其它应用程序访问到并且它创建一个导入库。当你生成这个项目时,不仅是一个.dll文件被创建,而且一个文件扩展名为.lib的导出库也被创建了。   

直接在记事本中定义,再保存为.DEF文件并加入到工程中编译即可。

三、实现DEF文件中的输出函数.

在生成的Test.cpp中完成输出函数功能的实现,其中DllRegisterServer 和DllUnregisterServer 是大多数DLL都实现了的,主要是对注册表进行操作,用来注册DLL(将DLL的相关信息写入注册表)。

另外一个函数DllFunction,可以用它来实现DLL的主要功能。这些函数的名字可以随便取,并不一定要定义成DllRegisterServer 或DllUnregisterServer 等(如果DllRegisterServer 或DllUnregisterServer 函数用其它的名字,那么regsvr32将不能用来注册或取消注册此Dll。必须自己重新写一个程序用来注册或取消注册此DLL,其实regsvr32只不过是调用LoadLibrary加载DLL,再调用GetProcAddress获取DllRegisterServer 或DllUnregisterServer 地址而已)。

四、运行生成Test.dll和Test.lib文件。

五、调用DLL中函数.

可以使用LoadLibrary和GetProcAddress一起来完成对DLL里面输出函数的调用,前者用来把DLL加载到内存,后者用来获得DLL中输出函数的地址,具体用法请参考MSDN。

这里,要调用DLL中的函数,前提是你必须知道DLL包含的函数及其使用方法,如果DLL是自己写的,那你肯定知道,但如果是别人写的,那就需要获得被调用函数的名称及相关说明(呵呵,去问作者要,看他肯不肯给了)。

其实DLL编程是一种模块化程序设计方式,作为一个DLL开发者,应该考虑给使用者提供方便。开发者可以给使用者提供一个函数(这个函数并不包含在DLL中),在此函数中完成对LoadLibrary和GetProcAddress调用,这样使用者就只需要了解此函数的使用就可以拉(不需要知道DLL的任何信息),这既有利于DLL的封装有可以给使用者提供方便。

 

需要改变的一些看法:

第一个错误的看法:

dll为什么要注册?DllRegisterServer的作用?
原来认为是这样的:注册登记,将DLL地址写入注册表,"当调用DLL,装载器先将DLL加载到内存,此时就需要搜索注册表,以找到DLL的具体路径。而用regsvr32注册时,后面必须有DLL的路径,因为此时路径还没有写入注册表,LoadLibrary将根据此路径加载DLL,然后此路径以参数的形式传递给DllRegisterServer,DllRegisterServer再将它写入注册表。"
后来才知道错拉:不需要注册也可以LoadLibrary加载成功,即使注册了,如果DLL的位置不正确(一般放在本文件夹、系统目录,要么在调用LoadLibrary时用绝对地址),LoadLibrary也会加载失败。也就是说注不注册与加载成功失败没有关系。LoadLibrary加载失败一般是因为文件的路径不对。注意LoadLibrary的搜索顺序,本文件夹、系统目录......有的DLL根本就没有DllRegisterServer和DllUnregisterServer 这两个函数,所以你对它调用regsvr32将失败,注册只不过是将DLL的某些信息写入注册表。像Filter你就必须将它的名字、CLSID、所属类和PIN的一些信息写入注册表,在创建Filter的时候将用到。

另一个错误的看法:

这里,要调用DLL中的函数,前提是你必须知道DLL包含的函数及其使用方法,如果DLL是自己写的,那你肯定知道,但如果是别人写的,那就需要获得被调用函数的名称及相关说明(呵呵,去问作者要,看他肯不肯给了)。

这里也错了,哈哈,利用Dumpbin命令或者是VC的Depends工具都可以查看到DLL中输出的函数。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL

标 题: 【原创】一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL 作 者: shangzh 时 间: 2012-04-12,23:14:51 链 接: http:...

一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL

1、前言 目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供...

一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL

一种保护应用程序的方法-模拟Windows PE加载器,从内存资源中加载DLL  作者:老实和尚  coverlove@163.com  1、前言 目前很多敏感和重要的DLL(Dyn...
  • hgy413
  • hgy413
  • 2012-10-02 14:33
  • 1579

模块间互相调用的一种方法

在程序设计中,需要把程序根据功能划分多个模块,多个模块间免不了互相调用一些服务函数,这样会使模块间剪不断,理还乱! 利用服务中心的思想,可以使各个模块间的关系比较简单。模块间的调用通过中心服务器交换...

一种C#调用R的方法

  • 2014-11-22 19:59
  • 16KB
  • 下载

调用jupyter notebook文件内的函数一种简单方法

python开发环境jupyter notebook良好的交互式和模块化受到很多python开发人员的青睐,但是jupyter notebook是以json格式保存文件内容的,而不是python文件那...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)