一写DLL需要建立至少三个文件:
1 .cpp文件用于写核心代码。
里面包括一个dll入口函数DllMain。形如:
包括需要导出的变量和函数,图中的是add。以及不需要导出的变量和函数。
2 .h文件用于供其他程序调用使用。
最好包括如下内容:
3 .def文件,用于为链接器提供有关被链接程序的导出、属性及其他方面的信息。为了导出所需函数。
如图:
.def文件的规则为:
(1)LIBRARY语句说明.def文件相应的DLL,可以省略;
(2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n;
(3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。
可以看出,DLL中导出函数的声明有两种方式:
一种方式是:在函数声明中加上__declspec(dllexport);
另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
这两种方式分别对应上面的2和3,笔者建议这两个文件全部建立。
二编译后生成三个有用的文件:
- 1.dll文件就是动态链接库
- 2.lib文件就是供程序开发用的导入库,它为系统提供了加载这个dll和定位dll中的导出函数所需的信息。
- 3.h文件包含了导出函数的声明
三使用dll有两种途径
1装载期间动态链接。这时候需要用到全部三个有用文件。最好将他们都放入你的工程目录。
在调用时必须要用到两个语句,他们是:
#include “.h”有用文件
#pragma comment(lib, “.lib”有用文件)
之后就可以像使用本地函数一样使用.dll中的导出函数了。请看下面的例子:
2运行期间动态链接。这时候只需要用到.dll文件。你需要记录它的文件目录中的地址。
这时你需要用到三个函数:
用于加载库的:库handle = LoadLibrary("dll文件的目录地址");
用于加载函数:函数指针 = GetProcAddress(库handle, "函数名");
用于释放库的:FreeLibrary(库handle);
在加载函数指针后就可以使用这个函数了。请看下面的例子: