如果通过 CompilerVersion 得到的也只是编译器的版本号。
比如:delphi XE12 是 36 ,也仅此而己。
我想得到的是IDE的版本号,比如当前最新版本的DELPHI是:Embarcadero® RAD Studio 12 Version 29.0.53571.9782
我想得到 29.0.53571.9782 这个版本号;
IDE提供的API中,好象没有与之相关的东西;想要得到这个版本号,也许只能用变通的方式。
于是用DELPHI2007编译以下的代码
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 即可
如:
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即可直接读取了
{$I IDEVER.inc}
然后要显示到主窗体的状态栏中:
Main_SBar.Panels[0].Text := IDE_VER ;
以 DELPHI2007为例: