设置EXE文件版本信息

6
我通过使用VerQueryValue函数获取Exe文件版本信息。是否有相反的函数(WinApi或Delphi)可以注册(建立或更改)此类信息? 例如,这里有一个能够做到这一点的程序。它是如何工作的 (http://www.angusj.com/resourcehacker)?

1
这取决于版本资源。使用UpdateResource进行修改。 - David Heffernan
1
这是一个带有源代码的程序链接,可以设置版本信息。与Delphi 2009及更高版本兼容。updated-setversion-exe-to-set-file-version-info-in-res-or-exe - LU RD
1个回答

12

版本信息是通过资源存储的;要编辑它,您只需要编辑该资源。我找到了一个可以克隆现有文件版本信息并将其附加到另一个文件的单元。从这段代码开始做你想做的事情非常容易(它是由我的一个朋友编写的,并且是公开可用的):

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.

这只是关于语言和代码页信息的内容。那么 VS_FIXEDFILEINFO 呢?无论如何+1。 - TLama
1
如果这是你在互联网上找到的一个单元,你需要更加注意许可证。至少,你应该提供一个源链接。(此外,请查看http://en.wikipedia.org/wiki/Run-on_sentence。) - Andreas Rejbrand
@opc0de,你可能没问题,但对于我们其他人来说,如果没有作者声明它是免费使用的,那么它就是“在互联网上找到的”。等待问题解决后再点赞。 - Chris Thornton
@Chris 为了摆脱许可证,很容易从头开始重新编码以获取自己的版本(例如使用字节数组而不是指针+getmem+zeromemory+freemem)。它只是Windows API的包装器。无论如何都是很好的代码。+1 - Arnaud Bouchez
通常我不会复制和粘贴代码,但是调用一些API我认为不应该涉及版权问题,如果这是一个算法或者难以完成的任务,我会同意。正如Arnaud所指出的,我可以剪切一些API或者用同义词替换它们,然后就有了我自己编写的代码。 - opc0de
@opc0de,arnand,明白了。+1 - Chris Thornton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接