Dll GetProcAddress找不到我的函数

Dll GetProcAddress找不到我的函数,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 "stdaf

我用一个名为“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;
}
#包括“stdafx.h”
#包括“D3D_API.h”
#包括
D3D_API_API void render()
{

STD::CUT< P>您导出的函数被视为C++函数(因为*.CPP文件扩展名),因此C++用于修饰导出的函数名。如果使用微软的工具检查您创建的DLL,您将看到函数的全名。 您可以在导入代码中使用该修饰名称,也可以强制编译器以C风格导出函数,即以当前导入代码所期望的未修饰形式导出函数

您可以通过在函数签名中添加
extern“C”
来告诉编译器这样做。类似如下:

extern "C" D3D_API_API void render();

现在,您的导入代码应该可以像expexted一样工作。

正如对答案的评论所说:

使用“ExtLead”C“”将删除任何C++名称,但仍然会留下 为了导出普通名称,您应该查看 使用.DEF文件。请参阅

您需要向项目中添加一个扩展名为.DEF的新文件,其内容与以下内容类似:

LIBRARY      "MyRenderLib"

EXPORTS
render
然后在DLL头中不使用uu declspec(dllexport),只使用外部“C”


我尝试在导入代码中使用修饰名称,即
GetProcAddress(myDLL,”??0MyObject@my_name_space@@QAE@XZ“”;
且返回值为
NULL
。您确定这应该有效吗?若要添加此项,请使用“extern”C将删除任何C++名称,但仍会留下C名称。为了导出普通名称,您应该使用.DEF文件查看。
LIBRARY      "MyRenderLib"

EXPORTS
render
extern "C" void render();