vc++ 应用程序向后兼容性
Posted
技术标签:
【中文标题】vc++ 应用程序向后兼容性【英文标题】:vc++ application backwards compatibility 【发布时间】:2020-02-03 07:28:14 【问题描述】:我有一个使用 VS 2019 和最新 SDK 开发的软件。在 Windows 10 操作系统上运行是可以的,但是当尝试在较旧的 Windows 操作系统(7 或 XP)上运行时,它不起作用(应用程序无法正确启动 (0xc0150002))。我已经尝试从 2008 年到 2019 年安装必要的 vc++ 可再发行组件,但它仍然无法正常工作。我尝试使用具有较旧 Windows 操作系统的虚拟机进行测试。
对于如何实现这一点有什么建议吗?或者我是否需要在旧版本的 Visual Studio 中安装和编译我的程序以使其与旧操作系统兼容?
【问题讨论】:
通常这应该有效。但是,您可能会链接一些 Win10 库(或它们的版本,然后您可能必须动态加载 dll...) 对于 Windows XP,您需要在项目属性中使用特殊的平台工具集 IIRC v141 是仍然支持 XP 的最新版本)。 v142 是 VS2019 的最新版本,也适用于 Win7。 我的平台工具集是 v142。 vc++ redist 适用于 2015-2019 年。我还将它安装在 Windows 7 虚拟机上。它仍然行不通。至于XP,我尝试使用VS2015-Windows XP,但出现错误C1083
“它不起作用” 不是问题陈述。
@IInspectable 你能就我如何解决这个问题提供任何建议吗?
【参考方案1】:
您正在寻求找出正在发生的事情的方法。
在Dependencies 中打开应用程序,看看是否可以在那里找到问题。如果失败了,那么Process Monitor 将是我的下一步,但要在其中发现问题并不容易。一定要仔细看。
另一个步骤是尝试在其他操作系统中调试应用程序。你可以在那里安装 Visual Studio,也可以debug the app remotely
【讨论】:
非常感谢@Dialectus 提供这些信息。使用依赖项我发现了 Windows 7 上的问题。至于 XP,我仍在研究其他可能的解决方案。【参考方案2】:正如上面的 cmets 已经指出的那样,以及在其他关于同一错误的问题的答案中,问题是依赖关系。通常解决方案很简单(安装明显缺失的 SDK/运行时)。
但有时缺少什么并不明显,尤其是在处理依赖于其他第 N 方遗留部件的遗留第 3 方组件时。
错误描述(来自https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/596a1078-e883-4972-9bbc-49e60bebca55),说
0xC0150002 STATUS_SXS_CANT_GEN_ACTCTX
Windows was unble to process the application binding information. Refer to the system event log for further information.
这并不能解决问题,但提供了一个有价值的线索:系统事件日志。
打开 Windows Event Viewer
应用程序并导航到 Windows Logs > Application
- 在那里您应该会找到一个错误条目(很可能是最新的),为您提供有关缺少的依赖项或依赖项的详细信息。
例如,尝试加载 ControlCAN.DLL
(CAN 总线接口 DLL)的应用程序无法启动,因为该 DLL 依赖于系统中不存在的 VS2008 运行时:
Activation context generation failed for "C:\path\to\program\ControlCAN.dll". Dependent Assembly Microsoft.VC90.MFC,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" could not be found. Please use sxstrace.exe for detailed diagnosis.
【讨论】:
以上是关于vc++ 应用程序向后兼容性的主要内容,如果未能解决你的问题,请参考以下文章
Visual C++ 2012 可再发行版是不是与 2010 版本向后兼容?
我的OpenGL学习进阶之旅OpenGL ES 3.0和向后兼容性