常用方法分两步:
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文件中。