我想将版本信息(针对特定语言)添加到另一个没有此类信息(根本)的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/