2 回答
TA贡献1848条经验 获得超6个赞
LoadLibrary不会做你认为它做的事情。它加载DLL到当前进程的内存,但它并不会神奇地导入它定义的功能!这是不可能的,因为LoadLibrary在运行时调用时,链接器会在编译时解析函数调用(请记住,C ++是一种静态类型语言)。
您需要一个单独的WinAPI函数来获取动态加载函数的地址:GetProcAddress。
例
#include <windows.h>
#include <iostream>
/* Define a function pointer for our imported
* function.
* This reads as "introduce the new type f_funci as the type:
* pointer to a function returning an int and
* taking no arguments.
*
* Make sure to use matching calling convention (__cdecl, __stdcall, ...)
* with the exported function. __stdcall is the convention used by the WinAPI
*/
typedef int (__stdcall *f_funci)();
int main()
{
HINSTANCE hGetProcIDDLL = LoadLibrary("C:\\Documents and Settings\\User\\Desktop\\test.dll");
if (!hGetProcIDDLL) {
std::cout << "could not load the dynamic library" << std::endl;
return EXIT_FAILURE;
}
// resolve function address here
f_funci funci = (f_funci)GetProcAddress(hGetProcIDDLL, "funci");
if (!funci) {
std::cout << "could not locate the function" << std::endl;
return EXIT_FAILURE;
}
std::cout << "funci() returned " << funci() << std::endl;
return EXIT_SUCCESS;
}
此外,您应该正确地从DLL 导出您的函数。这可以这样做:
int __declspec(dllexport) __stdcall funci() {
// ...
}
正如Lundin指出的那样,如果您不再需要它,那么将句柄释放到库中是一种很好的做法。如果没有其他进程仍然拥有同一DLL的句柄,这将导致它被卸载。
- 2 回答
- 0 关注
- 696 浏览
添加回答
举报