visual c + + 不支持自动增加版本资源的信息的功能。即重编译项目,编译的项目版本不会随着编译次数的增多而变化。如果要这么做,那么必须手动修改配置信息~~这太麻烦了!!下面介绍一个如何在自己的项目中让项目版本随着编译次数自己增加。其实这个方法不仅仅适用于VC 2005,应该所有的版本都适用。
设计这个程序要达到的目标是:自动获取当前版本,可以自己增加版本,在About信息、程序标题栏以及属性栏里都会自动加入最新信息。如果有必要,还可以设置规则,自动增加更替信息。
研究了微软官方MSDN上的解释,软件版本信息存储在.RC文件中,主要是以下的一段:
/////////////////////////////////////////////////////////////////////// // // 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 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "Comments", "Sample Application\0" VALUE "CompanyName", "Microsoft Corp.\0" VALUE "FileDescription", "MyProject MFC Application\0" VALUE "FileVersion", "1, 0, 0, 1\0" VALUE "InternalName", "MyProject\0" VALUE "LegalCopyright", "Copyright (C) 1999\0" VALUE "OriginalFilename", "MyProject.EXE\0" VALUE "ProductName", "MyProject Application\0" VALUE "ProductVersion", "1, 0, 0, 1\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END
动态修改这个代码即可动态控制当前项目版本,不过这个文件是由微软编辑器来修改的,我们只能从别的地方做手脚。
知道了还有一个资源配置文件.rc2文件,在这个里面编辑器允许开发人员修改,这就好办了。将上面的代码完整的剪切到.rc2中。
增加头文件,在其中设定版本宏。
#define FILEVER 0,5,12,39746 #define PRODUCTVER 0,5,12,39746 #define STRFILEVER "0,5,12,39746" #define STRPRODUCTVER "0,5,12,39747 debug" #define STRFILEDESC "0,5,12,39746"
然后在RC2中如下设定:
#include "ProjectVersionInfo.h" VS_VERSION_INFO VERSIONINFO FILEVERSION FILEVER PRODUCTVERSION PRODUCTVER FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080403a8" BEGIN VALUE "CompanyName", "旋风工作室" VALUE "FileDescription", STRFILEDESC VALUE "FileVersion", STRFILEVER VALUE "InternalName", "IceCrystalFilePackEdit.exe" VALUE "LegalCopyright", "TODO: (C) <公司名>。保留所有权利。" VALUE "OriginalFilename", "IceCrystalFilePackEdit.exe" VALUE "ProductName", "TODO: <产品名>" VALUE "ProductVersion", STRPRODUCTVER END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x804, 936 END END
以上的步骤在大多数谈到如何改变项目版本的文章里都提到了。接下来就是修改加载的这个头文件了。
我采用了每次在程序编译前,先执行自定义的编译程序修改这个"ProjectVersionInfo.h"。要实现这个功能就依赖了Lua.
在“预生成事件”中增加Lua脚本获取当前版本,修改并返回。
在项目中了为了可以同步修改项目标题栏,和About信息,所以我将这个Lua脚本的数据返回到了C++中保存了起来。
swprintf(ptemp,L"IceCrystalFilePackEdit V%d.%d.%d",MainVersions,LocalVersions,TestVersoin); SetWindowText(ptemp);
About文本
TCHAR ptemp[256]; swprintf(ptemp,L"IceCrystalFilePackEdit \n 版本V%d.%d.%d.%d debug \n\n作者:夜行的猫仔\n\nEmail:[email protected]",MainVersions,LocalVersions,TestVersoin,debugVersion); GetDlgItem(IDC_About)->SetWindowText(ptemp);
后来还发现了一个BUG~~就是Lua新修改的文件并不会每次都参与VC编译(估计Lua写文件时差造成的),有时候版本号会慢一档。所以又写了一个直接在C++里用fopen的方法直接修改了头文件。这个方法很简单,估计学过C++的人都会,也省去了额外调用Lua,目前我就是用的这个办法~~。
这个方法很灵活,MainVersions,LocalVersions,TestVersoin,debugVersion里面记录了所有的版本数据,那么就可以对他们任意编程,比如,对子版本号可以设定
LocalVersions大于9那么就成0,然后MainVersions+1等等....
以上就是我的修改项目版本的方法,也许有更好的办法~持续改进中~~~~~
转自:http://www.xuebuyuan.com/1390317.html