我创建了一个DLL文件(helloWorld.dll):
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#define DLL_FUNC extern "C" __declspec(dllexport)
DLL_FUNC int __stdcall Hello() {
MessageBox(HWND_DESKTOP, "Hello, world", "MEssage", MB_OK);
return 0;
}
之后我创建了一个我要调用的cpp(useDLL.cpp)
#include <windows.h>
#include <stdio.h>
int main () {
typedef void (*pfunc)();
HINSTANCE hdll = LoadLibrary("HelloWorld.dll");
pfunc Hello;
Hello = (pfunc)GetProcAddress(hdll, "hello");
Hello();
return 0;
}
如何调用Hello()函数?
答案 0 :(得分:5)
问题中的代码包含许多错误:
LoadLibrary
返回HMODULE
而不是HINSTANCE
GetProcAddress
时失败,返回NULL
,然后在您尝试调用NULL
处的函数时发生炸弹。所以你需要这样的东西:
typedef int (__stdcall *HelloProc)();
....
HMODULE hdll = LoadLibrary("HelloWorld.dll");
if (hdll == NULL)
// handle error
HelloProc Hello = (HelloProc)GetProcAddress(hdll, "_Hello@0");
if (Hello == NULL)
// handle error
int retval = Hello();
由于您使用了__stdcall
,因此功能名称已修饰。如果您使用过__cdecl
或.def文件,那么就没有装饰了。我假设MSVC装饰。似乎装饰与您的编译器mingw不同,并且该函数名为"Hello@0"
。
坦率地说,使用.lib文件而不是调用LoadLibrary
和GetProcAddress
要容易得多。如果可以的话,我现在就改用这种方式。
答案 1 :(得分:0)
您需要专门搜索并查找您要查找的特定功能,请查看以下链接: Calling functions in a DLL from C++