2011-10-17 92 views
6

关于我通过VerQueryValue收到的版本Exe-file的信息。是否有可以注册(建立或更改)这些信息的反函数(WinApi或Delphi)?这里,例如,有一个能够这样做的程序。它可能如何工作(http://www.angusj.com/resourcehacker)?设置EXE版本信息

+1

这是由[版本资源]确定(http://msdn.microsoft。 COM/EN-US /库/ aa381058(VS.85)的.aspx)。使用['UpdateResource'](http://msdn.microsoft.com/en-us/library/ms648049(VS.85).aspx)来修改它。 –

+1

这里是一个链接到一个程序与源代码如何设置版本信息。 Delphi 2009和兼容。 [更新-setversion-EXE到组,文件版本信息,在-RES-或-EXE](http://www.jasontpenny.com/blog/2009/09/05/updated-setversion-exe- to-set-file-version-info-in-res-or-exe /) –

回答

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. 
+0

这只是语言和代码页信息。那么[VS_FIXEDFILEINFO](http://msdn.microsoft.com/en-us/library/ms646997%28v=VS.85%29.aspx)? +1无论如何 – TLama

+0

感谢大,现在我将从事研究... –

+1

如果这是你在互联网上找到的单位,你需要更加小心的许可。至少,你应该提供一个链接到源代码。 (另外,看看http://en.wikipedia.org/wiki/Run-on_sentence。) –