在c ++文件中调用dll

szu*_*rse 1 c++ dll

我创建了一个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;
 }
Run Code Online (Sandbox Code Playgroud)

之后我创建了一个我要调用的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;
}
Run Code Online (Sandbox Code Playgroud)

如何调用Hello()函数?

Dav*_*nan 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();
Run Code Online (Sandbox Code Playgroud)

函数名称因为您使用而装饰__stdcall.如果您使用过__cdecl或.def文件,那么就没有装饰.我假设MSVC装饰.似乎装饰与您的编译器不同,mingw,并且函数被命名"Hello@0".

坦率地说,使用.lib文件而不是调用LoadLibrary和更容易GetProcAddress.如果可以,我现在就改用这种方式.