GetProcAddress 在 Win 7 上失败,即使 DLL 实际上导出函数(在 Win 10 上工作)

GetProcAddress fails on Win 7 even though the DLL actually exports the function (works on Win 10)

我有一个 32 位应用程序,但在 Windows 7 x64 上遇到问题。我正在加载一个 DLL。 LoadLibraryW 成功,随后对 GetProcAddress 的调用失败,错误代码为 127("procedure not found" 或类似代码)。

有趣的是,我知道该函数是由 DLL 导出的事实。我在 GetProcAddress 调用中没有输入错误。我可以看到 Depends.exe 和 DllExp.exe 的函数。完全相同的应用程序二进制文件在 Windows 10 x64 上成功地从完全相同的 DLL 加载了函数,但在 Windows 7 x64 上却没有。

更多细节:库是 dbghelp.dll,"missing" 函数是 MiniDumpWriteDump

有趣的是:dbghelp.dll 提供 API 用于检查加载到进程中的模块以及枚举这些模块导出的函数。所以,首先我为这个有问题的 dbghelp.dll 和 运行

选择了 HMODULE
auto ptrSymInitialize = (decltype(&SymInitialize))GetProcAddress(hDbgHelpDll, "SymInitialize");

成功了,这个功能确实加载了!然后我加载 SymEnumSymbols,编写枚举器回调,最后 运行 下面枚举这个 `dbghelp.dll":

中的所有函数
ptrSymEnum(GetCurrentProcess(), 0, "dbghelp*!*", &Enumerator, nullptr);

你知道吗,MiniDumpWriteDump 实际上列在那里。去图吧。

想法?

that's exactly what I've been doing, and I didn't bring dbgcore.dll

这简直是个坏主意。 Microsoft 不努力使 OS 中包含的 DLL 向后兼容。他们不必。在他们的实现中,只有接口需要兼容。他们确实利用新功能或设计更改来改进实施。

就像您在这里看到的,MinWin project 的副作用。没有合理的猜测在哪里结束,如果它现在可以在 Win7 机器上运行,那么你很幸运。也许你在没有 SP1 的 Win7 机器上不会那么幸运,也许在全新安装时缺少一些 minwin 胶水 DLL,也许 minidump 本身受到某种负面影响。无法预测。

所以永远不要这样做。 Afaik 你根本不应该这样做,一台 Win7 机器已经有 dbghelp.dll 可用。不能 100% 确定,已经太久了,Win7 正在迅速转变为新的 XP。如果您认为有必要,请始终使用可再发行版本。包含在 Windows 的 SDK 调试工具中。将其复制到与需要它的 EXE 相同的文件夹中,以免弄乱机器。

我可以看出你的意图是使用 MiniDumpWriteDump。我们还在我们的产品中制作小型转储,我是支持这一点的人。

我建议不要使用 OS 提供的 dbghelp.dll。首先,它们往往已经过时并且不支持您希望拥有的最新的小型转储功能。其次,它们已被证明是相当不可靠的。我相信他们只是缺乏太多错误修正。

我发现工作得很好的是从 Debugging Tools for Windows 包(目前是 Windows SDK 的一部分)中取出 dbghelp.dll 并将其与我们的产品一起运送。这样,我可以确定 minidumps 将具有所有最新功能,并且它可以在所有 OS 上可靠地工作。现在已经有 8 年了,OS 从 WinXP 到 Win10,我没有任何问题。

目前用的dbghelp.dll提取出来的SDK我不太清楚是用哪个版本的SDK,估计是Win7 SDK吧。从那以后我根本没有理由更新。但是,我们确实在 Win7 上使用来自 Win10 SDK 的 Debugging Tools for Windows 包没有任何问题,所以我想你也可以使用 Win10 版本。