dll动态加载函数
1.介绍WIN64宏
这个宏通常在 Windows 64 位编译器中定义,表示当前代码正在为 64 位 Windows 系统进行编译。
2.LoadLibrary—用于动态加载 DLL(动态链接库)文件
HMODULE LoadLibrary(LPCTSTR lpFileName);
返回值:
- 如果加载成功,LoadLibrary 函数返回一个 HMODULE 类型的句柄,表示已加载的 DLL 模块。这个句柄可以在后续的 GetProcAddress 和 FreeLibrary 函数调用中使用。
- 如果加载失败,LoadLibrary 函数返回 NULL。可以通过调用 GetLastError 函数获取更多关于错误的信息。
参数: - pFileName:指向一个以 null 结尾的字符串,表示要加载的 DLL 文件的路径。可以是绝对路径或相对路径。
3.TEXT()–用于在 Windows 平台上编写跨编译器和 Unicode/ANSI 字符集兼容的代码
TEXT() 宏用于根据当前的编译器设置和字符集自动选择正确的字符串类型。
示例:
#ifndef WIN64
h_crypto_dll = LoadLibrary(TEXT("libcrypto-1_1.dll"));
# libcrypto-1_1.dll 这里应该是一个相对路径,或者绝对路径,如果在pro文件中引入libcrypto-1_1.dll,则可以直接写
return h_crypto_dll;
#endif
tips:在使用WIN64做多平台编译适配时,要保证所有设计到多平台的逻辑均用#ifndef涵盖
4.GetProcAddress----用于从 DLL 文件中获取指定函数的地址。
FARPROC GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName
);
`参数:
hModule:指向一个已加载的 DLL 模块的句柄,由 LoadLibrary 函数返回。
lpProcName:指向一个以 null 结尾的字符串,表示要获取地址的 DLL 中的函数名。
返回值:
如果函数地址获取成功,GetProcAddress 函数返回一个指向指定函数的指针。可以使用这个指针直接调用 DLL 中的函数。
如果函数地址获取失败,GetProcAddress 函数返回 NULL。可以通过调用 GetLastError 函数获取更多关于错误的信息。`
示例:
#定义一个函数指针
#定义一个名为BIO_new_mem_buf_func的函数指针,指向的函数返回值为BIO* 参数为(const void* buf, int len)
typedef BIO* (BIO_new_mem_buf_func)(const void buf, int len);
#动态加载函数
BIO_new_mem_buf_func my_bio_new_mem_buf =
(BIO_new_mem_buf_func)GetProcAddress(h_crypto_dll, “BIO_new_mem_buf”);
#判断是否加载成功
if (!my_bio_new_mem_buf) {
QMessageBox::warning(this, “Error”, “GetProcAddress失败”, QMessageBox::Ok);
return;
}
#调用自己动态加载的函数
BIO* keybio = my_bio_new_mem_buf(Private_KEY, -1);
assert(keybio);