unit uGetVersion;
interface
type
TVersion = record
ProductName: string;
ProductVersion: string;
FileDescription: string;
LegalCopyright: string;
FileVersion: string;
CompanyName: string;
LegalTradeMarks: string;
InternalName: string;
OriginalFileName: string;
end;
function GetVersionInfo(FileName :String): TVersion;
implementation
uses Winapi.Windows, System.SysUtils;
function GetVersionInfo(FileName :String):TVersion;
type
PTranslate = ^TTranslate;
TTranslate = record
wLanguage: WORD;
wCodePage: WORD;
end;
PVerInfo = ^TVS_FIXEDFILEINFO;
TVS_FIXEDFILEINFO = record
dwSignature: longint;
dwStrucVersion: longint;
dwFileVersionMS: longint;
dwFileVersionLS: longint;
dwFileFlagsMask: longint;
dwFileFlags: longint;
dwFileOS: longint;
dwFileType: longint;
dwFileSubtype: longint;
dwFileDateMS: longint;
dwFileDateLS: longint;
end;
var
BufSize, Len: DWORD;
Buf: PChar;
Value: PChar;
tmp: string;
Translate: PTranslate;
FileInfoPath: string;
VerInfo: PVerInfo;
begin
BufSize := GetFileVersionInfoSize(PChar(FileName), BufSize);
if BufSize > 0 then
begin
Buf := AllocMem(BufSize);
if GetFileVersionInfo(PChar(FileName), 0, BufSize, Buf) then
begin
if VerQueryValue(Buf, PChar('\VarFileInfo\Translation'), Pointer(Translate), Len) then
begin
FileInfoPath := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) + IntToHex(Translate^.wCodePage, 4) + '\';
if VerQueryValue(Buf, PChar(FileInfoPath + 'ProductName'), Pointer(Value), Len) then
Result.ProductName := Value; //产品名称
if VerQueryValue(Buf, PChar(FileInfoPath + 'ProductVersion'), Pointer(Value), Len) then
Result.ProductVersion := Value; //产品版本
if VerQueryValue(Buf, PChar(FileInfoPath + 'FileDescription'), Pointer(Value), Len) then
Result.FileDescription := Value; //文件说明
if VerQueryValue(Buf, PChar(FileInfoPath + 'LegalCopyright'), Pointer(Value), Len) then
Result.LegalCopyright := Value; //合法版权
if VerQueryValue(Buf, PChar(FileInfoPath + 'CompanyName'), Pointer(Value), Len) then
Result.CompanyName := Value; //公司名称
if VerQueryValue(Buf, PChar(FileInfoPath + 'LegalTradeMarks'), Pointer(Value), Len) then
Result.LegalTradeMarks := Value; //合法商标
if VerQueryValue(Buf, PChar(FileInfoPath + 'InternalName'), Pointer(Value), Len) then
Result.InternalName := Value; //内部名称
if VerQueryValue(Buf, PChar(FileInfoPath + 'OriginalFileName'), Pointer(Value), Len) then
Result.OriginalFileName := Value; //原文件名
if VerQueryValue(Buf, '\', Pointer(VerInfo), Len) then
begin //文件版本
Result.FileVersion := IntToStr(HIWORD(VerInfo.dwFileVersionMS)) + '.' +
IntToStr(LOWORD(VerInfo.dwFileVersionMS)) + '.' +
IntToStr(HIWORD(VerInfo.dwFileVersionLS)) + '.' +
IntToStr(LOWORD(VerInfo.dwFileVersionLS));
end;
end;
end;
FreeMem(Buf, BufSize);
end;
end;
end.