我正在寻找在可执行文件的版本信息中更改内部版本号(VersionLS 的低阶)。因此,我应该阅读VS_VERSIONINFO结构,更改内部版本号,然后将其更新回 PE。
我正在使用此代码作为基础:https ://stackoverflow.com/a/7999813/1970843 。此代码非常适合更改VS_FIXEDFILEINFO数据,但它不会更改(也不会访问)StringFileInfo信息。
我很确定我应该在 VERSIONHEADER 打包记录中包含一些内容以添加 VS_VERSIONINFO 的 Children 条目,但我不知道具体该怎么做。这是我到目前为止所拥有的:
type
StringStruc = Packed Record
wLength: Word;
wValueLength: Word;
wType: Word;
//szKey: ?;
//Value: ?;
End;
StringTable = Packed Record
wLength: Word;
wValueLength: Word;
wType: Word;
szKey: Array[0..8] Of WideChar;
Children: StringStruc;
End;
StringFileInfo = Packed Record
wLength: Word;
wValueLength: Word;
wType: Word;
szKey: Array[0..14] Of WideChar; // 'STRINGFILEINFO'
Children: StringTable;
End;
VERSIONHEADER = Packed Record
wLength: Word;
wValueLength: Word;
wType: Word;
szKey: Array[0..16] Of WideChar; // 'VS_VERSION_INFO'
Version: VS_FIXEDFILEINFO;
Children: StringFileInfo;
End;
...
var VersionHandle, VersionRes: THandle;
VersionSize: Cardinal;
Version: Array Of AnsiChar;
Ver: ^VERSIONHEADER;
Begin
VersionSize := GetFileVersionInfoSize(PChar(sExe), VersionHandle);
SetLength(Version, VersionSize);
Ver := Pointer(Version);
GetFileVersionInfo(PChar(sExe), 0, VersionSize, Ver);
因此,信息似乎正确地出现在第一个 StringStruc 上。但是由于 szKey 和 Value 都不是固定大小,我不知道如何正确定义我的打包记录(甚至可能吗?)来获取这些值。我也遇到了数组问题......我该如何定义它们?我正在做的方式是,我只是在每个 Struc 上获得第一个孩子。请注意,我忽略了填充...可以吗?
任何帮助表示赞赏。我在这里所做的大部分工作都是通过反复试验,所以我真的不明白发生了什么。
PS:我还在做这个,所以我可能会经常更新这个帖子。