Как добавить информацию о версии в другие exes в Delphi? - PullRequest
2 голосов
/ 18 октября 2011

Я хочу добавить информацию о версии (для определенного языка) в другие exes, которые не имеют такой информации (вообще).

Я попытался с BeginUpdateResource / UpdateResource / EndUpdateResource, но все, что мне удалось, это создать «Версия >> 1 >> Неизвестная строка», а не «Версия >> 1 >> CompanyName / VersionNumber / Description ...» и их значения.

Я искал в Google и здесь, но не смог найти что-то полезное. Только неполный код, который я не знал, как закончить.

Спасибо.

Edit:

Вот код, который я сейчас использую:

procedure SetExeInfo(const ExeName, ResName, ResValue: string);
var
   ResourceHandle: THandle;
   DataLength: DWord;
   Data: array of Char;
   Ok: Boolean;
   i: Integer;

begin
   ResourceHandle := BeginUpdateResource(pChar(ExeName), False);
   if (ResourceHandle <> 0) then
   begin
      DataLength := 8;
      SetLength(Data, 8);
      for i := 0 to 7 do
         Data[i] := 'z';
      Ok := True;
      if (not UpdateResource(ResourceHandle, RT_VERSION, pChar(#49#0), LANG_SYSTEM_DEFAULT {MakeLangID(LANG_NEUTRAL, SUBLANG_NEUTRAL)}, Data, DataLength)) then
         Ok := False;

      if (not EndUpdateResource(ResourceHandle, False)) then
         Ok := False;

      if (Ok) then
         ShowMessage('Update of resources successful!')
      else
         ShowMessage('Update of resources failed!');

   end;
end;

Последнее редактирование:

Я не указал в своем вопросе, что я не могу передать информацию из другого exe-файла, потому что я не видел смысла делать это, поскольку я специально не сказал, что беру информацию о версии из другого exe-файла. , Похоже, я был неправ, извините.

Ответы [ 2 ]

4 голосов
/ 03 ноября 2011

Вот некоторый рабочий код для добавления или замены номеров версий:

type
 VERSIONHEADER = packed record
   wLength: word;
   wValueLength: word;
   wType: word;
   Key: array[0..16] of WideChar;   // 'VS_VERSION_INFO'
   Version: VS_FIXEDFILEINFO;
 end;

  (...)
  var ToolPath: TFileName;    // = exe containing a reference version resource
      ExeFullPath: TFileName; // = destination exe
      Maj, Min: cardinal; // expected UPDATED Version number
      VersionHandle, VersionRes: THandle;
      VersionSize: DWORD;
      Version: array of AnsiChar;
      Ver: ^VERSIONHEADER;
  (...)
  VersionSize := GetFileVersionInfoSize(pointer(ToolPath),VersionHandle);
  if (VersionSize<>0) and (Maj<>0) then
  begin
    SetLength(Version,VersionSize);
    Ver := pointer(Version);
    GetFileVersionInfo(pointer(ToolPath),0,VersionSize,Ver);
    if Ver^.Version.dwSignature=$feef04bd then
    begin
      Ver^.Version.dwFileVersionMS := MAKELONG(Min,Maj);
      Ver^.Version.dwProductVersionMS := Ver^.Version.dwFileVersionMS;
      VersionRes := BeginUpdateResource(Pointer(ExeFullPath),False);
      UpdateResource(VersionRes,RT_VERSION,MAKEINTRESOURCE(VS_VERSION_INFO),
        1033,Ver,VersionSize);
      EndUpdateResource(VersionRes,false);
    end;
  end;

Он добавит или обновит числовые номера версий существующего исполняемого файла (ExeFullPath), заменив его предоставленным исполняемым ресурсом (ToolPath - может быть paramstr(0) для копирования некоторой существующей общей информации о версии, или даже ExeFullPath для обновления номеров версий).

2 голосов
/ 18 октября 2011
Ресурс

RT_VERSION имеет длину не более восьми байт.Вместо этого VERSIONINFO с фиксированным размером и переменными строками.Подробнее см. Ресурс VERSIONINFO - MSDN .

В CodeProject есть пример кода для вас: Обновление информации о версии во время выполнения .

...