четверг, 10 апреля 2014 г.

Версия своей программы

Вариант №1

Предлагаю вариант кода, позволяющий быстро и просто узнать версию своей программы.
Обычно используют общий код, для извлечения версии, пробега по полям и т.д... Но, если нужно узнать номер версии своей программы, то всё гораздо проще. Версия программы хранится в ресурсах. 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; //InitVersion
function 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;