10

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

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

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

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

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

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

4

2 回答 2

8

我们最终查明了这一点。我们采取的方法如下:

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

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

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

于 2015-12-01T18:41:25.100 回答
0

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

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

请务必“测试程序”并进一步移动以最终选择“保存设置”选项。

于 2018-08-21T08:23:55.067 回答