Как определить Версию приложения Delphi

ALT+Shift+X + T

Это будет петлять как модульный тест.

30
задан Wolf 10 October 2017 в 09:55
поделиться

5 ответов

Вот как я это делаю. Я вставляю это почти во все свои небольшие утилиты:

procedure GetBuildInfo(var V1, V2, V3, V4: word);
var
  VerInfoSize, VerValueSize, Dummy: DWORD;
  VerInfo: Pointer;
  VerValue: PVSFixedFileInfo;
begin
  VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
  if VerInfoSize > 0 then
  begin
      GetMem(VerInfo, VerInfoSize);
      try
        if GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo) then
        begin
          VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
          with VerValue^ do
          begin
            V1 := dwFileVersionMS shr 16;
            V2 := dwFileVersionMS and $FFFF;
            V3 := dwFileVersionLS shr 16;
            V4 := dwFileVersionLS and $FFFF;
          end;
        end;
      finally
        FreeMem(VerInfo, VerInfoSize);
      end;
  end;
end;

function GetBuildInfoAsString: string;
var
  V1, V2, V3, V4: word;
begin
  GetBuildInfo(V1, V2, V3, V4);
  Result := IntToStr(V1) + '.' + IntToStr(V2) + '.' +
    IntToStr(V3) + '.' + IntToStr(V4);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Caption := Form1.Caption + ' - v' + GetBuildInfoAsString;
end;
27
ответ дан 27 November 2019 в 23:25
поделиться

Передайте этой функции полное имя вашего EXE-файла, и она вернет строку вида: 2.1.5.9 или какой у вас номер версии.

function GetFileVersion(exeName : string): string;
const
  c_StringInfo = 'StringFileInfo\040904E4\FileVersion';
var
  n, Len : cardinal;
  Buf, Value : PChar;
begin
  Result := '';
  n := GetFileVersionInfoSize(PChar(exeName),n);
  if n > 0 then begin
    Buf := AllocMem(n);
    try
      GetFileVersionInfo(PChar(exeName),0,n,Buf);
      if VerQueryValue(Buf,PChar(c_StringInfo),Pointer(Value),Len) then begin
        Result := Trim(Value);
      end;
    finally
      FreeMem(Buf,n);
    end;
  end;
end;

После определения этого вы можете использовать его для установки заголовка вашей формы следующим образом:

procedure TForm1.FormShow(Sender: TObject);
begin 
  //ParamStr(0) is the full path and file name of the current application
  Form1.Caption := Form1.Caption + ' version ' + GetFileVersion(ParamStr(0));
end;
11
ответ дан 27 November 2019 в 23:25
поделиться

From http: // www.martinstoeckli.ch/delphi/delphi.html#AppVersion

С помощью этой функции вы можете получить версию файла, который содержит версия ресурса. Таким образом вы можете отобразить номер версии вашего приложение в информационном диалоге. Чтобы включить ресурс версии в your Delphi application, set the "Versioninfo" in the project options.

1
ответ дан 27 November 2019 в 23:25
поделиться

Мы делаем это для всех наших приложений, но используем компонент Raize RzVersioninfo. работает достаточно хорошо, просто нужно использовать следующий код

в форме create

Caption: = RzVersioninfo1.filedescripion + ':' + RzVersionInfo1.FileVersion;

, очевидно, если вам не нужны другие компоненты из Используйте одну из опций выше, так как компоненты raize стоят дорого.

1
ответ дан 27 November 2019 в 23:25
поделиться

Я настоятельно рекомендую не использовать GetFileVersion, если вы хотите узнать версию исполняемого файла, который выполняется в данный момент! У меня есть две довольно веские причины для этого:

  1. Исполняемый файл может быть недоступен (отключен диск / общий ресурс) или изменен (.exe переименован в .bak и заменен новым .exe без остановки запущенного процесса).
  2. Данные версии, которые вы пытаетесь прочитать, на самом деле уже загружены в память и доступны вам при загрузке этого ресурса, что всегда лучше, чем выполнение дополнительных (относительно медленных) дисковых операций.

Чтобы загрузить ресурс версии в Delphi. Я использую такой код:

uses Windows,Classes,SysUtils;
var
  verblock:PVSFIXEDFILEINFO;
  versionMS,versionLS:cardinal;
  verlen:cardinal;
  rs:TResourceStream;
  m:TMemoryStream;
  p:pointer;
  s:cardinal;
begin
  m:=TMemoryStream.Create;
  try
    rs:=TResourceStream.CreateFromID(HInstance,1,RT_VERSION);
    try
      m.CopyFrom(rs,rs.Size);
    finally
      rs.Free;
    end;
    m.Position:=0;
    if VerQueryValue(m.Memory,'\',pointer(verblock),verlen) then
      begin
        VersionMS:=verblock.dwFileVersionMS;
        VersionLS:=verblock.dwFileVersionLS;
        AppVersionString:=Application.Title+' '+
          IntToStr(versionMS shr 16)+'.'+
          IntToStr(versionMS and $FFFF)+'.'+
          IntToStr(VersionLS shr 16)+'.'+
          IntToStr(VersionLS and $FFFF);
      end;
    if VerQueryValue(m.Memory,PChar('\\StringFileInfo\\'+
      IntToHex(GetThreadLocale,4)+IntToHex(GetACP,4)+'\\FileDescription'),p,s) or
        VerQueryValue(m.Memory,'\\StringFileInfo\\040904E4\\FileDescription',p,s) then //en-us
          AppVersionString:=PChar(p)+' '+AppVersionString;
  finally
    m.Free;
  end;
end;
22
ответ дан 27 November 2019 в 23:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: