加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

dll – GetProcAddress无法找到我的函数

发布时间:2020-12-13 22:36:27 所属栏目:Windows 来源:网络整理
导读:我用一个名为“render()”的函数创建了一个DLL,我想将它动态加载到我的应用程序中,但是GetProcAddress无法找到它.这是DLL .h: #ifdef D3D_API_EXPORTS#define D3D_API_API __declspec(dllexport)#else#define D3D_API_API __declspec(dllimport)#endifD3D_A
我用一个名为“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用于装饰导出的函数名称.如果您使用Microsoft的 Dependency Walker工具检查您创建的DLL,您将看到函数全名.

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

您可以通过在函数签名中添加extern“C”来告诉编译器.像这样的东西:

extern "C" D3D_API_API void render();

现在您的导入代码应该像被驱逐的那样工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读