Windows 10“Threshold 2”更新(1511,生成15086)后如何解决应用程序无法启动STATUS_DLL_INIT_FAILED(0xc0000142)

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

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

错误代码是STATUS_DLL_INIT_FAILED,所以我们可能正在寻找一个DLL无法初始化。

我们已经做了一些尝试,通过观察在debugging器中启动的应用程序来解决这个问题,并使用Process Monitor来查看哪些DLL正在被加载。 加载的最后一个DLL(在安装了Threshold 2的计算机上)是“davhlpr.dll”。 当我们看到我们的应用程序在没有Threshold 2的Windows 10上启动时,它启动时没有明显加载该DLL。 这表明这个问题可能与davhlpr.dll有关,但是我们的代码并不明确依赖于那个DLL,我不知道它是什么。

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

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

我们最终得到了这个底部。 我们采取的做法如下:

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

长话短说:事实证明,失败是由于Windows组件被称为“fwbase.dll”(显然是Windows防火墙的一部分),comdlg32.dll试图加载出于某种原因。 我们的应用程序包含一个名为“fwBase.dll”(AMD Framewave库的一部分)的组件,并且Windows加载程序大概没有打算尝试加载fwbase.dll,因为它认为它已经加载。 之后不久就发生灾难。

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