Visual C++2005中的自动更新版本信息

visual c + + 不支持自动增加版本资源的信息的功能。即重编译项目,编译的项目版本不会随着编译次数的增多而变化。如果要这么做,那么必须手动修改配置信息~~这太麻烦了!!下面介绍一个如何在自己的项目中让项目版本随着编译次数自己增加。其实这个方法不仅仅适用于VC 2005,应该所有的版本都适用。

设计这个程序要达到的目标是:自动获取当前版本,可以自己增加版本,在About信息、程序标题栏以及属性栏里都会自动加入最新信息。如果有必要,还可以设置规则,自动增加更替信息。

Visual C++2005中的自动更新版本信息_第1张图片

Visual C++2005中的自动更新版本信息_第2张图片

研究了微软官方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脚本获取当前版本,修改并返回。

Visual C++2005中的自动更新版本信息_第3张图片

在项目中了为了可以同步修改项目标题栏,和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

你可能感兴趣的:(Visual C++2005中的自动更新版本信息)