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中输出的函数。

调用DllRegisterServer方法进行COM组件的注册

调用DllRegisterServer方法进行COM组件的注册一个替代“regsvr32.exe"COM组件注册工具的方法是手动调用COM模块中的DllRegisterServer.步骤如下1. 定义...
  • PhilLee
  • PhilLee
  • 2007年02月27日 11:33
  • 3250

动态链接库(DLL)的开发和使用

一、DLL简介它是Dynamic Link Library 的缩写形式,DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执...
  • sllins
  • sllins
  • 2010年04月27日 13:46
  • 18789

关于DLL导出函数的总结

一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解。要学习,这篇文章先总结DL...

将C#程序与调用的dll对应的C++源码联调的一种方法

本方法对满足以下条件的程序有效(放宽版本条件应该也可以,怕误导,所以仅总结说明我使用的条件) 1、有生成dll的源代码,且源代码为用VS编写的C++ 2、dll放在C#工程的Debug文件夹下,并...

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

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

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

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

DLL劫持,注入DLL的一种方法

先转一篇文章:http://hi.baidu.com/e1mer/item/eae9381377ada2f3756a84b8 1.dll劫持,粗略整理了下,可以劫持的dll有(持续更新): ...

VS开发环境下生成和调用dll出现的问题和解决方法-1

dll生成和调用中遇到的问题和解决方法
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DLL开发及调用的一种方法
举报原因:
原因补充:

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