dll - GetProcAddress 找不到我的函数

标签 dll getprocaddress

我使用名为“render()”的函数创建了一个 DLL,我想将它动态加载到我的应用程序中,但 GetProcAddress 找不到它。这是 DLL .h:

#ifdef D3D_API_EXPORTS
#define D3D_API_API __declspec(dllexport)
#else
#define D3D_API_API __declspec(dllimport)
#endif

D3D_API_API void render();

这是 DLL .cpp:
#include "stdafx.h"
#include "D3D_API.h"
#include <iostream>

D3D_API_API void render()
{
    std::cout << "method called." << std::endl;
}

这是尝试使用该功能的应用程序:
#include "stdafx.h"
#include <windows.h>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    HINSTANCE myDLL = LoadLibrary( L"D3D_API.dll" );

    if (myDLL == NULL) {
        std::cerr << "Loading of D3D_API.dll failed!" << std::endl;
    }

    typedef void (WINAPI *render_t)();

    render_t render = (render_t)GetProcAddress( myDLL, "render" );

    if (render == NULL) {
        std::cerr << "render() not found in .dll!" << std::endl;
    }
    return 0;
}

我的目标是使用统一的 API 通过它们自己的 .DLL 制作一个支持 D3D 和 OpenGL 的 3D 引擎。我在记事本中查看了 .dll,有一个字符串“render”。

最佳答案

您导出的函数被视为 C++ 函数(因为 *.cpp 文件扩展名),因此 C++ name mangling用于修饰导出的函数名。如果您使用 Dependency Walker使用 Microsoft 的工具来检查您创建的 DLL,您将看到函数的全名。

您可以在导入代码中使用该修饰名称,也可以强制编译器以 C 样式导出您的函数,即以当前导入代码期望的未修饰形式导出。

您可以通过添加 extern "C" 来告诉编译器这样做。到您的函数签名。像这样的东西:

extern "C" D3D_API_API void render();

现在您的导入代码应该可以正常工作。

关于dll - GetProcAddress 找不到我的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2601908/

相关文章:

c++ - 如何隐藏 C++ dll 中的类?

c# - Unicode 字符串和 FreeHGlobal 问题?

dll - .lib和.dll向后兼容性

c# - 如何在 Iron python 中加载用 C++ 编写并用 C# 包装的 DLL?

c++ - 在调试或 Release模式下使用 DLL?

c++ - getProcAddress - 返回 NULL

delphi - 在Delphi XE6 x64下编译时GetProcAddress无法运行

c - Hook GetProcAddress 会导致堆栈损坏吗?

c++ - 使用 GetProcAddress 和 EasyHook Hook 类方法和构造函数

c++ - 快速一个 : GetProcAddress of Struct member?