關鍵詞:visual studio,rc file,VS_VERSION_INFO,FILEVERSION,PRODUCTVERSION
目標:希望每次在vs中編譯項目時,生成的可執行程序版本號自動+1
環境:vs2010,python 2.7.8
步驟:
1.在rc文件同目錄下添加version.h頭文件,內容如下:
#define RELEASE_VER 1 // 0: beta version; 1: release version #define RELEASE_DATE "Sep 01 2014" // Mmm dd yyyy; only used for RELEASE_VER=1 #define RELEASE_VER_MAIN 1 // version number (binary) #define RELEASE_VER_MAIN2 0 #define RELEASE_VER_SUB 0 #define RELEASE_VER_SUB2 0 // version number (string) #define TOSTRING2(arg) #arg #define TOSTRING(arg) TOSTRING2(arg) #define RELEASE_VER_STR TOSTRING(RELEASE_VER_MAIN) "." TOSTRING(RELEASE_VER_MAIN2) "." TOSTRING(RELEASE_VER_SUB) "." TOSTRING(RELEASE_VER_SUB2)
2.用文本編輯器(notepad++)打開rc文件,修改文件內容

// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Chinese (Simplified, PRC) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080404b0" BEGIN VALUE "CompanyName", "TODO: <Company name>" VALUE "FileDescription", "TODO: <File description>" VALUE "FileVersion", "1.0.0.1" VALUE "InternalName", "VersionT.exe" VALUE "LegalCopyright", "Copyright (C) 2014" VALUE "OriginalFilename", "VersionT.exe" VALUE "ProductName", "VersionTest" VALUE "ProductVersion", "1.0.0.1" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x804, 1200 END END #endif // Chinese (Simplified, PRC) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED

// Microsoft Visual C++ generated resource script. // #include "resource.h" #include "version.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Chinese (Simplified, PRC) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION RELEASE_VER_MAIN,RELEASE_VER_MAIN2,RELEASE_VER_SUB,RELEASE_VER_SUB2 PRODUCTVERSION RELEASE_VER_MAIN,RELEASE_VER_MAIN2,RELEASE_VER_SUB,RELEASE_VER_SUB2 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080404b0" BEGIN VALUE "CompanyName", "TODO: <Company name>" VALUE "FileDescription", "TODO: <File description>" VALUE "FileVersion", RELEASE_VER_STR VALUE "InternalName", "VersionT.exe" VALUE "LegalCopyright", "Copyright (C) 2014" VALUE "OriginalFilename", "VersionT.exe" VALUE "ProductName", "VersionTest" VALUE "ProductVersion", RELEASE_VER_STR END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x804, 1200 END END #endif // Chinese (Simplified, PRC) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED
3.把addVersionNum.py文件放到version.h同目錄下(不一定要同目錄,也可以用相對路徑)
在項目property->Build Events->Pre-Build Event的CommandLine中添加如下語句:
python.exe $(ProjectDir)addVersionNum.py
python腳本內容如下(PS:很低級的python寫法,但是能work 說不定熟悉python正則的高手一行代碼就能搞定)
#author: jakubfong #version: 1.0 2014-10-27 import sys import string import re f = open(r'version.h', 'r+') lines = f.readlines() data = [] for line in lines: tmp = re.split('\s+', line) if len(tmp) > 2 and tmp[1] == 'RELEASE_VER_SUB2': tmp[2] = str(int(tmp[2])+1); strtmp = ' '.join(tmp) strtmp += '\n' data.append(strtmp) print "###"+strtmp else: data.append(line) f.seek(0) f.writelines(data) f.close()
work done
參考鏈接:http://stackoverflow.com/questions/16626329/how-can-i-modify-vs-version-info-from-the-cpp-file?newreg=fee2fc67f78c4cd6a8b0e66688691b58