常用方法分两步:
1. 得到编译时间;
2. 设置基准时间,以编译时间距基准时间的总天数的2倍作为版本号,适当情况还可加上初值;
其中第一步实现有两种方法:
1. 直接使用系统宏:CString OcxTime = __DATE__;
2. 在编译选项的Pre-link Step中调用批处理文件.bat:
1
2
3
|
@ echo off echo #pragma once>"Ver.h" echo #define APP_VER_NUM "%data%">>"Ver.h" |
其它网友的补充
使用宏__DATE__和__TIME__
1
2
3
4
5
6
7
8
9
10
11
|
CString strVersion,strBuildTime; strBuildTime = __DATE__; strBuildTime.Append( " " ); strBuildTime.Append(__TIME__); COleVariant vtime(strBuildTime); vtime.ChangeType(VT_DATE); COleDateTime dateTime=vtime; SYSTEMTIME systime; VariantTimeToSystemTime(dateTime, &systime); CTime buildTime(systime); strVersion = buildTime.Format( " Builded %Y-%m-%d %H:%M:%S " ); |
it一梦同学的补充
一般来说,发布的正式软件都会包含程序的svn版本号以及软件的编译版本和编译时间等信息,但是这些东西并不是默认就存在的,需要我们进行一些步骤的处理。具体做法有几种,万变不离其宗的是,利用SVN自带的指令获取到版本号以及当前时间,填充模板当中的占位符,最后用替换后的模板覆盖资源文件即可。这里只讲最简单的一种:
a. 首先需要给VC程序添加资源文件,假设程序名为Test,则资源文件为Test.rc
b. 向资源文件中添加新的资源项——version,资源文件用记事本打开,增加了如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L 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的值即可:
1
|
VALUE "ProductVersion", "V2.1.1.$WCREV$.(Build$WCNOW$)" |
d. 那么何时进行占位符的替换,随后替换程序的资源文件Test.rc,准确的将版本号与编译时间编译进程序呢?VS提供了一个Build Events配置,我们选择Pre-Build Event,增加一行代码如下:
1
|
SubWCRev $(ProjectDir) $(ProjectDir)\Test.rc2 $(ProjectDir)\Test.rc |
代码的意思是在程序编译之前,用SVN的脚本工具SubWCRev获取到工程目录的SVN号以及当前的编译时间,替换rc2文件中的占位符,覆盖到rc文件中。