最近用到动态链接库,调用DLL文件,有两种方式,分别是显示调用和隐式调用,隐式调用是是直接将DLL文件、头文件(.h文件)、LIB文件放入到项目中,启动的时候给动态链接库分配内存,而动态链接是用函数加载dll文件,比较灵活,所以我就使用了显式调用。后来发现在代码中如果频繁使用动态链接库,还不如使用隐式调用
1.显式调用
1.1.常用函数
1.1.1LoadLibrary
将指定的模块加载到调用进程的地址空间中,语法为:
HMODULE LoadLibraryA(
[in] LPCSTR lpLibFileName
);
- lpLibFileName:动态链接库地址
- HMODULE:动态链接库模块
1.1.2GetProcAddress
从指定的动态链接库 (DLL) 检索导出函数 (也称为过程) 或变量。
FARPROC GetProcAddress(
[in] HMODULE hModule,
[in] LPCSTR lpProcName
);
- hModule:动态链接库模块
- lpProcName:函数名称,如果函数使用了命名空间,也不用写命名空间
- FARPROC:导出的函数或变量的地址,可以使用typedef定义函数指针和变量指针来使用
1.1.3FreeLibrary
释放加载的动态链接库 (DLL) 模块,并在必要时递减其引用计数。 当引用计数达到零时,将从调用进程的地址空间卸载模块,并且句柄不再有效。
BOOL FreeLibrary(
[in] HMODULE hLibModule
);
- hLibModule:动态链接库模块
- BOOL:如果该函数成功,则返回值为非零值。如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError 函数。
1.2.例子
- 定义函数指针
typedef void(*SUCESS)(const std::string&, std::string&);
- 调用函数
HMODULE utilsDll = ::LoadLibraryA("./lib/utils/utils.dll");
SUCESS sucess = SUCESS(GetProcAddress(utilsDll, "SUCESS"));
std::string out;
sucess("file", out);
FreeLibrary(utilsDll);