Установить информацию о версии EXE

Информацию о версии Exe-файла я получаю с помощью VerQueryValue. Есть ли обратная функция (WinApi или Delphi), которая может зарегистрировать (установить или изменить) такую ​​информацию? Вот, например, есть программа, которая это умеет. Как это может работать (http://www.angusj.com/resourcehacker/)?


person Gu.    schedule 17.10.2011    source источник
comment
Это определяется ресурсом версии. Используйте UpdateResource, чтобы изменить его.   -  person David Heffernan    schedule 17.10.2011
comment
Вот ссылка на программу с исходным кодом, как установить информацию о версии. Совместимость с Delphi 2009 и выше. updated-setversion-exe-to-set-file-version-info-in-res-or-exe   -  person LU RD    schedule 17.10.2011


Ответы (1)


Информация о версии хранится в ресурсах; для редактирования этого вам просто нужно отредактировать этот ресурс. Вот модуль, который я нашел, который может клонировать существующую информацию о версии файла и прикреплять ее к другому файлу. Очень легко сделать то, что вы хотите, начиная с этого кода (он написан моим другом и доступен для всех):

unit cloneinfo;

interface

uses Windows, SysUtils;

type
 LANGANDCODEPAGE = record
  wLanguage: Word;
  wCodePage: Word;
 end;

procedure clone(sFile,output:string);

implementation

procedure clone(sFile,output:string);
var
  dwHandle, cbTranslate: cardinal;
  sizeVers: DWord;
  lpData, langData: Pointer;
  lpTranslate: ^LANGANDCODEPAGE;
  hRes : THandle;
begin
 sizeVers := GetFileVersionInfoSize(PChar(sFile), dwHandle);
 If sizeVers = 0 then
 exit;
 GetMem(lpData, sizeVers);
 try
  ZeroMemory(lpData, sizeVers);
  GetFileVersionInfo (PChar(sFile), 0, sizeVers, lpData);
  If not VerQueryValue (lpData, '\VarFileInfo\Translation', langData, cbTranslate) then
  exit;
  hRes := BeginUpdateResource(pchar(output), FALSE);
  //For i := 0 to (cbTranslate div sizeof(LANGANDCODEPAGE)) do
  //begin
  lpTranslate := Pointer(Integer(langData) + sizeof(LANGANDCODEPAGE));
  UpdateResource(hRes, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate^.wLanguage,lpData, sizeVers);
  //end;
  EndUpdateResource(hRes, FALSE);
 finally
  FreeMem(lpData);
 end;
end;


end.
person opc0de    schedule 17.10.2011
comment
Это только для информации о языке и кодовой странице. Как насчет VS_FIXEDFILEINFO? +1 в любом случае - person TLama; 17.10.2011
comment
Если это устройство, которое вы нашли в Интернете, вам нужно быть более осторожным с лицензированием. Как минимум нужно указать ссылку на источник. (Кроме того, взгляните на en.wikipedia.org/wiki/Run-on_sentence.< /а>) - person Andreas Rejbrand; 17.10.2011
comment
@ opc0de, все хорошо для вас, но без заявления автора о том, что его можно использовать бесплатно, для остальных из нас его можно найти в Интернете. Проголосуйте за решение.... - person Chris Thornton; 17.10.2011
comment
@Chris Чтобы избавиться от лицензии, очень легко перекодировать ее с нуля, чтобы получить свою собственную версию (например, используя массив байтов вместо указателя + getmem + zeromemory + freemem). Это просто оболочка для Windows API. Хороший код во всех случаях. +1 - person Arnaud Bouchez; 17.10.2011
comment
Обычно я не копирую и не вставляю код, но вызов некоторых API, я не думаю, должен быть связан с авторскими правами, если бы это был алгоритм или что-то сложное, я бы согласился. Как указал Арно, я мог бы вырезать некоторые API или заменить их синонимами и вуаля код, написанный мной. - person opc0de; 17.10.2011
comment
@ opc0de, Арнанд, понял. +1 - person Chris Thornton; 17.10.2011