delphi - 如何在Delphi中向另一个exe添加版本信息?

标签 delphi version delphi-2009 exe

我想将版本信息(针对特定语言)添加到另一个没有此类信息(根本)的exe中。

我尝试使用 BeginUpdateResource/UpdateResource/EndUpdateResource 但我成功的只是创建“Version >> 1 >> Unknown string”,而不是“Version >> 1 >> CompanyName/VersionNumber/Description...”及其值。

我在 Google 和此处进行了搜索,但找不到有用的内容。只有不完整的代码,我不知道如何完成。

谢谢。

编辑:

这是我现在使用的代码:

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 获取版本信息。看来我错了,抱歉。

最佳答案

以下是一些用于添加或替换版本号的工作代码:

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 更新版本号)。

关于delphi - 如何在Delphi中向另一个exe添加版本信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7810728/

相关文章:

delphi - 如何使我的文件 DropSouce 被所有与文件一起使用的目标接受?

delphi - 如何编写基于 TCheckBox.Checked 控制 TEdit.PasswordChar 的实时绑定(bind)表达式?

sql-server-2005 - Delphi:Delphi和Microsoft SQL Server 2005从函数值进行错误的计算

ios - 旧版 iOS 上的 Google Maps SDK

SSL 握手失败 : SSL error: tlsv1 alert protocol version

delphi - Delphi 2009 中的 TShellListView 在哪里?

Delphi 2009 ShellTreeView/ShellListView 修复

delphi - 我可以将某个对象的类注释为类型吗?

delphi - 将图像从 3d 视角重绘为 2d

python - 有没有办法在同一个conda环境中安装python 3和python 2?