在c ++文件中调用dll

时间:2013-03-18 17:12:57

标签: 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;
 }

之后我创建了一个我要调用的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()函数?

2 个答案:

答案 0 :(得分:5)

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

  1. LoadLibrary返回HMODULE而不是HINSTANCE
  2. 函数指针的返回值错误,调用约定不正确。
  3. 函数名称区分大小写,您必须考虑名称修饰。
  4. 您根本没有进行任何错误检查。您的代码可能在调用GetProcAddress时失败,返回NULL,然后在您尝试调用NULL处的函数时发生炸弹。
  5. 所以你需要这样的东西:

    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文件而不是调用LoadLibraryGetProcAddress要容易得多。如果可以的话,我现在就改用这种方式。

答案 1 :(得分:0)

您需要专门搜索并查找您要查找的特定功能,请查看以下链接: Calling functions in a DLL from C++