VC使用编译时间作为版本号标识的方法
常用方法分两步:
1.得到编译时间;
2.设置基准时间,以编译时间距基准时间的总天数的2倍作为版本号,适当情况还可加上初值;
其中第一步实现有两种方法:
1.直接使用系统宏:CStringOcxTime=__DATE__;
2.在编译选项的Pre-linkStep中调用批处理文件.bat:
@echooff echo#pragmaonce>"Ver.h" echo#defineAPP_VER_NUM"%data%">>"Ver.h"
其它网友的补充
使用宏__DATE__和__TIME__
CStringstrVersion,strBuildTime; strBuildTime=__DATE__; strBuildTime.Append(""); strBuildTime.Append(__TIME__); COleVariantvtime(strBuildTime); vtime.ChangeType(VT_DATE); COleDateTimedateTime=vtime; SYSTEMTIMEsystime; VariantTimeToSystemTime(dateTime,&systime); CTimebuildTime(systime); strVersion=buildTime.Format("Builded%Y-%m-%d%H:%M:%S");
it一梦同学的补充
一般来说,发布的正式软件都会包含程序的svn版本号以及软件的编译版本和编译时间等信息,但是这些东西并不是默认就存在的,需要我们进行一些步骤的处理。具体做法有几种,万变不离其宗的是,利用SVN自带的指令获取到版本号以及当前时间,填充模板当中的占位符,最后用替换后的模板覆盖资源文件即可。这里只讲最简单的一种:
a.首先需要给VC程序添加资源文件,假设程序名为Test,则资源文件为Test.rc
b.向资源文件中添加新的资源项——version,资源文件用记事本打开,增加了如下代码:
VS_VERSION_INFOVERSIONINFO FILEVERSION1,0,0,1 PRODUCTVERSION1,0,0,1 FILEFLAGSMASK0x17L #ifdef_DEBUG FILEFLAGS0x1L #else FILEFLAGS0x0L #endif FILEOS0x4L FILETYPE0x1L FILESUBTYPE0x0L BEGIN BLOCK"StringFileInfo" BEGIN BLOCK"080404b0" BEGIN VALUE"FileDescription","Test" VALUE"FileVersion","1,1,1,0" VALUE"InternalName","Test" VALUE"LegalCopyright","Copyright(C)2015" VALUE"OriginalFilename","Test.exe" VALUE"ProductName","Microsoft" VALUE"ProductVersion","V1.0" END END BLOCK"VarFileInfo" BEGIN VALUE"Translation",0x804,1200 END END
c.接下来创建一个模板,利用SVN提供的占位符WCREV获取版本号,WCNOW获取编译时间。模板可以直接复制Test.rc文件,更名为Test.rc2。修改上述代码中的ProductVersion的值即可:
VALUE"ProductVersion","V2.1.1.$WCREV$.(Build$WCNOW$)"
d.那么何时进行占位符的替换,随后替换程序的资源文件Test.rc,准确的将版本号与编译时间编译进程序呢?VS提供了一个BuildEvents配置,我们选择Pre-BuildEvent,增加一行代码如下:
SubWCRev$(ProjectDir)$(ProjectDir)\Test.rc2$(ProjectDir)\Test.rc
代码的意思是在程序编译之前,用SVN的脚本工具SubWCRev获取到工程目录的SVN号以及当前的编译时间,替换rc2文件中的占位符,覆盖到rc文件中。