为什么我无法访问我的DLL函数

时间:2010-06-20 12:54:57

标签: c++ winapi dll loading name-decoration

我正在尝试使用LoadLibrary()动态加载DLL,但是我无法获取我试图调用的DLL中函数的地址。

DLL函数:(在CPP文件中)

_declspec(dllexport) void MyDllFunc()
{
    printf("Hello from DLL");
}

致电代码:

typedef void (*MyDllFuncPtr)();

int _tmain(int argc, _TCHAR* argv[])
{

    HINSTANCE LoadMe;
    LPCWSTR str = L"C:\\Users\\Tony\\Documents\\Visual Studio 2008\\Projects\\DLL Loading\\Release\\MyDll.dll";

    LoadMe = LoadLibrary(str);

    if(LoadMe != 0)
        printf("Successfully Loaded!\r\n");
    else
        printf("Loading Failed \r\n" );


    MyDllFuncPtr func;

    func = (MyDllFuncPtr)GetProcAddress(LoadMe, "MyDllFunc");

    if (func != NULL)
        func();

    FreeLibrary(LoadMe);

}

func返回NULL!

我做错了什么?

这是一个Win32控制台项目。

4 个答案:

答案 0 :(得分:3)

extern "C" _declspec(dllexport) void MyDllFunc()

答案 1 :(得分:1)

你做错了。 __declspec(dllexport)与__declspec(dllimport)配对。

#1: In the DLL, declare the function's prototype with __declspec(dllexport).
#2: In the .exe, declare the function's prototype with __declspec(dllimport).
#3: Compile the .dll. You should also get a .lib file.
#4: Link the .exe with the .lib, and compile.
#5: Success.

当您使用__declspec(dllimport)和__declspec(dllexport)时,您永远不需要触摸WinAPI函数来加载DLL。 dllimport / export为您完成所有工作。另外,你不需要extern C。

答案 2 :(得分:1)

使用decorated时,导出的函数名称为__declspec(dllexport),您可以使用extern "C"减少装饰,但是,它不会完全修饰符号,为此您需要执行此操作使用def file并将其导出为命名符号,否则您需要使用已修改/修饰的符号名称GetProcAddress,该名称在使用extern "C"导出时很短。

答案 3 :(得分:0)

如果DLL是作为C ++ DLL构建的,那么它的函数名称将会改变。这取决于编译器。我强烈建议将其设为C dll(C接口+ C ++胆量)。我现在没有关于我的例子,但你应该能够在网上找到一些东西。