【问题标题】:Failing to GetProcAddressGetProcAddress 失败
【发布时间】:2018-12-13 03:04:53
【问题描述】:

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

这是头文件:

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

这是 DLL:

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

  • 詹姆斯

【问题讨论】:

  • 我已将函数定义移动到存储在分配解决方案中的 SLL 项目中的单独 CPP 文件中,并且发生了同样的问题,就像所有行都低于 #include "stdafx.h"
  • 您是否验证了您的 DLL 导出了您期望的符号? IIRC dumpbin.exe 实用程序应该能够告诉你。
  • 另外,为什么你的DLL的.cpp文件有#ifndef _ASEXPORT?您的 DLL 的.cpp 文件应该始终 正在导出。 (无论如何,它只是在重复 filter.h 的内容。)另外,_declspec 看起来是错误的;它应该是带有两个下划线的__declspec,尽管这应该会产生编译错误。
  • @jamesdlin 我已经改变了这两个并且发生了同样的错误
  • GetProcAddress() 失败是完全正常的,导出函数的名称通常与其文档名称不同。仔细检查的基本方法是在 DLL 上运行 Dumpbin.exe /exports。如果您没有使用 .def 文件,则其名称为“_Filter”。

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


【解决方案1】:

您的说明符错误。 一个好的、简洁的方法是在 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"

【讨论】:

  • 因为我已经把 __declspec(DLLIMPORTEXPORT) 添加到它使用的任何一个上,并且 extern"C" 被包裹在声明周围,所以它在两种情况下都做同样的工作。
  • 正如我所说,我对 C++ 和 DLL 非常陌生,并且正在努力理解它们。主应用程序和 DLL 都已使用“filter.h”
  • @JamesEaston 你只需要一个 -dllexport - 在 DLL 中。并且函数应该在DLL的cpp中定义。使用 dllimport,您可以将其用作使用该 .dll 的模块的原型并且您真的不需要第二次将其声明为 extern,您已经在 header 中这样做了。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2014-11-10
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多