Вариант №1
Предлагаю вариант кода, позволяющий быстро и просто узнать версию своей программы.
Обычно используют общий код, для извлечения версии, пробега по полям и т.д... Но, если нужно узнать номер версии своей программы, то всё гораздо проще. Версия программы хранится в ресурсах. VERSIONINFO своей программы можно извлечь из ресурса с именем '#1'. В данном ресурсе версия программы всегда хранится по смещению 49. Вот пример кода, который достаёт версию из себя:
Предлагаю вариант кода, позволяющий быстро и просто узнать версию своей программы.
Обычно используют общий код, для извлечения версии, пробега по полям и т.д... Но, если нужно узнать номер версии своей программы, то всё гораздо проще. Версия программы хранится в ресурсах. VERSIONINFO своей программы можно извлечь из ресурса с именем '#1'. В данном ресурсе версия программы всегда хранится по смещению 49. Вот пример кода, который достаёт версию из себя:
function GetMyVersion:string; type TVerInfo=packed record Nevazhno: array[0..47] of byte; // ненужные нам 48 байт Minor,Major,Build,Release: word; // а тут версия end; var s:TResourceStream; v:TVerInfo; begin result:=''; try s:=TResourceStream.Create(HInstance,'#1',RT_VERSION); // достаём ресурс if s.Size>0 then begin s.Read(v,SizeOf(v)); // читаем нужные нам байты result:=IntToStr(v.Major)+'.'+IntToStr(v.Minor)+'.'+ // вот и версия... IntToStr(v.Release)+'.'+IntToStr(v.Build); end; s.Free; except; end; end;
Вариант №2
function MyVersion(Files: string): string; var Buffer: string; fInfoSize: DWORD;
function InitVersion: boolean; var FilenamePointer: PChar; begin Result := True; FilenamePointer := PChar(Files); fInfoSize := GetFileVersionInfoSize(FilenamePointer, fInfoSize); if fInfoSize > 0 then begin SetLength(Buffer, fInfoSize); if not GetFileVersionInfo(FilenamePointer, 0, fInfoSize, PChar(Buffer)) then begin Result := False; end; end; //if end; //InitVersionfunction GetVersion(whatToGet: string): string; var tmpVersion: string; Len, Len2: DWORD; Value: PChar; temp: PLongInt; tempStr: string;begin Result := ''; if fInfoSize > 0 then begin SetLength(tmpVersion, 200); Value := @tmpVersion; VerQueryValue(PChar(Buffer), '\VarFileInfo\Translation', Pointer(temp), Len2); tempStr := Format('%s%.4x%.4x\%s%s', ['\StringFileInfo\', LoWord(temp^), HiWord(temp^), whattoget, #0]); if VerQueryValue(PChar(Buffer), PChar(tempStr), Pointer(Value), Len) then Result := Value; end; // if end; //getversion
begin Buffer := ''; try InitVersion; result := GetVersion('FileVersion'); except Result := ''; end; end;
Вариант №3
function GetFileVersionToStr(FileName: string): string; stdcall;
var
Size, Handle: DWORD;
Buffer: TBytes;
FixedPtr: PVSFixedFileInfo;
begin
Size := GetFileVersionInfoSize(PChar(FileName), Handle);
if Size = 0 then
RaiseLastOSError;
SetLength(Buffer, Size);
if not GetFileVersionInfo(PChar(FileName), Handle, Size, Buffer) then
RaiseLastOSError;
if not VerQueryValue(Buffer, '\', Pointer(FixedPtr), Size) then
RaiseLastOSError;
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
end;