如何确定创建Delphi项目的Delphi版本

25

我正在尝试自动确定在计算机上安装的 Delphi 版本(从 Delphi 5 到 XE2)中使用哪个版本打开给定的项目,以免错误升级该项目。

在 Delphi 7 之前每个项目都有一个 .ini 格式的 .dof 文件。 Delphi 5 没有任何可能有所帮助的条目,但是从 Delphi 6 开始,有一个 [FileVersion] 部分,其中包含以下值:

  • Delphi 5:N/A
  • Delphi 6:6.0
  • Delphi 7:7.0

所以我猜这就解决了,因为旧的 Delphi 版本与我无关。

对于 Delphi 2005 和 2006,有一个以 XML 格式表示的 .bdsproj 文件,其中包含一个版本条目: \BorlandProject\PersonalityInfo\Option\Option

在 Delphi 2005 中,它看起来像这样:

<Option Name="Version" Type="String">1.0</Option>

在 Delphi 2006 中是这样的:

<Option Name="Version">1.0</Option>

因此,我可以查看属性“Type”是否存在,并根据此决定使用 Delphi 2005 还是 2006。 请问是否有人可以查看他的 Delphi 2005 和 2006 项目,并验证这种差异?(或者您是否有更好的想法?)

编辑:我刚刚尝试了验证,并发现 Delphi 2005 并不总是添加 Type 属性。所以我现在卡住了。

编辑:也许存储在那里的 GUID 对于 Delphi 版本是唯一的?

  • Delphi 2005:{87D03616-A4C7-4B5A-AF0F-0164EA60BC59}
  • Delphi 2006: {CFE1BEE6-6FDE-4241-8CA5-D38D14EAA768}
  • 我有所怀疑,这个GUID可能代表不同的产品(如专业版/架构师等)。但也许你可以验证一下?

    从Delphi 2007开始,.dproj文件采用了不同的XML格式。我在Delphi 2007格式中未找到任何版本条目,但从Delphi 2009开始似乎有以下条目:

    \project\PropertyGroup\ProjectVersion

    以下是我在我的.dproj文件中找到的值:

    • Delphi 2007: 不适用
    • Delphi 2009: 12.0
    • Delphi 2010: 12.0
    • Delphi XE: 12.3
    • Delphi XE2: 13.4

    如果这些是正确的,我可以可靠地确定Delphi 2007、XE和XE2。但我要如何区分Delphi 2009和2010呢?

    此外,这些数字对我来说看起来很奇怪。有人知道Delphi的各种更新之间是否有任何差异,例如原始的Delphi XE2发布时是否从13.0开始,在每次更新后递增小数点后面的数字?但如果是这样,Delphi XE如何获得12.3呢?

    (有一个类似的问题How can I tell what version of Delphi was used to create a project但那里只有一个相对有限的答案。)

    如果有其他人需要此信息:我刚刚在Delphi Wiki上添加了一个页面,该页面总结了所有答案,并为新版本的Delphi(目前为止,包括Delphi 10.4.1)添加了信息。


    为什么需要这个?你肯定知道你的项目是用哪个版本的 Delphi 构建的。 - David Heffernan
    @DavidHeffernan 请看下面的答案。 - dummzeuch
    我建议遵循简单的命名规则,以清楚地标识特定项目文件的目标 Delphi 版本。例如,我们将项目文件放在子文件夹中。因此,文件夹名称指示要使用的 Delphi 版本。 - Disillusioned
    4个回答

    11
    我已经比较了Delphi 2005和2006的.bdsproj文件,它们没有任何区别。此外,Delphi 2009和2010创建的.dproj文件也没有区别。
    所以答案是:
    • 如果存在.dproj文件 -> 读取\project\PropertyGroup\ProjectVersion
      • 为空 -> Delphi 2007
      • 12.0 -> Delphi 2009或2010
      • 12.2或12.3 -> Delphi XE1(根据Uwe Schuster)
      • 13.4 -> Delphi XE2
    • 如果存在.bdsproj文件 -> Delphi 2005或2006
    • 如果存在.dof文件 -> 读取[FileVersion]\ version
      • 空 -> Delphi 5(或可能更早)
      • 6.0 -> Delphi 6
      • 7.0 -> Delphi 7
    不幸的是,这不能让我编写一个自动启动正确的Delphi版本的程序。
    也许我会让程序询问用户是否有两个可能性,并将他的答案存储在.ini文件中,以便下次程序知道要启动哪个Delphi版本。
    顺便说一下:我之所以研究这个问题,是因为我曾几次意外打开Delphi 2007项目,并使用较新的Delphi版本升级了它,导致我必须手动撤销这些更改。这变得非常烦人,我想通过将自己的程序注册为.dpr文件的处理程序来避免这种情况。

    4
    如果您手动撤销更改,那么您需要使用版本控制。 - David Heffernan
    1
    @DavidHeffernan:所谓“手动”,是指在TortoiseSVN中单击文件并选择还原。这并不像实际编辑文件那样困难,但仍然很烦人。顺便说一下:我现在通过向项目添加批处理文件来解决这个问题,以在正确的IDE中打开它。 - dummzeuch
    单元搜索路径可能提供有关项目链接的编译器版本的提示。 - bvj
    1
    这是完整的答案。我原本想自己创建一个启动器,直到我开始将一个文件添加到项目目录中,这个文件表示要使用哪个Delphi版本。我将文件命名为Delphi<版本>(如果只有一个平台:<平台>).txt,并在其中记录对项目所做的更改等其他内容。当您将项目升级到新版本的Delphi时,请将此受版本控制的文件重命名,以便在历史记录中反映出来。 - Darian Miller
    顺便说一句:现在已经有一个工具可以做到这一点了:https://github.com/RRUZ/delphi-dev-shell-tools。 - Uli Gerhardt

    7

    *PROJ文件中的版本号不受发布或更新的限制,也不是所有版本都会面世。

    • Delphi XE RTM使用版本12.2
    • Delphi XE Update #1使用版本12.3
    • Delphi XE2(从RTM到Update #4)使用版本13.4

    4

    刚安装了XE3(RTM版)。 14.3 XE3(C++和Delphi)。


    1
    14.4:XE4和15.1:XE5 - Uffe Kousgaard
    15.3:XE5(更新2);和16.0:XE7 - Martijn

    3
    今天我在谷歌上搜索Delphi版本(标准版、专业版、企业版)时发现了这个主题。
    无论如何,我检查了分布在我的机器上的一些.dof文件,并且这些文件与古老的Delphi版本有关:
    如果存在一个.dof文件->阅读[Directories]/Packages
    Delphi 3
    [Directories]
    OutputDir=
    UnitOutputDir=
    SearchPath=
    Packages=VCLX30;VCL30;INETDB30;INET30;
    

    Delphi 5

    [Directories]
    OutputDir=.
    UnitOutputDir=.
    PackageDLLOutputDir=.
    PackageDCPOutputDir=.
    SearchPath=
    Packages=Vcl50;Inet50;Inetdb50;Vclx50;Indy50;
    

    附加信息可以在dof文件的末尾找到:

    D3:

    [Excluded Packages]
    C:\Program Files\Borland\Delphi 3\Bin\DCLDSS30.dpl=Delphi Decision Cube Components
    C:\PROGRAM FILES\BORLAND\DELPHI 3\BIN\DCLTEE30.DPL=Delphi TeeChart Components
    

    D5:

    [Excluded Packages]
    $(DELPHI)\Bin\CorIde50.bpl=Borland Core IDE Package
    $(DELPHI)\Bin\direct50.bpl=Borland Direct IDE Package
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接