【问题标题】:Why can applications developed with Embarcadero XE6 or higher not target XP?为什么使用 Embarcadero XE6 或更高版本开发的应用程序不能针对 XP?
【发布时间】:2023-03-03 03:55:04
【问题描述】:

我尝试在 XE7 32 位下构建一些较旧的应用程序。当我在 XP 下执行它们时,它们执行得很好,尽管在 https://www.embarcadero.com/products/cbuilder/faqhttps://www.embarcadero.com/products/delphi/faq 中给出了信息。

换句话说,Embarcadero 说在 XE6+ 下构建的应用程序不应该在 XP 下执行,但它确实可以(至少我的可以)。

大概是因为 XE6+ 编译器可以产生 XP 无法处理的 API 调用。

我的问题是:这些非 XP API 调用是否会因“正常”GUI 活动而生成,或者只有在我明确使用 XP 中不可用的功能(例如 Windows 7 任务栏)时才会发生此类调用API)。

我想迁移到 XE7/XE8 进行开发,但我需要我的可执行文件与 XP 保持兼容。

【问题讨论】:

  • Embarcadero 基本上是在说他们不会支持它。

标签: delphi windows-xp c++builder


【解决方案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 放到设计表面上。这种制作非视觉组件的顶级方式。
猜你喜欢
  • 2014-08-27
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
相关资源
最近更新 更多