-1

我在我的作业项目中加载 DLL 时遇到问题。

这是头文件:

我省略了有效且与问题无关的代码。基本上,hinstLibis notNULL但是当行Filter = (FILTPTR) GetProcAddress(hinstLib, "Filter");执行时,Filter没有任何价值。对我来说,似乎是说找到了 DLL,但在 DLL 中找不到函数“Filter”,我不知道为什么,尽管我可能是错的。我仍然没有弄清楚其中一些是如何工作的。

这是DLL:

有什么想法吗?非常感谢所有帮助!

  • 詹姆士
4

2 回答 2

0

你的说明符是错误的。一个好的、简洁的方法是在 DLL 和 APP 中使用相同的头文件,定义导出-导入接口。它使用如下宏:

#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif

和声明:

extern "C" MY_DLL_API int Filter(int* data, int count, const WCHAR* parameterString);

库的 .cpp 文件将使用此标头并定义 MY_DLL_EXPORTS。

如果我理解你的代码是正确的,那么你做了它以便链接器尝试从两个模块中导出相同的函数?另外,函数的原型实际上应该是 C 兼容的extern "C"

于 2018-12-13T03:35:06.513 回答
0

当该行 Filter = (FILTPTR) GetProcAddress(hinstLib, "Filter"); 被执行时, Filter 没有任何价值。对我来说似乎是说找到了 DLL,但在 DLL 中找不到函数“Filter”,我不知道为什么

该函数可能使用修饰名称导出。您没有指定调用约定,因此默认值通常是__cdecl,它在函数名称前加上下划线,因此它将被导出为"_Filter"。但这是特定于编译器的行为,因此请EXPORTS使用 PE 查看器/转储器仔细检查 DLL 的表,以查看正在导出的实际名称。您可能需要向.def项目中添加一个文件,以确保根据"Filter"需要导出函数。

于 2018-12-13T04:06:58.297 回答