如何修改文件版本号

修改文件版本号, 其实就是修改文件的资源. MSDN上没有明说如何修改文件的版本号的方法, 因为MS认为版本号应该是属于文件创建者的, 而不是如我们这样的文件所有者应该去修改的. 但资源总是资源, MS提供了如何修改资源的函数, 当然这些函数也可以修改版本号.

首先, 我们要找到文件的版本信息资源:
mSize : =  GetFileVersionInfoSize( ' FileName.exe ' );
SetLength(mVersion, mSize);
GetFileVersionInfo(
' FileName.exe ' , mRes, mSize, mVersion);

这个代码能让我们得到文件的版本信息资源, 得到的结果就放在mVersion中, 其实这个就是一串的二进制形的资源内存块.

第二步, 我们要找到文件的版本信息:
VerQueryValue(mVersion,  ' ', mFixV, mLen);
mFixVersion1 : =  PVSFixedFileInfo(mFixV);

这一步能让我们得到mFixVersionInfo, 它是mVersion这个资源内存块中指向文件的版本信息的那一部分的指针.

第三步, 修改文件的版本信息:
mFixVersion ^ .dwFileVersionMS : =  $ 10001 // 高位低位都为1
mFixVersion ^ .dwFileVersionLS : =   26  shl  16   +   26 // 高位低位都为26

这两步演示了如何修改文件的版本号, dwFileVersionMS的高位是Major Version, 低位是Minor Version, dwFileVersionLS的高位是Release Version, 低位是Build Version.

第四步, 保存修改的内容, 下面就可以参考MSDN上的UpdateResource部分的例子了, 因为都是资源嘛:
mHExe : =  BeginUpdateResource( ' FileName.Exe ' , False);
if  VerQueryValue(mVersion,  ' VarFileInfoTranslation ' , mTranslate, mLen) then begin
// 这步是因为基本都是单区域资源的, 如果是多区域的, 可以参考MSDN中的作法,
// 将mTranslate/sizeof(LANGANDCODEPAGE)来得到第一个
mLang : =  PLANGANDCODEPAGE(mTranslate);
if  UpdateResource(mHExe, RT_VERSION, MakeIntResource( 1 ), mLang ^ .wLanguage, mVersion, mSize) then
EndUpdateResource(mHExe, False);
FreeLibrary(mHExe);


这样, 我们就修改了文件的版本号了, 可以类推出如何修改版本资源中的其它资源.

完整的代码如下
type
PLANGANDCODEPAGE 
=   ^ LANGANDCODEPAGE;
LANGANDCODEPAGE 
=  record
wLanguage: Word;
wCodePage: Word;
end;

var
mSize: Integer;
mLen, mLen1: UINT;
mTranslate, mFixV: Pointer;
mHExe, mRes: THandle;
mVersion: array of Byte;
mFixVersion: VS_FIXEDFILEINFO;
mFixVersion1: PVSFixedFileInfo;
mLang: PLANGANDCODEPAGE;
begin
mSize :
=  GetFileVersionInfoSize( ' FileName.exe ' , mRes);
SetLength(mVersion, mSize);
GetFileVersionInfo(
' FileName.exe ' , mRes, mSize, mVersion);
VerQueryValue(mVersion, 
' ', mFixV, mLen);
mFixVersion1 : =  PVSFixedFileInfo(mFixV);
mFixVersion1
^ .dwFileVersionMS : =  $ 10001 ;
mFixVersion1
^ .dwFileVersionLS : =   26  shl  16   +   26 ;
mHExe :
=  BeginUpdateResource( ' FileName.exe ' , False);
if  VerQueryValue(mVersion,  ' VarFileInfoTranslation ' , mTranslate, mLen) then begin
mLang :
=  PLANGANDCODEPAGE(mTranslate);
if  UpdateResource(mHExe, RT_VERSION, MakeIntResource( 1 ), mLang ^ .wLanguage, mVersion, mSize) then
EndUpdateResource(mHExe, False);
end
FreeLibrary(mHExe); 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值