我无法在作业项目中加载DLL。
这是头文件:
我已省略了有效且与该问题无关的代码。基本上,hinstLib
不是NULL
,但是当执行行Filter = (FILTPTR) GetProcAddress(hinstLib, "Filter");
时,Filter
没有值。在我看来,这似乎是在找到DLL,但无法在DLL中找到函数“ Filter”,而且我不知道为什么,尽管我可能是错的。我仍然不知道其中的一些工作原理。
这是DLL:
有任何想法吗?感谢所有帮助!
答案 0 :(得分: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"
答案 1 :(得分:0)
执行行
Filter = (FILTPTR) GetProcAddress(hinstLib, "Filter");
时,Filter
没有任何值。在我看来,这似乎是在找到DLL,但无法在DLL中找到函数“ Filter”,而且我也不知道为什么
该功能可能以修饰的名称导出。您没有指定调用约定,因此默认值通常为__cdecl
,该函数名用下划线作为前缀,因此将其导出为"_Filter"
。但这是特定于编译器的行为,因此请使用PE查看器/转储器仔细检查DLL的EXPORTS
表,以查看正在导出的 actual 名称。您可能需要向项目中添加一个.def
文件,以确保根据需要将该功能导出为"Filter"
。