DELPHI编译软件时带上当前IDE的版本号

如果通过 CompilerVersion 得到的也只是编译器的版本号。

比如:delphi XE12 是 36 ,也仅此而己。

我想得到的是IDE的版本号,比如当前最新版本的DELPHI是:Embarcadero® RAD Studio 12 Version 29.0.53571.9782

我想得到 29.0.53571.9782 这个版本号;

IDE提供的API中,好象没有与之相关的东西;想要得到这个版本号,也许只能用变通的方式。

于是用DELPHI2007编译以下的代码

Delphi 复制代码
program GetIDEVER;

//{.$APPTYPE CONSOLE}

//{$R *.res}

uses
  Windows,SysUtils,Classes;

function GetFileVersion(const FileName: string): string;
var
  n, Len: DWORD;
  Buf: PChar;
  Value: Pointer;
  szName: array[0..255] of Char;
  Transstring: string;
begin
  Len := GetFileVersionInfoSize(PChar(FileName), n);
  if Len > 0 then begin
    Buf := AllocMem(Len);
    if GetFileVersionInfo(Pchar(FileName), n, Len, Buf) then begin
      Value := nil;
      VerQueryValue(Buf, '\VarFileInfo\Translation', Value, Len);
      if Value <> nil then
        Transstring := IntToHex(MakeLong(HiWord(LongInt(Value^)), LoWord(LongInt(Value^))), 8);
      StrPCopy(szName, '\stringFileInfo\' + Transstring + '\FileVersion');
      if VerQueryValue(Buf, szName, Value, Len) then
        Result := StrPas(Pchar(Value));
    end;
    FreeMem(Buf, n);
  end;

end;

var
  fn1, fn2 ,s: string;
  L: TStringList;

begin
  try

    { TODO -oUser -cConsole Main : Insert code here }
//    fn1 := ChangeFileExt(ParamStr(0), '.ini');
    fn1 := ParamStr(1);
    if FileExists(fn1) then begin
      fn2 := ParamStr(2);
      L := TStringList.Create;
      try
        s := GetFileVersion(fn1);
        L.Text := 'const IDE_VER=''' + s+''';';
        L.SaveToFile(ExtractFilePath(ParamStr(0)) + fn2);
      finally
        FreeAndNil(L)
      end;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

即可得到一个大小为 90K左右的控制台程序 GetIDEVER.exe(这就是为什么用D2007编译的原因,目前我的电脑最低是2007,用最新的DXE12,编译出来得有4.5MB左右)

然后使用CnPack提供的脚本功能;带参数执行这个 GetIDEVER.exe 即可

如:

Delphi 复制代码
program PGetIDEVER;

uses
  Windows, Messages, SysUtils, Classes,  Controls;

var
  BDSPath: string;
begin
  BDSPath := GetIdeRootDirectory+'bin\bds.exe';
  WinExecute('GetIDEVER.exe "'+BDSPath+'" "IDEVER.inc" ', 0);
end.

这样就会得到一个 IDEVER.inc

此时,只需要在你的单元文件中导入这个INC即可直接读取了

Delphi 复制代码
{$I IDEVER.inc}

然后要显示到主窗体的状态栏中:

Delphi 复制代码
Main_SBar.Panels[0].Text := IDE_VER ;

以 DELPHI2007为例:

相关推荐
00后程序员张16 小时前
iOS 开发全流程需要哪些工具?编码、调试、构建、发布阶段选择
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
nicehuai16 小时前
烧录、查变量、看日志、调驱动:H-FlashScope搞定嵌入式下载调试的瑞士军刀
ide·vscode·visual studio
2501_916008892 天前
Swift多环境配置:利用Scheme实现灵活的多环境管理
开发语言·ide·vscode·ios·个人开发·swift·敏捷流程
New_Horizons6662 天前
Vscode终端激活Conda虚拟环境
ide·vscode·conda
️学习的小王3 天前
Anaconda国内镜像配置与conda常用命令
ide·经验分享·python·conda
雾沉川3 天前
Rust IDE 选型:除 VS Code 之外,RustRover 非商业场景可免费使用
ide·vscode·rust
2501_915918414 天前
iOS 真机调试工具推荐,安装运行、性能分析有哪些工具
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
Albert Edison4 天前
PyCharm 字体大小设置
ide·python·pycharm
Super 含6 天前
Android 包体积优化(一):APK 到底大在哪里?从 APK 结构到体积分析
android·ide·vscode
冷雨夜中漫步6 天前
IDEA CodeStyle代码风格格式化模板
java·ide·intellij-idea