为啥使用 Embarcadero XE6 或更高版本开发的应用程序不能针对 XP?
Posted
技术标签:
【中文标题】为啥使用 Embarcadero XE6 或更高版本开发的应用程序不能针对 XP?【英文标题】:Why can applications developed with Embarcadero XE6 or higher not target XP?为什么使用 Embarcadero XE6 或更高版本开发的应用程序不能针对 XP? 【发布时间】:2015-08-10 20:56:44 【问题描述】:我尝试在 XE7 32 位下构建一些较旧的应用程序。当我在 XP 下执行它们时,它们执行得很好,尽管在 https://www.embarcadero.com/products/cbuilder/faq 和 https://www.embarcadero.com/products/delphi/faq 中给出了信息。
换句话说,Embarcadero 说在 XE6+ 下构建的应用程序不应该在 XP 下执行,但它确实可以(至少我的可以)。
大概是因为 XE6+ 编译器可以产生 XP 无法处理的 API 调用。
我的问题是:这些非 XP API 调用是否会因“正常”GUI 活动而生成,或者只有在我明确使用 XP 中不可用的功能(例如 Windows 7 任务栏)时才会发生此类调用API)。
我想迁移到 XE7/XE8 进行开发,但我需要我的可执行文件与 XP 保持兼容。
【问题讨论】:
Embarcadero 基本上是在说他们不会支持它。 【参考方案1】:Embarcadero 说在 XE6+ 下构建的应用程序不应在 XP 下执行。
他们不是这么说的。 Embarcadero 不会在 XP 下进行测试,并且不会为针对 XP 的应用程序提供任何支持。然而,Marco Cantu 表示他们不会主动停止在 XP 上运行的程序。
很明显,如果您调用 XP 上不可用的函数或库,那么您的程序将无法运行。但是用 XE8 构建的简单程序可以在 XP 上运行。如果您需要使用 XP 上没有的功能,则必须使用运行时显式链接。并实现回退功能来处理程序在 XP 上运行的情况。
这里的底线是您必须在目标平台上仔细测试您的程序。
【讨论】:
谢谢。这很有意义。 在大多数情况下,RTL/VCL 对旧操作系统版本上不存在的 API 使用延迟加载。这至少可以让您的应用在较旧的操作系统上开始运行。应用程序是否会继续正常运行是另一回事。如果 RTL/VCL(或您)尝试在较旧的操作系统上调用延迟加载 API,因为它没有事先检查操作系统版本,或者检查不正确,那么您将遇到运行时错误。例如,TTaskBar
在 XP 和 Vista 上被损坏(QC #124644 和 #128865)以及其中的一些其他常见错误(QP #RSP-10260 和 #RSP-10259 )。
@Remy TTaskBar 在不支持它包装的库的系统上的预期行为是什么?
@DavidHeffernan:预期行为是它在旧系统内部禁用自身。您应该能够在设计时将TTaskBar
放到表单上,并让它在运行时在这些系统上什么也不做。您可以在其源代码中清楚地看到 Embarcadero 尝试实现了这一点,但他们并没有做得很好,有很多错误。实际上,它往往会在旧系统上引发“不支持”和“未注册”异常,或者只是简单的崩溃。因此,您通常必须先进行操作系统检查,然后在运行时动态创建它。
@Remy 这并没有让我太困扰,因为不需要将 TTaskBar 放到设计表面上。这种制作非视觉组件的***方式。以上是关于为啥使用 Embarcadero XE6 或更高版本开发的应用程序不能针对 XP?的主要内容,如果未能解决你的问题,请参考以下文章
Embarcadero RAD Studio XE6 安装没有 FireMonkey Mobile Application 解决方法