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

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
17.08.2015, 13:05
    #39030709
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с GetFileVersionInfo
m52,

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

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

Код: 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
Период между сообщениями больше года.
17.02.2021, 10:20
    #40046095
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с GetFileVersionInfo
Вопрос по Линуксу.
Т.к. GetFileVersionInfoSize использует WinAPI, то как быть в Линуксе?
Или в линуксовом исполняемом бинарнике нет ничего такого про версии и информацию, которая есть в виндомом exe?

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

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

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

Руками конечно можно. Там каждый ресурс отсвечивает в экспорте модуля :)
...
Рейтинг: 0 / 0
17.02.2021, 13:05
    #40046204
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с GetFileVersionInfo
Вот так можно сымитировать ресурс в линуксовом модуле:
Код: 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
17.02.2021, 13:11
    #40046216
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с GetFileVersionInfo
зачем все эти сложности, если уже сымитировать можно проще - хранить в константе
...
Рейтинг: 0 / 0
17.02.2021, 13:17
    #40046221
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с GetFileVersionInfo
X11
зачем все эти сложности, если уже сымитировать можно проще - хранить в константе

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

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

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

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

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

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

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

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


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