无法获取GetProcAddress

时间:2018-12-13 03:04:54

标签: c++ function dll function-pointers getprocaddress

我无法在作业项目中加载DLL。

这是头文件:

我已省略了有效且与该问题无关的代码。基本上,hinstLib不是NULL,但是当执行行Filter = (FILTPTR) GetProcAddress(hinstLib, "Filter");时,Filter没有值。在我看来,这似乎是在找到DLL,但无法在DLL中找到函数“ Filter”,而且我不知道为什么,尽管我可能是错的。我仍然不知道其中的一些工作原理。

这是DLL:

有任何想法吗?感谢所有帮助!

  • 詹姆斯

2 个答案:

答案 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"