unit vmsVerInfo;
interface
uses
Windows, Forms, StrUtils, SysUtils;
type
TStringFileInfoType = (sfiCompanyName, sfiFileDescription, sfiFileVersion, sfiInternalName,
sfiLegalCopyright, sfiOriginalFilename, sfiProductName, sfiProductVersion);
TVersionInfo = class
private
FCharSet : string;
FFileName : string;
FFixInfo : PVSFixedFileInfo;
FInfoBuf : Pointer;
FLang : Integer;
function GetStrFileInfo(Idx: TStringFileInfoType): string;
function GetFileBuild: string;
function GetFileVersion: string;
function GetVersion(aValue: DWORD): string;
public
function ProductVersion: string;
function ModuleDate: TDateTime;
function ModuleSize: integer;
function ModuleVersion: string;
constructor Create(AFileName: string = ''); overload;
destructor Destroy; override;
property FileBuild : string read GetFileBuild;
property FileVersion : string read GetFileVersion;
property FixedFileInfo : PVSFixedFileInfo read FFixInfo;
property StringFileInfo[Idx: TStringFileInfoType]: string read GetStrFileInfo;
end;
implementation
const
TStringFileInfoNames: array[TStringFileInfoType] of string =
('CompanyName',
'FileDescription',
'FileVersion',
'InternalName',
'LegalCopyright',
'OriginalFilename',
'ProductName',
'ProductVersion');
constructor TVersionInfo.Create(AFileName: string = '');
var
Dummy : DWORD;
DWSize : DWORD;
ExeFileName : array[0..255] of Char;
Res : PChar;
begin
inherited Create;
if AFileName = '' then
StrPCopy(ExeFileName, Application.ExeName)
else
StrPCopy(ExeFileName, aFileName);
FFileName := ExeFileName;
DWSize := GetFileVersionInfoSize(ExeFileName, Dummy);
GetMem(FInfoBuf, DWSize);
GetFileVersionInfo(ExeFileName, Dummy, DWSize, FInfoBuf);
if Assigned(FInfoBuf) then
begin
VerQueryValue(FInfoBuf, '\VarFileInfo\Translation', Pointer(Res), Dummy);
FLang := Integer(Pointer(Res)^);
FLang := Integer((LoWord(FLang) shl 16) + HiWord(FLang));
FCharSet := '\StringFileInfo\' + IntToHex(FLang, 8) + '\';
VerQueryValue(FInfoBuf, '\', Pointer(Res), Dummy);
Pointer(FFixInfo) := Res;
end;
end;
destructor TVersionInfo.Destroy;
begin
FreeMem(FInfoBuf);
inherited Destroy;
end;
function TVersionInfo.GetStrFileInfo(Idx: TStringFileInfoType): string;
var
DataLen : DWORD;
KeyName : array[0..127] of Char;
Res : PChar;
begin
Result := '';
if Assigned(FInfoBuf) then
begin
StrPCopy(KeyName, FCharSet + TStringFileInfoNames[Idx]);
VerQueryValue(FInfoBuf, KeyName, Pointer(Res), DataLen);
Result := StrPas(Res);
end;
end;
function TVersionInfo.GetFileVersion: string;
var
sMajor : string;
sMinor : string;
sRelease : string;
begin
Result := '0.0.0';
if Assigned(FixedFileInfo) then
begin
sMajor := IntToStr(HiWord(FixedFileInfo.dwFileVersionMS));
sMinor := IntToStr(LoWord(FixedFileInfo.dwFileVersionMS));
sRelease := IntToStr(HiWord(FixedFileInfo.dwFileVersionLS));
if (sMajor = '') then
sMajor := '0';
if (sMinor = '') then
sMinor := '0';
if (sRelease = '') then
sRelease := '0';
Result := Format('%s.%s.%s', [sMajor, sMinor, sRelease]);
end;
end;
function TVersionInfo.GetFileBuild: string;
var
sBuild : string;
begin
Result := '0';
if Assigned(FixedFileInfo) then
begin
Result := IntToStr(LoWord(FixedFileInfo.dwFileVersionLS));
if (sBuild <> '') then
Result := sBuild;
end;
end;
function TVersionInfo.GetVersion(aValue: DWORD): string;
var
sVersion : string;
sBuild : string;
begin
Result := '0.0';
if (sVersion = '') then
sVersion := '0';
if (sBuild = '') then
sVersion := '0';
sBuild := IntToStr(LoWord(aValue));
sVersion := IntToStr(HiWord(aValue));
Result := Format('%s.%s', [sVersion, sBuild]);
end;
function TVersionInfo.ModuleDate: TDateTime;
var
nFileAge: LongInt;
begin
nFileAge := FileAge(FFileName);
if nFileAge = -1 then
Result := 0
else
Result := FileDateToDateTime(nFileAge);
end;
function TVersionInfo.ModuleSize: integer;
var
FindData : TWin32FindData;
hFind : THandle;
begin
Result := -1;
hFind := FindFirstFile(PChar(FFileName), FindData);
if hFind <> INVALID_HANDLE_VALUE then
begin
Windows.FindClose(hFind);
if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
Result := FindData.nFileSizeLow;
end;
end;
function TVersionInfo.ModuleVersion: string;
begin
Result := GetVersion(FixedFileInfo.dwFileVersionLS);
end;
function TVersionInfo.ProductVersion: string;
begin
if Assigned(FixedFileInfo) then
Result := GetVersion(FixedFileInfo.dwFileVersionMS)
else
Result := '0.0';
end;
end.
Завантажити файл
Отримати докладні властивості про файл можна наступним чином:
procedure TForm1.Button1Click(Sender: TObject);
var
loVersionInfo : TVersionInfo;
sText : string;
begin
loVersionInfo := TVersionInfo.Create('c:\windows\system32\notepad.exe');
try
sText := Concat('Module version : ', loVersionInfo.FileVersion, '.', loVersionInfo.FileBuild, sLineBreak,
'Module date : ', DateToStr(loVersionInfo.ModuleDate), sLineBreak,
'Module size : ', FormatFloat('### ### ### bytes', loVersionInfo.ModuleSize), sLineBreak,
'CompanyName : ', loVersionInfo.StringFileInfo[sfiCompanyName], sLineBreak,
'Legal Copyright : ', loVersionInfo.StringFileInfo[sfiLegalCopyright], sLineBreak,
'Product Name : ', loVersionInfo.StringFileInfo[sfiProductName], sLineBreak,
'File Description : ', loVersionInfo.StringFileInfo[sfiFileDescription], sLineBreak,
'Original Filename : ', loVersionInfo.StringFileInfo[sfiOriginalFilename], sLineBreak,
'Internal Name : ', loVersionInfo.StringFileInfo[sfiInternalName], sLineBreak);
finally
FreeAndNil(loVersionInfo);
end;
Application.MessageBox(PWideChar(sText), 'About the notepad.exe');
end;

Немає коментарів :
Дописати коментар