Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите с GetFileVersionInfo  [new]
m52
Member

Откуда:
Сообщений: 763
Здравствуйте,

Delphi XE7
Функция, которая расположена ниже, получает Major,Minor,Release,Build из exe-файла. Т.е. информацию о версии.
Как можно допилить эту ф-цию, чтобы она еще получала ProductName, т.е. вытаскивала название программы?

function GetVersionInfo(fullpath: string; var Major,Minor,Release,Build,ProductName: string): boolean;
var
  VerInfoSize: Cardinal;
  VerValueSize: Cardinal;
  Dummy: Cardinal;
  PVerInfo: Pointer;
  PVerValue: PVSFixedFileInfo;
begin
  Result := false;

  VerInfoSize := GetFileVersionInfoSize(PChar(fullpath), Dummy);
  if VerInfoSize > 0 then
  begin
    GetMem(PVerInfo, VerInfoSize);
    try
      if GetFileVersionInfo(PChar(fullpath), 0, VerInfoSize, PVerInfo) then
      begin
        if VerQueryValue(PVerInfo, '\', Pointer(PVerValue), VerValueSize) then
        begin
          Major   := IntToStr(HiWord(PVerValue^.dwFileVersionMS));
          Minor   := IntToStr(LoWord(PVerValue^.dwFileVersionMS));
          Release := IntToStr(HiWord(PVerValue^.dwFileVersionLS));
          Build   := IntToStr(LoWord(PVerValue^.dwFileVersionLS));
        end;

        Result := true;
      end;

    finally
      FreeMem(PVerInfo, VerInfoSize);
    end;
  end;

end;
17 авг 15, 12:26    [18028165]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6573
m52,

А вот нефиг то, что по первой ссылке Гугл выдал, сразу в код тащить - можно и на другие ссылки посмотреть:
тут к примеру
17 авг 15, 13:05    [18028434]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
m52
Member

Откуда:
Сообщений: 763
Спасибо.
Что-то я не смог допилить этот вариант.

Но зато починил свой старый вариант и получилось нечто такое:

function GetVersionInfo(fullpath: string; var Major,Minor,Release,Build,ProductName: string): boolean;
// Вх. fullpath - полный путь к EXE-файлу
// Вых. - true, значит все ОК. Возвращаются значения Major,Minor,Release,Build,ProductName
var
  VerInfoSize: Cardinal;
  Len: DWORD;
  Buff,TranslateBuffer: PChar;
  Value: PChar;

  Temp: integer;
  CalcLangCharSet: string;

  ProductVersion: string;
begin
  result:=false;
  Major:='0'; Minor:='0'; Release:='0'; Build:='0';
  ProductVersion:='0.0.0.0';
  ProductName:='';

  Len := GetFileVersionInfoSize(PChar(Application.ExeName), Len);
  if Len <=0 then exit;

  Buff := AllocMem(Len);
  try
    if GetFileVersionInfo(PChar(Application.ExeName), 0, Len, Buff) then
    // определим язык CalcLangCharSet
    // CalcLangCharSet:='040904E3';
    VerQueryValue(Buff, '\VarFileInfo\Translation', pointer(TranslateBuffer), Len);
    if Len >= 4 then
    begin
      temp:=0;
      StrLCopy(@temp, TranslateBuffer, 1);
      CalcLangCharSet:=IntToHex(temp, 4);
      StrLCopy(@temp, TranslateBuffer+1, 1);
      CalcLangCharSet := CalcLangCharSet + IntToHex(temp, 4);
    end
    else exit;

    // Достаем название ПО
    if VerQueryValue(Buff, PChar('StringFileInfo\'+CalcLangCharSet+'\ProductName'), Pointer(Value), Len) then ProductName := Value
      else exit;
    // Достаем версию в виде '4.2.0.0'
    if VerQueryValue(Buff, PChar('StringFileInfo\'+CalcLangCharSet+'\ProductVersion'), Pointer(Value), Len) then ProductVersion := Value
      else exit;
    // Парсим версию на составляющие
    Major:=copy(ProductVersion, 1, pos('.',ProductVersion)-1);   delete(ProductVersion, 1, pos('.',ProductVersion));
    Minor:=copy(ProductVersion, 1, pos('.',ProductVersion)-1);   delete(ProductVersion, 1, pos('.',ProductVersion));
    Release:=copy(ProductVersion, 1, pos('.',ProductVersion)-1); delete(ProductVersion, 1, pos('.',ProductVersion));
    Build:=ProductVersion;

    result:=true;
  finally
    FreeMem(Buff, Len); // освобождаем память
  end;
end;
17 авг 15, 14:28    [18028672]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Помогите с GetFileVersionInfo  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15470
Вопрос по Линуксу.
Т.к. GetFileVersionInfoSize использует WinAPI, то как быть в Линуксе?
Или в линуксовом исполняемом бинарнике нет ничего такого про версии и информацию, которая есть в виндомом exe?

Есть какая-то стандартная функция GetFileVersion, но они не кроссплатформенная.

Сообщение было отредактировано: 17 фев 21, 10:14
17 фев 21, 10:20    [22282072]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13386
X11
как быть в Линуксе?
Изучать TResourceStream
17 фев 21, 10:26    [22282075]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15470
21 век, а в Delphi, которому уже 26 лет, до сих пор ничего готового нет в этом плане для Линукса:(
17 фев 21, 10:45    [22282078]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 63481
X11> ничего готового нет в этом плане для Линукса:(

Может есть. А может просто никому не нужно.
Посмотри как в Лазарусе сделано.

Posted via ActualForum NNTP Server 1.5

17 фев 21, 11:19    [22282101]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
X11
21 век, а в Delphi, которому уже 26 лет, до сих пор ничего готового нет в этом плане для Линукса:(

Delphi тут ни при чём. В линуксе исполняемые файлы не содержат информацию о версии.
17 фев 21, 12:05    [22282136]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15470
Ок, спасибо за информацию.
17 фев 21, 12:12    [22282138]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32912

в линухе тоже можно прилинковать как ресурс.
per rectum, но можно.

Posted via ActualForum NNTP Server 1.5

17 фев 21, 12:27    [22282155]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
Мимопроходящий,

Руками конечно можно. Там каждый ресурс отсвечивает в экспорте модуля :)
17 фев 21, 12:48    [22282177]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
Вот так можно сымитировать ресурс в линуксовом модуле:
program Project1;
uses
 System.Types;
type
 TCustomRes = packed record
               size : UInt32;
               data : array[0 .. 3] of byte;
              end;
var
 version : TCustomRes;
exports
 version name '__rsrc_N6RCDATA7versionE';
begin
 version.size := 4;
 version.data[0] := 1;
 version.data[1] := 2;
 version.data[2] := 3;
 version.data[3] := 4;
 var res := FindResource(hInstance, 'version', RT_RCDATA);
 var ptr : PByte := Pointer(res);
 writeln(ptr[0], '.', ptr[1], '.', ptr[2], '.', ptr[3]);
end.
17 фев 21, 13:05    [22282209]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15470
зачем все эти сложности, если уже сымитировать можно проще - хранить в константе
17 фев 21, 13:11    [22282223]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
X11
зачем все эти сложности, если уже сымитировать можно проще - хранить в константе

Код просто демонстрация, что для ресурсов используются механизмы экспорта символов. На самом деле, любую мету проще всего подключать именно ресурсом в пребилд ивенте.
17 фев 21, 13:17    [22282228]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32912

17.02.2021 13:11, X11 пишет:
> зачем все эти сложности, если уже сымитировать можно проще - хранить в константе

ресурс можно извлечь "снаружи".
а твою константу - нет.

Posted via ActualForum NNTP Server 1.5

17 фев 21, 13:17    [22282229]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54849

X11
21 век, а в Delphi, которому уже 26 лет, до сих пор ничего готового нет в этом плане для
Линукса:(

21-й век, а в линуксе, которому уже тоже 25, так и не появилась информация о версии в
исполняемых файлах.

Posted via ActualForum NNTP Server 1.5

17 фев 21, 13:26    [22282240]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
rgreat
Member

Откуда:
Сообщений: 7047
В линуксе принято выдавать номер версии в консоль по ключу -v.
17 фев 21, 13:42    [22282248]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54849

Великолепно. Как мне запустить .so файл с ключом -v?

Posted via ActualForum NNTP Server 1.5

17 фев 21, 13:43    [22282250]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
rgreat
Member

Откуда:
Сообщений: 7047
Dimitry Sibiryakov

Великолепно. Как мне запустить .so файл с ключом -v?
Тут тебе не отсталая винда. Понимать надо.
17 фев 21, 13:44    [22282251]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54849

Ну я и понимаю, что кучка гиков, пишущих по принципу "лишь бы не как у соседа" иначе не может.

Posted via ActualForum NNTP Server 1.5

17 фев 21, 13:48    [22282256]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
Обычно имя файла содержит версию + имеется символьная ссылка с именем без версии.
17 фев 21, 13:53    [22282264]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
Dimitry Sibiryakov
Ну я и понимаю, что кучка гиков, пишущих по принципу "лишь бы не как у соседа" иначе не может.

На самом деле, из имени файла версию получить сильно проще и быстрее, чем из ресурса (будь они в линуксе).
17 фев 21, 13:54    [22282266]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54849

Kazantsev Alexey
из имени файла версию получить сильно проще и быстрее, чем из ресурса

Осталась сущая мелочь: обшмонать весь LD_LIBRARY_PATH и распарсить базу лоадера чтобы
найти какое же имя имеет нужная библиотека на данной системе.

Posted via ActualForum NNTP Server 1.5

17 фев 21, 13:59    [22282271]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
Dimitry Sibiryakov,

Реши ту же задачу на винде.
17 фев 21, 14:08    [22282281]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с GetFileVersionInfo  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54849

LoadLibrary()
GetFileVersionInfo()

Задача решена.

Posted via ActualForum NNTP Server 1.5

17 фев 21, 14:16    [22282288]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить