您的位置:首页 > 编程语言 > C语言/C++

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

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


1.定义Version.h头文件

文件内容如下
#pragma once


#define _VERTOSTRING(arg) #arg

#define VERTOSTRING(arg) _VERTOSTRING(arg)


#define VER_MAIN    1

#define VER_SUB     0

#define VER_SUB2    0

#define VER_BUILD   0


#define VER_FULL    VER_MAIN.VER_SUB.VER_SUB2.VER_BUILD

#define VER_FULL_RC VER_MAIN,VER_SUB,VER_SUB2,VER_BUILD


#define STR_VER_FULL    _T(VERTOSTRING(VER_FULL))

#define STR_VER_FULL_RC VERTOSTRING(VER_FULL_RC)

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


2.修改RC文件

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

//

// Version

//

#include "Version.h"

VS_VERSION_INFO VERSIONINFO

FILEVERSION VER_FULL_RC

PRODUCTVERSION VER_FULL_RC

FILEFLAGSMASK 0x17L

#ifdef _DEBUG

FILEFLAGS 0x1L

#else

FILEFLAGS 0x0L

#endif

FILEOS 0x4L

FILETYPE 0x0L

FILESUBTYPE 0x0L

BEGIN

BLOCK "StringFileInfo"

BEGIN

BLOCK "080404b0"

BEGIN

VALUE "FileDescription", "KooMC"

VALUE "FileVersion", STR_VER_FULL_RC

VALUE "InternalName", "KooMC"

VALUE "LegalCopyright", "Copyright (C) 2011"

VALUE "OriginalFilename", "KooMC.exe"

VALUE "ProductName", "KooMC"

VALUE "ProductVersion", STR_VER_FULL_RC

END

END

BLOCK "VarFileInfo"

BEGIN

VALUE "Translation", 0x804, 1200

END

END

[/code]


3.编写Python脚本来修改VER_BUILD

Python脚本如下
# coding=gbk

__author__ = 'coofly'

import argparse

import re

import sys


version_header_template =   \

"""#pragma once


#define _VERTOSTRING(arg) #arg

#define VERTOSTRING(arg) _VERTOSTRING(arg)


#define VER_MAIN    %d

#define VER_SUB     %d

#define VER_SUB2    %d

#define VER_BUILD   %d


#define VER_FULL    VER_MAIN.VER_SUB.VER_SUB2.VER_BUILD

#define VER_FULL_RC VER_MAIN,VER_SUB,VER_SUB2,VER_BUILD


#define STR_VER_FULL    _T(VERTOSTRING(VER_FULL))

#define STR_VER_FULL_RC VERTOSTRING(VER_FULL_RC)

"""


if __name__ == "__main__":

parser = argparse.ArgumentParser()

parser.add_argument('header_path', help='头文件路径')

args = parser.parse_args()

print args.header_path


f = open(args.header_path)

try:

original = f.read()

ver_main = int(re.search(r'^#define\s+VER_MAIN\s+(\d+)$', original, re.M).group(1))

ver_sub = int(re.search(r'^#define\s+VER_SUB\s+(\d+)$', original, re.M).group(1))

ver_sub2 = int(re.search(r'^#define\s+VER_SUB2\s+(\d+)$', original, re.M).group(1))

ver_build = int(re.search(r'^#define\s+VER_BUILD\s+(\d+)$', original, re.M).group(1))

except re.error:

print '解析头文件失败……'

sys.exit(0)

finally:

f.close()


print '原版本号:%d.%d.%d.%d' % (ver_main, ver_sub, ver_sub2, ver_build)

ver_build += 1

print '新版本号:%d.%d.%d.%d' % (ver_main, ver_sub, ver_sub2, ver_build)

new_header = version_header_template % (ver_main, ver_sub, ver_sub2, ver_build)


with open(args.header_path, 'w') as f:

f.write(new_header)

[/code]


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

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

转自 http://www.coofly.com/index.php/archives/22/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: