[转]一个比较实用的VS C++版本号自增的实现方式

以前也实现过一次版本号自增,是用Python自动修改rc文件实现的,现在感觉颇多缺陷
所以研究了下别人的做法后自己又重新实现了一遍。

1.定义Version.h头文件

文件内容如下

 
 
  1. #pragma once
  2. #define _VERTOSTRING(arg) #arg
  3. #define VERTOSTRING(arg) _VERTOSTRING(arg)
  4. #define VER_MAIN 1
  5. #define VER_SUB 0
  6. #define VER_SUB2 0
  7. #define VER_BUILD 0
  8. #define VER_FULL VER_MAIN.VER_SUB.VER_SUB2.VER_BUILD
  9. #define VER_FULL_RC VER_MAIN,VER_SUB,VER_SUB2,VER_BUILD
  10. #define STR_VER_FULL _T(VERTOSTRING(VER_FULL))
  11. #define STR_VER_FULL_RC VERTOSTRING(VER_FULL_RC)

这样定义头文件可以比较完善的满足程序需求,当程序中需要取得版本号时,可以使用STR_VER_FULL宏
而在RC中,则使用VER_FULL_RC和STR_VER_FULL_RC

2.修改RC文件

在rc文件中inlucde我们之间定义的Version.h文件
然后使用VER_FULL_RC和STR_VER_FULL_RC替换,如下

 
 
  1. /
  2. //
  3. // Version
  4. //
  5. #include "Version.h"
  6. VS_VERSION_INFO VERSIONINFO
  7. FILEVERSION VER_FULL_RC
  8. PRODUCTVERSION VER_FULL_RC
  9. FILEFLAGSMASK 0x17L
  10. #ifdef _DEBUG
  11. FILEFLAGS 0x1L
  12. #else
  13. FILEFLAGS 0x0L
  14. #endif
  15. FILEOS 0x4L
  16. FILETYPE 0x0L
  17. FILESUBTYPE 0x0L
  18. BEGIN
  19. BLOCK "StringFileInfo"
  20. BEGIN
  21. BLOCK "080404b0"
  22. BEGIN
  23. VALUE "FileDescription", "KooMC"
  24. VALUE "FileVersion", STR_VER_FULL_RC
  25. VALUE "InternalName", "KooMC"
  26. VALUE "LegalCopyright", "Copyright (C) 2011"
  27. VALUE "OriginalFilename", "KooMC.exe"
  28. VALUE "ProductName", "KooMC"
  29. VALUE "ProductVersion", STR_VER_FULL_RC
  30. END
  31. END
  32. BLOCK "VarFileInfo"
  33. BEGIN
  34. VALUE "Translation", 0x804, 1200
  35. END
  36. END

3.编写Python脚本来修改VER_BUILD

Python脚本如下

 
 
  1. # coding=gbk
  2. __author__ = 'coofly'
  3. import argparse
  4. import re
  5. import sys
  6. version_header_template = \
  7. """#pragma once
  8. #define _VERTOSTRING(arg) #arg
  9. #define VERTOSTRING(arg) _VERTOSTRING(arg)
  10. #define VER_MAIN %d
  11. #define VER_SUB %d
  12. #define VER_SUB2 %d
  13. #define VER_BUILD %d
  14. #define VER_FULL VER_MAIN.VER_SUB.VER_SUB2.VER_BUILD
  15. #define VER_FULL_RC VER_MAIN,VER_SUB,VER_SUB2,VER_BUILD
  16. #define STR_VER_FULL _T(VERTOSTRING(VER_FULL))
  17. #define STR_VER_FULL_RC VERTOSTRING(VER_FULL_RC)
  18. """
  19. if __name__ == "__main__":
  20. parser = argparse.ArgumentParser()
  21. parser.add_argument('header_path', help='头文件路径')
  22. args = parser.parse_args()
  23. print args.header_path
  24. f = open(args.header_path)
  25. try:
  26. original = f.read()
  27. ver_main = int(re.search(r'^#define\s+VER_MAIN\s+(\d+)$', original, re.M).group(1))
  28. ver_sub = int(re.search(r'^#define\s+VER_SUB\s+(\d+)$', original, re.M).group(1))
  29. ver_sub2 = int(re.search(r'^#define\s+VER_SUB2\s+(\d+)$', original, re.M).group(1))
  30. ver_build = int(re.search(r'^#define\s+VER_BUILD\s+(\d+)$', original, re.M).group(1))
  31. except re.error:
  32. print '解析头文件失败……'
  33. sys.exit(0)
  34. finally:
  35. f.close()
  36. print '原版本号:%d.%d.%d.%d' % (ver_main, ver_sub, ver_sub2, ver_build)
  37. ver_build += 1
  38. print '新版本号:%d.%d.%d.%d' % (ver_main, ver_sub, ver_sub2, ver_build)
  39. new_header = version_header_template % (ver_main, ver_sub, ver_sub2, ver_build)
  40. with open(args.header_path, 'w') as f:
  41. f.write(new_header)

4.在预先生成事件中添加Python脚本的调用

在我现在的项目中,Python脚本被放在Tools目录下,所以我的调用命令是这样的
python "$(SolutionDir)\Tools\update_version.py" "$(ProjectDir)\Version.h"


文章转自 http://www.coofly.com/index.php/archives/22/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值