C++/CLI DLL在Win 8.1下失败

18

我编写了一个 Win32/net DLL,在 WinXP、Win7 和 Win8 下运行良好,但在 Win8.1 下失败。

Dependency Walker 显示:API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL 未找到(user32.dll将调用它们)。

Google 意味着,微软在 8.1 中更改了一些系统 DLL(并忽略了兼容性),导致许多程序出现相同的问题。

完整的“文件未找到”列表:

API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL
API-MS-WIN-CORE-PRIVATEPROFILE-L1-1-1.DLL
MSVCR120.DLL
API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL
API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL
EXT-MS-WIN-NTUSER-UICONTEXT-EXT-L1-1-0.DLL
IESHIMS.DLL

有人知道如何解决这个问题吗?


为什么它会“失败”(起始错误消息等)?依赖项检查器的相关性是什么?(此外,那个东西不是早已过时了吗?) - deviantfan
你需要停止使用Depends.exe,它已经很长时间没有维护了。它现在无法处理许多事情,包括具有转发导出项的DLL文件,例如这些api*.dll文件。如果你需要帮助,那么你必须明确说明“它失败”的具体情况。 - Hans Passant
@HansPassant:根据我的经验,它可以很好地支持转发的导出。改变的DLL搜索顺序会让它感到困惑。 - Ben Voigt
感谢您的评论,我找到了问题所在,我忘记安装 x86 版本的 C++ 2010 可再发行程序包。 - user3600403
7
我建议重新开放这个话题。我在尝试使用boost.python嵌入Python时遇到了同样的问题。这不是一个离题的对话。 - user562566
对于未来的读者(并增强@user3600403的答案),我遇到了相同的问题,depends.exe报告如上所述。我不得不安装更新版本的C++ Redistributable,我的解决办法是2015年的版本,并且我安装了x86和x64版本。有2013、2012、2010、2008和2005版本。我建议按照相反的顺序安装它们,直到找到解决办法。所以先安装 C++ 2015 Redistributable, x86 和 x64,然后安装 C++ 2013 Redistributable, x86 和 x64......等等。真是太痛苦了! - granadaCoder
1个回答

19

依赖性分析工具 Dependency Walker 的静态分析并不可靠。Dependency Walker 基于其静态分析报告 DLL 文件的问题,并不能说明这确实是你的问题。通常,完全正常的可执行文件在静态分析时可能会报告与您描述的问题相同的问题,但实际上可以运行良好。

现在我正在查看 Dependency Walker 对我的应用程序的评估,我看到与您完全相同的一系列被认为是有问题的文件。但是该应用程序运行得非常好。简而言之,您正在看到的是错误的阳性反应。

升级操作系统时,Microsoft 绝对没有忽略兼容性。相反,它付出了非凡的努力来保持良好的兼容性。

如果您想使用 Dependency Walker 调试本机 DLL 的依赖关系问题,则真正需要使用 Profile 菜单中的动态模式。这将告诉您在运行时哪个依赖项未能加载,如果确实存在此问题。但是,根据托管代码和非托管代码之间的平衡点位于何处,可能 Dependency Walker 不是适合此工作的正确工具。

而且,您的问题可能并不是本地依赖项的问题。第一步是确切地诊断出问题所在。由于我们没有关于您遇到的错误的任何详细信息,因此这超出了本问题的范围。


我的问题是,使用我的dll的应用程序(不是我编写的)只显示一个无法加载我的dll的消息。 - user3600403
所以你需要调试一下。我的观点是问题并不像你诊断的那样。MS兼容性很好。如果你的dll是非托管的,那么请使用Dependency Walker的profile模式来查找问题。 - David Heffernan
不,你不能执行一个dll文件。你需要执行一个可执行文件。如果主机是托管进程,则可能需要使用不同的工具。不确定依赖项查找器是否能胜任此工作。 - David Heffernan
4
好的,失败了 :-/我忘记在我的Windows 8.1测试系统上安装Visual C++ Redistributable 2010/2013作为x86版本。 - user3600403
1
假设您是正确的,当SHELL32在SHLWAPI.DLL中调用第270个函数(该函数不存在)时会发生什么?现在,根据依赖项检查程序,在某些情况下,我们无法真正理解因为Windows是闭源的,SHELL32将尝试调用该函数,这将失败...这可能解释了为什么Windows不稳定... - thecarpy
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接