在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中获取版本信息的任何提示?
答案 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;
因此,只要您只想要当前配置中的值(在我的情况下正是我所需要的),这就很容易。
一些注意事项: