delphi – 在可执行文件中更改内部版本号

delphi – 在可执行文件中更改内部版本号,第1张

概述我想在可执行文件的版本信息中更改构建号(VersionLS的低位).所以,我应该阅读 VS_VERSIONINFO结构,更改内部版本号,然后将其更新回PE. 我正在使用此代码作为基础:https://stackoverflow.com/a/7999813/1970843.此代码非常适合更改VS_FIXEDFILEINFO数据,但它不会更改(也不访问)StringFileInfo信息. 我很确定我应 我想在可执行文件的版本信息中更改构建号(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),VersionSize,Ver);

因此,信息似乎正确地到达第一个StringStruc.但由于szKey和Value都不是固定大小,我不知道如何正确定义我的Packed Record(甚至可能?)来获取这些值.我也遇到阵列问题……如何定义它们?我正在做的方式,我只是在每个Struc上得到第一个孩子.请注意,我忽略了填充…这可以吗?

任何帮助表示赞赏.我在这里所做的大部分工作都是经过反复试验,所以我真的不明白发生了什么.

PS:我还在努力,所以我可能经常更新这篇文章.

解决方法 感谢您的关注和帮助.我在SO上找到了一个现成的解决方案.事实上,正是在我对这个问题的评论中(对我感到羞耻!).

它基于Colin Wilson的库.它使用指针算法来提取和写入信息,因此,很难(也许是唯一的)方式.还有一个关于如何使用Jason Penny库的一个很好的例子:SetVersion.由于我使用D7,我从here(在Resource UtilitIEs下)下载了Colin Wilson的库,但是更新版本,使用UnicodeString和更好的指针算法,可用here.

这是我现在的实际实现:

uses ...,unitResourceVersionInfo,unitPEfile;...var VersionInfo: TVersionInfoResourceDetails;    PEResModule: TPEResourceModule;    VersionNumber: ulARGE_INTEGER;    sversion: String;    I: Integer;Begin    PEResModule := TPEResourceModule.Create;    Try        PEResModule.LoadFromfile(sExe);        For I := 0 To PEResModule.ResourceCount - 1 Do Begin            If PEResModule.ResourceDetails[I] Is TVersionInfoResourceDetails Then Begin                VersionInfo := (PEResModule.ResourceDetails[I] As TVersionInfoResourceDetails);                Break;            End;        End;        VersionNumber.LowPart := MakeLong(NewBuildNumber,HiWord(VersionInfo.FiLeversion.LowPart));        VersionNumber.HighPart := VersionInfo.FiLeversion.HighPart;        VersionInfo.FiLeversion := VersionNumber;        VersionInfo.ProductVersion := VersionNumber;        VersionInfo.codepage := e4;        sversion := Format('%d.%d.%d.%d',[HiWord(VersionInfo.FiLeversion.HighPart),LoWord(VersionInfo.FiLeversion.HighPart),HiWord(VersionInfo.FiLeversion.LowPart),LoWord(VersionInfo.FiLeversion.LowPart)]);        VersionInfo.Setkeyvalue('FiLeversion',sversion);        PEResModule.Savetofile(ChangefileExt(sExe,'.exe2'));    Finally        FreeAndNil(PEResModule);    End;End;

代码页行是由于库中的错误(我相信它).它不会读取代码页(来自0),当您保存时,它显示为0.

总结

以上是内存溢出为你收集整理的delphi – 在可执行文件中更改内部版本号全部内容,希望文章能够帮你解决delphi – 在可执行文件中更改内部版本号所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1271995.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存