gpt4 book ai didi

c++ - 如何解决 Windows 10 "Threshold 2"更新(1511,内部版本 15086)后应用程序无法启动并出现 STATUS_DLL_INIT_FAILED (0xc0000142)

转载 作者:可可西里 更新时间:2023-11-01 13:26:08 28 4
gpt4 key购买 nike

我们发布了一个 Windows 桌面应用程序(使用 Visual C++ 2013 和 v120_xp 平台工具集构建),它在 Windows 10 上运行良好,但我们已经开始收到安装了我们应用程序的“Threshold 2”更新的用户的报告现在无法启动,显示以下错误消息:

The application was unable to start correctly (0xc0000142). Click OK to close the application.

错误代码是 STATUS_DLL_INIT_FAILED,所以我们大概是在寻找初始化失败的 DLL。

我们已尝试通过观察在调试器中启动的应用程序并使用进程监视器查看正在加载哪些 DLL 来解决此问题。最后加载的 DLL(在安装了 Threshold 2 的机器上)是“davhlpr.dll”。当我们观察我们的应用程序在没有阈值 2 的 Windows 10 上启动时,它启动时显然根本没有加载该 DLL。这表明问题可能与 davhlpr.dll 有关,但我们的代码并未明确依赖于该 DLL,我不知道它是什么。

有没有人见过这样的事情?

有没有人知道我们如何解决这个问题?在尝试了调试器和进程监视器之后,我失去了想法。

最佳答案

我们最终找到了真相。我们采取的方法如下:

  1. 告诉链接器延迟加载我们的应用程序所依赖的所有 DLL(将任何初始化问题推迟到应用程序启动之后)。
  2. 运行应用程序直到它崩溃,事实证明是在加载 comdlg32.dll 以显示“打开”对话框时。
  3. 创建一个简单的测试程序,只是使用 comdlg32.dll 来显示“打开”对话框。
  4. 在 Windows 10 build 15086 上运行测试程序并观察它加载了哪些 DLL,并将其与我们在应用的延迟加载版本中触发“打开”对话框时加载的 DLL 进行比较。

长话短说:事实证明,失败是由于名为“fwbase.dll”(显然是 Windows 防火墙的一部分)的 Windows 组件造成的,comdlg32.dll 出于某种原因试图加载该组件。我们的应用程序包含一个名为“fwBase.dll”的组件(AMD Framewave 库的一部分),并且 Windows 加载程序可能不会尝试加载 fwbase.dll,因为它认为它已经加载了。此后不久,灾难接踵而至。

此时,我不确定这是 Windows 中的错误还是什么,但我们通过重命名 fwBase.dll 解决了它。

关于c++ - 如何解决 Windows 10 "Threshold 2"更新(1511,内部版本 15086)后应用程序无法启动并出现 STATUS_DLL_INIT_FAILED (0xc0000142),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33782660/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com