Windows 10"阈值2"更新后如何解决应用程序无法启动STATUS_DLL_INIT_FAILED(0xc0000142)(1511,build 15086)

Ano*_*yne 6 c++ windows dll windows-10-desktop

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

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

错误代码是STATUS_DLL_INIT_FAILED,因此我们可能正在寻找无法初始化的DLL.

我们已经尝试通过观察在调试器中启动的应用程序并使用Process Monitor查看正在加载哪些DLL来对此进行故障排除.加载的最后一个DLL(在安装了阈值2的计算机上)是"davhlpr.dll".当我们在没有阈值2的Windows 10上观看我们的应用程序启动时,它开始时根本没有加载该DLL.这表明该问题可能与davhlpr.dll有关,但我们的代码并没有明确依赖于该DLL,我不知道它是什么.

有没有人见过这样的东西?

有没有人对我们如何解决这个问题有任何想法?在尝试调试器和Process Monitor之后,我没有想法.

Ano*_*yne 5

我们最终走到了最底层.我们采取的方法如下:

  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来解决它.