牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2015-10-29 投稿人: 浏览次数:2050

以前也实现过一次版本号自增,是用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)


这样定义头文件可以比较完善的满足程序需求,当程序中需要取得版本号时,可以使用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

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"^#defines+VER_MAINs+(d+)$", original, re.M).group(1))
        ver_sub = int(re.search(r"^#defines+VER_SUBs+(d+)$", original, re.M).group(1))
        ver_sub2 = int(re.search(r"^#defines+VER_SUB2s+(d+)$", original, re.M).group(1))
        ver_build = int(re.search(r"^#defines+VER_BUILDs+(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)


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

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



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



声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。