动态链接库的编写:
1.创建一WIN32动态链接库工程Dll1,添加一C++源文件Dll1.cpp,在源文件中编写一个测试函数
int _stdcall add(int a, int b)
{
return (a+b);
}
2.定义一模块定义文件Dll1.def,在里面添加如下内容:
LIBRARY Dll1
EXPORTS
add
该文件的作用是导出函数
3.添加一个Dll1.h文件,该文件的作用是提供给调用者进行静态链接,在该文件中添加如下内容:
int _stdcall add(int a, int b);
备注:使用模块定义文件而不使用extern "C" __declspec(dllexport)的好处是:
即使更改了调用约定,导出函数也不会进行名字改编;而如果改成
extern "C" __declspec(dllexport) int _stdcall add(int a, int b)
查看导出函数为_add@8,进行了名字改编。使用模块定义文件的目的是方便动态库在其他语言中调用。(C语言的默认调用约定是_cdecl)
动态链接库的调用:
第一种是静态链接方式,在这种方式下,动态链接库中的所有数据代码都将拷贝到调用程序的代码空间中去,此时它和调用程序本身的函数没有什么区别;
第二种是动态链接方式,在这种方式下,动态链接库中的数据代码是在需要的时候才拷贝到内存中去的;
两种方式都可以将外部(动态链接库中的)代码资源提供给调用者使用,但前者是全局的,虽随时可以使用,但会增加内存;而后者是局部的,虽节省了内存,但会增加调用时间。
因此,在实际应用中应根据需要选择哪种方式,一般多次调用则采用静态链接方式,而单次调用则采用动态链接方式。
这两种链接方式的调用方法如下
静态调用:
#include
#pragma comment(lib, "Dll.lib")
动态调用:
HINSTANCE hInst;
hInst = LoadLibrary("Dll.dll");
typedef int (*pFunc)(int, int);
pFunc pAdd = NULL;
pAdd = (pFunc)GetProcAddress(hInst, "add");
if (pAdd)
{
//使用动态库中的函数
}
FreeLibrary(hInst);