我使用名为“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/