如何解决 Windows 10“Threshold 2”更新(1511,内部版本 15086)后应用程序无法启动并出现 STATUS_DLL_INIT_FAILED (0xc0000142) 的问题

问题描述 投票:0回答:2

我们发布了一个 Windows 桌面应用程序(使用 Visual C++ 2013 和

v120_xp
平台工具集构建),该应用程序在 Windows 10 上运行良好,但我们已经开始收到安装了我们的应用程序的“Threshold 2”更新的用户的报告现在无法启动,显示以下错误消息:

应用程序无法正确启动(0xc0000142)。单击“确定”关闭应用程序。

错误代码是

STATUS_DLL_INIT_FAILED
,因此我们可能正在寻找无法初始化的DLL。

我们尝试通过观察在调试器中启动的应用程序并使用进程监视器查看正在加载哪些 DLL 来解决此问题。最后加载的 DLL(在安装了 Threshold 2 的机器上)是

davhlpr.dll
。当我们观察应用程序在没有 Threshold 2 的 Windows 10 上启动时,它启动时根本没有明显加载该 DLL。这表明问题可能与
davhlpr.dll
有关,但我们的代码并未明确依赖于该 DLL,而且我不知道它是什么。

还有人见过这样的事情吗?

有人对我们如何解决这个问题有任何想法吗?在尝试了调试器和进程监视器之后,我已经没有主意了。

c++ windows dll windows-10-desktop
2个回答
8
投票

我们最终弄清楚了这件事的真相。我们采取的方法如下:

  1. 告诉链接器延迟加载我们的应用程序依赖的所有 DLL(将任何初始化问题推迟到应用程序启动之后)。
  2. 运行应用程序直到它崩溃,结果是在加载
    comdlg32.dll
    时显示“打开”对话框。
  3. 创建一个简单的测试程序,just使用
    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
解决了它。


0
投票

我遇到了类似的问题,其中一个程序在 Win 7(也是 Win 2008 服务器)上编译和启动没有任何故障,但在 Win 10 机器上失败。对我有用的一个技巧是对 exe 进行“故障排除”(使用Win 10 操作系统)。

  • 右键单击可执行文件并选择“兼容性疑难解答”选项。
  • 然后选择“疑难解答程序”,然后选择“程序在早期版本的 Windows 中运行”。 (第一个复选框。)
  • 选择操作系统(我的是Win 7)并继续下一步。

确保“测试程序”并进一步选择“保存设置”选项。

© www.soinside.com 2019 - 2024. All rights reserved.