powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с GetFileVersionInfo
25 сообщений из 28, страница 1 из 2
Помогите с GetFileVersionInfo
    #39030664
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте,

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
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;
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #39030709
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52,

А вот нефиг то, что по первой ссылке Гугл выдал, сразу в код тащить - можно и на другие ссылки посмотреть:
тут к примеру
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #39030745
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Что-то я не смог допилить этот вариант.

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
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;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Помогите с GetFileVersionInfo
    #40046095
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по Линуксу.
Т.к. GetFileVersionInfoSize использует WinAPI, то как быть в Линуксе?
Или в линуксовом исполняемом бинарнике нет ничего такого про версии и информацию, которая есть в виндомом exe?

Есть какая-то стандартная функция GetFileVersion , но они не кроссплатформенная.
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046098
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
как быть в Линуксе?
Изучать TResourceStream
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046101
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
21 век, а в Delphi, которому уже 26 лет, до сих пор ничего готового нет в этом плане для Линукса:(
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046116
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11> ничего готового нет в этом плане для Линукса:(

Может есть. А может просто никому не нужно.
Посмотри как в Лазарусе сделано.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046143
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
21 век, а в Delphi, которому уже 26 лет, до сих пор ничего готового нет в этом плане для Линукса:(

Delphi тут ни при чём. В линуксе исполняемые файлы не содержат информацию о версии.
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046145
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, спасибо за информацию.
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046160
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в линухе тоже можно прилинковать как ресурс.
per rectum, но можно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046176
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Руками конечно можно. Там каждый ресурс отсвечивает в экспорте модуля :)
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046204
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так можно сымитировать ресурс в линуксовом модуле:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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.
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046216
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем все эти сложности, если уже сымитировать можно проще - хранить в константе
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046221
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
зачем все эти сложности, если уже сымитировать можно проще - хранить в константе

Код просто демонстрация, что для ресурсов используются механизмы экспорта символов. На самом деле, любую мету проще всего подключать именно ресурсом в пребилд ивенте.
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046222
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17.02.2021 13:11, X11 пишет:
> зачем все эти сложности, если уже сымитировать можно проще - хранить в константе

ресурс можно извлечь "снаружи".
а твою константу - нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046228
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X1121 век, а в Delphi, которому уже 26 лет, до сих пор ничего готового нет в этом плане для
Линукса:(

21-й век, а в линуксе, которому уже тоже 25, так и не появилась информация о версии в
исполняемых файлах.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046234
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В линуксе принято выдавать номер версии в консоль по ключу -v.
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046236
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Великолепно. Как мне запустить .so файл с ключом -v?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046237
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Великолепно. Как мне запустить .so файл с ключом -v?
Тут тебе не отсталая винда. Понимать надо.
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046241
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я и понимаю, что кучка гиков, пишущих по принципу "лишь бы не как у соседа" иначе не может.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046246
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно имя файла содержит версию + имеется символьная ссылка с именем без версии.
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046248
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Ну я и понимаю, что кучка гиков, пишущих по принципу "лишь бы не как у соседа" иначе не может.

На самом деле, из имени файла версию получить сильно проще и быстрее, чем из ресурса (будь они в линуксе).
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046252
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyиз имени файла версию получить сильно проще и быстрее, чем из ресурса

Осталась сущая мелочь: обшмонать весь LD_LIBRARY_PATH и распарсить базу лоадера чтобы
найти какое же имя имеет нужная библиотека на данной системе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046261
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Реши ту же задачу на винде.
...
Рейтинг: 0 / 0
Помогите с GetFileVersionInfo
    #40046268
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LoadLibrary()
GetFileVersionInfo()

Задача решена.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с GetFileVersionInfo
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]