如何解决应用程序在 Windows 10 "Threshold 2" 更新(1511,内部版本 15086)后无法以 STATUS_DLL_INIT_FAILED (0xc0000142) 启动的问题
How to troubleshoot app failing to start with STATUS_DLL_INIT_FAILED (0xc0000142) after Windows 10 "Threshold 2" update (1511, build 15086)
我们发布了一个 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,我不知道它是什么。
还有其他人见过这样的东西吗?
有没有人知道我们如何解决这个问题?在尝试了调试器和进程监视器之后,我没有主意了。
我们最终弄清了真相。我们采取的方法如下:
- 告诉链接器延迟加载我们的应用程序依赖的所有 DLL(将任何初始化问题推迟到应用程序启动之后)。
- 运行应用程序直到崩溃,结果是 comdlg32.dll 被加载以显示 "Open" 对话框。
- 创建一个简单的测试程序,只是 使用comdlg32.dll 来显示"Open" 对话框。
- 运行 Windows 10 build 15086 上的测试程序,观察它加载了哪些DLL,与我们在延迟中触发"Open"对话框时加载的DLL进行比较-我们应用程序的加载版本。
长话短说:事实证明失败是由于名为 "fwbase.dll" 的 Windows 组件(显然是 Windows 防火墙的一部分)造成的,该组件 comdlg32.dll出于某种原因试图加载。我们的应用程序包含一个名为 "fwBase.dll" 的组件(AMD Framewave 库的一部分),并且 Windows 加载器可能没有尝试加载 fwbase.dll,因为它认为它已经加载了。此后不久,灾难接踵而至。
在这一点上,我不确定这是 Windows 中的错误还是什么,但我们通过重命名 fwBase.dll.
解决了它
我遇到了类似的问题,其中一个程序在 Win 7(也是 Win 2008 服务器)上编译和启动时没有任何问题,但在 Win 10 machine.One 上对我有用的技巧失败了 'Troubleshoot' exe(使用Win 10 OS).
- 右键单击可执行文件 & select 'Troubleshoot Compatibility' 选项。
- 然后选择 'Troubleshoot Program',然后选择 select "Program worked in earlier version of Windows."(第一个复选框。)
- Select OS(我的是 Win 7)并继续下一步。
一定要 "Test the Program" 并进一步移动到最终 select 'Save the Settings' 的选项。
我们发布了一个 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,我不知道它是什么。
还有其他人见过这样的东西吗?
有没有人知道我们如何解决这个问题?在尝试了调试器和进程监视器之后,我没有主意了。
我们最终弄清了真相。我们采取的方法如下:
- 告诉链接器延迟加载我们的应用程序依赖的所有 DLL(将任何初始化问题推迟到应用程序启动之后)。
- 运行应用程序直到崩溃,结果是 comdlg32.dll 被加载以显示 "Open" 对话框。
- 创建一个简单的测试程序,只是 使用comdlg32.dll 来显示"Open" 对话框。
- 运行 Windows 10 build 15086 上的测试程序,观察它加载了哪些DLL,与我们在延迟中触发"Open"对话框时加载的DLL进行比较-我们应用程序的加载版本。
长话短说:事实证明失败是由于名为 "fwbase.dll" 的 Windows 组件(显然是 Windows 防火墙的一部分)造成的,该组件 comdlg32.dll出于某种原因试图加载。我们的应用程序包含一个名为 "fwBase.dll" 的组件(AMD Framewave 库的一部分),并且 Windows 加载器可能没有尝试加载 fwbase.dll,因为它认为它已经加载了。此后不久,灾难接踵而至。
在这一点上,我不确定这是 Windows 中的错误还是什么,但我们通过重命名 fwBase.dll.
解决了它我遇到了类似的问题,其中一个程序在 Win 7(也是 Win 2008 服务器)上编译和启动时没有任何问题,但在 Win 10 machine.One 上对我有用的技巧失败了 'Troubleshoot' exe(使用Win 10 OS).
- 右键单击可执行文件 & select 'Troubleshoot Compatibility' 选项。
- 然后选择 'Troubleshoot Program',然后选择 select "Program worked in earlier version of Windows."(第一个复选框。)
- Select OS(我的是 Win 7)并继续下一步。
一定要 "Test the Program" 并进一步移动到最终 select 'Save the Settings' 的选项。