Sur*_*ine 5 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();
Run Code Online (Sandbox Code Playgroud)
这是DLL .cpp:
#include "stdafx.h"
#include "D3D_API.h"
#include <iostream>
D3D_API_API void render()
{
std::cout << "method called." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这是尝试使用该功能的应用程序:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我的目标是使用统一的API通过自己的.DLL制作支持D3D和OpenGL的3D引擎.我在记事本中查看了.dll,并且有一个字符串"render".
Fra*_*ack 10
导出的函数被视为C++函数(因为*.cpp文件扩展名),因此使用C++ 名称修改来修饰导出的函数名称.如果您使用Microsoft 的Dependency Walker工具来检查您创建的DLL,您将看到函数的全名.
您可以在导入代码中使用该装饰名称,也可以强制编译器以C样式导出函数,即以当前导入代码所需的未修饰形式导出.
您可以通过添加extern "C"到函数签名来告诉编译器这样做.像这样的东西:
extern "C" D3D_API_API void render();
Run Code Online (Sandbox Code Playgroud)
现在您的导入代码应该像被驱逐的那样工作.