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

时间:2018-07-04 19:49:40

标签: delphi delphi-10.2-tokyo toolsapi otapi

在Delphi 2007中,我可以使用以下ToolsAPI调用轻松获得当前项目的版本信息:

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;

在Delphi 10.2.3中,无论实际版本号如何,它始终将返回版​​本1.0.0.0。这是“简单”的情况:一个VCL应用程序。

我还尝试了返回一个TStrings指针的“ Keys”值。在那里,我还得到了FileVersion字符串,但它始终为“ 1.0.0.0”。

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

关于如何在Delphi 10.2中获取版本信息的任何提示?

2 个答案:

答案 0 :(得分:10)

版本信息的有效值存储在内部配置平台的单独配置中。要访问配置,请首先获取 IOTAProjectOptionsConfigurations 的接口:

cfgOpt := project.ProjectOptions as IOTAProjectOptionsConfigurations;

然后遍历每个 IOTABuildConfiguration

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

请注意,每个 IOTABuildConfiguration 可以具有多个平台和子代:

  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;

根据当前选择的平台和构建配置,可以使用不同的版本信息值。可以从 IOTAProject 属性 CurrentPlatform CurrentConfiguration 中检索当前平台和配置。

答案 1 :(得分:3)

在阅读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. 获取IOTAProjectOptionsConfigurations接口
  3. 获取当前活动的配置
  4. 使用GetValue读取值。注意版本信息属性的新名称。另外请注意,必须为IncludeInheritedValues参数传递True。

一些注意事项:

  • 您可以使用GetPropertyCount()和GetPropertyName()枚举可用属性。
  • 您也可以使用属性Value ['name'],而不是像上面那样调用GetValue('name',True)。它会根据需要自动检索递归到祖先配置的结果值。
  • 还有一个选项可以通过AsInteger属性获取类型转换值。同样,这也考虑了祖先的配置。请注意,如果类型转换失败,这可能会引发异常。
  • 如果未为当前配置或任何祖先检查“包含版本信息”选项,则无论何种原因,GetValue调用都会返回版本1.0.0.0。似乎没有办法检查该选项,但我在这里可能是错的。
  • 通过重新路由ProjectOptions.Values ['MajorVersion']和对当前配置值的相关调用,Embarcadero可以轻松提供向后兼容性。他们没有,好的,他们的选择,但是在那种情况下,我希望有一些文档。
  • 更改可追溯到Delphi XE。