gpt4 book ai didi

dll - GetProcAddress 找不到我的函数

转载 作者:行者123 更新时间:2023-12-04 17:28:27 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com