1

我创建了一个 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() 函数?

4

2 回答 2

5

问题中的代码包含许多错误:

  1. LoadLibrary返回HMODULE而不是HINSTANCE
  2. 函数指针具有错误的返回值和不正确的调用约定。
  3. 函数名称区分大小写,您必须考虑名称修饰。
  4. 您根本没有进行错误检查。您的代码可能在调用时失败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".

LoadLibrary坦率地说,使用 .lib 文件而不是调用and更容易做到这一点GetProcAddress。如果可以的话,我现在就改用这种方式。

于 2013-03-18T17:18:24.627 回答
0

您需要专门搜索并找到您正在寻找的特定函数,查看此链接: Calling functions in a DLL from C++

于 2013-03-18T17:16:28.370 回答