(с) не помню чье:
var
FProgramVersion: string;
function GetProgramVersion: string;
var
{$IFDEF ANDROID}
PackageManager: JPackageManager;
PackageInfo: JPackageInfo;
{$ENDIF}
{$IFDEF IOS}
s: MarshaledAString;
{$ENDIF}
{$IFDEF MSWINDOWS}
Exe: string;
Size, Handle: DWORD;
Buffer: TBytes;
FixedPtr: PVSFixedFileInfo;
{$ENDIF}
begin
if FProgramVersion <> '' then
begin
Result := FProgramVersion;
exit;
end;
{$IFDEF ANDROID}
PackageManager := TAndroidHelper.Context.getPackageManager;
PackageInfo := PackageManager.getPackageInfo(TAndroidHelper.Context.getPackageName, 0);
Result := JStringToString(PackageInfo.versionName);
{$ENDIF}
{$IFDEF IOS}
s := TNSString.Wrap(CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle, kCFBundleVersionKey)).UTF8String;
Result := string(s);
{$ENDIF}
{$IFDEF MSWINDOWS}
Exe := ParamStr(0);
Size := GetFileVersionInfoSize(PChar(Exe), Handle);
if Size = 0 then
begin
Result := 'Unknown';
exit;
end;
SetLength(Buffer, Size);
if not GetFileVersionInfo(PChar(Exe), Handle, Size, Buffer) then
begin
Result := 'Unknown';
exit;
end;
if not VerQueryValue(Buffer, '\', Pointer(FixedPtr), Size) then
begin
Result := 'Unknown';
exit;
end;
Result := Format('%d.%d.%d.%d', [LongRec(FixedPtr.dwFileVersionMS).Hi, // major
LongRec(FixedPtr.dwFileVersionMS).Lo, // minor
LongRec(FixedPtr.dwFileVersionLS).Hi, // release
LongRec(FixedPtr.dwFileVersionLS).Lo]); // build
{$ENDIF}
FProgramVersion := Result;
end;