代码之家  ›  专栏  ›  技术社区  ›  dummzeuch Stijn Sanders

如何在delphi 10.2中使用toolsapi获取当前项目的版本号

  •  4
  • dummzeuch Stijn Sanders  · 技术社区  · 7 年前

    在Delphi2007中,我可以使用以下工具sapi调用轻松获取当前项目的版本信息:

    procedure Test;
    var
      ProjectOptions: IOTAProjectOptions;
      Project: IOTAProject;
      Major: Variant;
      Minor: Variant;
      Release: Variant;
      Build: Variant;
    begin
      // GxOtaGetCurrentProject is a function in GExpert's GX_OTAUtils unit that returns the current IOTAProject
      Project := GxOtaGetCurrentProject;
      if Assigned(Project) then begin
        ProjectOptions := Project.ProjectOptions;
        if Assigned(ProjectOptions) then begin
          Major := ProjectOptions.Values['MajorVersion'];
          Minor := ProjectOptions.Values['MinorVersion'];
          Release := ProjectOptions.Values['Release'];
          Build := ProjectOptions.Values['Build'];
        end;
      end;
    end;
    

    在Delphi10.2.3中,无论实际版本号是多少,它都将返回版本1.0.0.0。这就是“简单”的例子:VCL应用程序。

    我还尝试了返回tstrings指针的“keys”值。在这里我也得到了fileversion字符串,但它总是“1.0.0.0”。

    我想这与对各种平台和配置的支持有关,但是我找不到任何关于它现在应该如何工作的文档。我还搜索了toolsapi.pas中的“version”和“release”,但没有发现任何可疑的内容。

    关于如何在Delphi10.2中获取版本信息的任何提示?

    2 回复  |  直到 7 年前
        1
  •  9
  •   Uwe Raabe    7 年前

    版本信息的有效值存储在 生成配置 平台 . 若要访问配置,请首先获取 物联网项目配置 :

    cfgOpt := project.ProjectOptions as IOTAProjectOptionsConfigurations;
    

    然后遍历每个 物联网配置 :

      for I := 0 to cfgOpt.ConfigurationCount - 1 do
      begin
        cfg := cfgOpt.Configurations[I];
        DoWhatEverWith(cfg);
      end;
    

    注意每个 物联网配置 可以有几个平台和子平台:

      for S in cfg.Platforms do
      begin
        DoWhatEverWith(cfg.PlatformConfiguration[S]);
      end;
    
      for I := 0 to cfg.ChildCount - 1 do
      begin
        DoWhatEverWith(cfg.Children[I]);
      end;
    

    根据当前选择的平台和生成配置,可以使用不同的版本信息值。当前平台和配置可以从 碘中毒 性质 当前平台 当前配置 .

        2
  •  3
  •   dummzeuch Stijn Sanders    7 年前

    在阅读了Uwe Raabe非常有用的答案后,回答我自己的问题:

    获取当前活动配置和平台的版本信息最简单的代码是:

    procedure Test;
    var
      ProjectOptions: IOTAProjectOptionsConfigurations;
      Project: IOTAProject;
      Major: Variant;
      Minor: Variant;
      Release: Variant;
      Build: Variant;
      cfg: IOTABuildConfiguration;
    begin
      // GxOtaGetCurrentProject is a function in GExpert's GX_OTAUtils unit that returns the current IOTAProject
      Project := GxOtaGetCurrentProject;
      if Assigned(Project) then begin
        // as per Uwe's answer
        ProjectOptions := Project.ProjectOptions as IOTAProjectOptionsConfigurations;
        if Assigned(ProjectOptions) then begin
          // this is the currently active configuration
          cfg := ProjectOptions.ActiveConfiguration;
          if Assigned(cfg) then begin
            // Note that the names of the version properties are different!
            Major := cfg.GetValue('VerInfo_MajorVer', True);
            Minor := cfg.GetValue('VerInfo_MinorVer', True);
            Release := cfg.GetValue('VerInfo_Release', True);
            Build := cfg.GetValue('VerInfo_Build', True);
          end;
        end;
      end;
    end;
    

    因此,只要您只需要当前配置中的值(在我的例子中,这正是我所需要的),就很容易了。

    1. 获取当前项目
    2. 获取IoTaProjectOptions配置接口
    3. 获取当前活动的配置
    4. 使用getvalue读取值。请注意版本信息属性的新名称。还要注意,必须为includeInheritedValues参数传递true。

    一些注释:

    • 可以使用getPropertyCount()和getPropertyName()枚举可用属性。
    • 与如上所述调用getValue('name',true)不同,您还可以使用属性值['name']。它会根据需要自动检索递归到祖先配置的结果值。
    • 还可以通过asinteger属性获取类型类型类型值。同样,这也考虑到了祖先的配置。请注意,如果类型转换失败,这可能会引发异常。
    • 如果当前配置或任何祖先未选中“include version info”选项,则无论出于何种原因,getvalue都会调用return version 1.0.0.0。似乎没有办法检查这个选项,但我在这里可能错了。
    • 通过重新路由projectoptions.values['majorversion']和对当前配置值的相关调用,embarcadero可以轻松地提供向后兼容性。他们没有,好吧,他们的选择,但在这种情况下,我会期待一些文件。
    • 更改返回到delphi xe。