我们发布了一个 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,而且我不知道它是什么。
还有人见过这样的事情吗?
有人对我们如何解决这个问题有任何想法吗?在尝试了调试器和进程监视器之后,我已经没有主意了。
我们最终弄清楚了这件事的真相。我们采取的方法如下:
comdlg32.dll
时显示“打开”对话框。comdlg32.dll
显示“打开”对话框。长话短说:事实证明,失败是由于一个名为
fwbase.dll
的 Windows 组件(显然是 Windows 防火墙的一部分)造成的,comdlg32.dll
出于某种原因试图加载该组件。我们的应用程序包含一个名为 fwBase.dll
的组件(AMD Framewave 库的一部分),Windows 加载程序可能不会尝试加载 fwbase.dll
,因为它认为它已经加载了。此后不久灾难就接踵而至。
此时,我不确定这是 Windows 中的错误还是什么,但我们通过重命名
fwBase.dll
解决了它。
我遇到了类似的问题,其中一个程序在 Win 7(也是 Win 2008 服务器)上编译和启动没有任何故障,但在 Win 10 机器上失败。对我有用的一个技巧是对 exe 进行“故障排除”(使用Win 10 操作系统)。
确保“测试程序”并进一步选择“保存设置”选项。