动态链接库的使用

来源:互联网 发布:我的世界手机版js插件 编辑:程序博客网 时间:2024/05/21 11:09
一、创建动态链接库

1、VS新建Win32控制台应用程序,配置向导的应用程序设置页应用程序类型选择“DLL”,附加选项选择“空项目”


2、添加源文件和头文件,如DllTest.cpp和DllTest.h
3、头文件和源文件中分别添加测试用的加法函数(Add)的声明和实现,代码如下:

//DllTest.h#pragma once#ifdef DLL_EXPORT_BUILD    #define DLLTEST_API __declspec(dllexport)#else    #define DLLTEST_API __declspec(dllimport)#endif#ifdef __cplusplusextern "C"{#endif // __cplusplusDLLTEST_API int Add(int a, int b);#ifdef __cplusplus}#endif // __cplusplus//DllTest.cpp#define DLL_EXPORT_BUILD#include "DllTest.h"DLLTEST_API int Add(int a, int b){return a+b;}

4、编译链接后会生成DllTest.lib和DllTest.dll两个文件,lib文件含有导出函数(Add)在dll文件中的信息,调用该动态库的时候会用到

注1:在头文件中使用DLL_EXPORT_BUILD宏来决定函数是导出还是导入,在动态库工程中需定义DLL_EXPORT_BUILD宏,这时DLLTEST_API宏定义为__declspec(dllexport),Add函数为导出,在引用该动态链接库的工程中则不需要定义DLL_EXPORT_BUILD,表示Add函数为导入。

注2:extern "C"声明告诉编译器以C语言的方式编译链接其中的函数,这样就不会改变函数名称。如果未加此声明,在dll文件中的函数名就不是Add了,动态调用中通过GetProcAddress获得的函数指针将为空,静态调用时可不加此声明


二、调用动态链接库
调用动态链接库的方法有静态调用和动态调用
1、静态调用:要用到.h和.lib以及.dll文件,假设需要引该动态库的工程名为A,调用“Add”函数的文件为A.cpp
(1)将.h和.lib以及.dll分别复制到工程A的相应位置,.dll文件一般与最终生成的可执行文件同一目录。
(2)在工程A的“属性->链接器->输入->附加依赖项”添加DllTest.lib文件的路径
(3)在A.cpp文件中包含DllTest.h文件,之后就可以直接调用Add函数
第(2)步也可以不在属性中设置,而在代码中引用#pragma comment(lib,"DllTest.lib")

2、动态调用:只需要.dll文件,但是要知道其中函数的名称(在这里是Add)
(1)将.dll文件放到工程A相应位置
(2)使用LoadLibrary/FreeLibrary加载/释放动态库,使用GetProcAddress获取函数地址(函数指针),代码如下:

#include"DllTest.h"#include#includetypedef int(*AddProc)(int, int);int main(){HMODULE hLib = ::LoadLibrary(TEXT("DllTest.dll"));if (hLib){AddProc proc = (AddProc)::GetProcAddress(hLib, "Add");if (proc){std::cout << proc(10, 20) << std::endl;}::FreeLibrary(hLib);}return 0;}

原创粉丝点击