获取程序编译时间, 用于自动生成版本号

我们写软件的,总希望程序有变动时可以自动生成版本号,不用手动去改,这样多方便啊。VS编译器就可实现这个功能。如下所示:




/*
获取程序编译时间, 用于自动生成版本号很好
 __DATE__ "Mar 25 2013"
		  "Mar  1 2013"

__TIME__  "21:42:20"


*/
void  GetProgramCompileTime(SYSTEMTIME &st)
{
	
	TCHAR szDate[20];	
	ZeroMemory(szDate, sizeof(szDate));
	ZeroMemory(&st, sizeof(SYSTEMTIME));
	_stprintf(szDate, TEXT("%s"), __DATE__);
	
	st.wYear = _tcstoul(szDate+7, 0, 10);
	
	st.wDay = szDate[5] - TEXT('0');
	if (szDate[4] != TEXT(' '))
	{
		st.wDay += (szDate[4] - TEXT('0')) * 10;
	}
	
	switch(szDate[0])
	{
		case TEXT('A'):
			if (szDate[1] == TEXT('p'))
			{
				st.wMonth = 4;
			}
			else
			{
				st.wMonth = 8;
			}
			break;
			
		case TEXT('D'):
			st.wMonth = 12;
			break;
			
		case TEXT('F'):
			st.wMonth = 2;
			break;
			
		case TEXT('J'):
			if (szDate[1] == TEXT('a'))
			{
				st.wMonth = 1;
			}
			else
			{
				if (szDate[2] == TEXT('n'))
				{
					st.wMonth = 6;
				}
				else
				{
					st.wMonth = 7;
				}
			}
			break;
			
		case TEXT('M'):
			if (szDate[2] == TEXT('r'))
			{
				st.wMonth = 3;
			}
			else
			{
				st.wMonth = 5;
			}
			break;
			
		case TEXT('N'):
			st.wMonth = 11;
			break;
			
		case TEXT('O'):
			st.wMonth = 10;
			break;
			
		case TEXT('S'):
			st.wMonth = 9;
			break;
	}
	
	ZeroMemory(szDate, sizeof(szDate));
	sprintf(szDate, TEXT("%s"), __TIME__);
	
	st.wHour = (szDate[0] -TEXT('0')) * 10 + (szDate[1] - TEXT('0'));	
	st.wMinute  = (szDate[3] -TEXT('0')) * 10 + (szDate[4] - TEXT('0'));
	st.wSecond  = (szDate[6] -TEXT('0')) * 10 + (szDate[7] - TEXT('0'));
	return;
}

GetProgramCompileTime 这个函数把编译时间获取出来,保存到一个SYSTEMTIME的结构体里,这样就可以随便用啦。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
是的,这些头部信息通常是由 Keil MDK 编译自动生成的。Keil MDK 编译器支持使用 scatter 文件来描述应用程序在 Flash 和 RAM 中的布局和分配。在 scatter 文件中,可以通过添加特殊的符号和段来定义应用程序的头部信息。 一般来说,应用程序的头部信息需要包括以下几个部分: 1. 版本信息:表示应用程序版本号和发布日期等信息。 2. 应用程序的起始地址:表示应用程序在 Flash 中的起始地址。 3. 应用程序的大小:表示应用程序的大小,以字节为单位。 4. 应用程序的校验和:表示应用程序的校验和,用于检测应用程序是否正确烧写到 Flash 中。 在 Keil MDK 编译器中,可以通过在 scatter 文件中添加特殊的符号和段来定义这些头部信息。例如,可以通过添加一个名为 `APP_INFO` 的符号和一个名为 `APP_INFO` 的段来定义应用程序的头部信息。在应用程序的 C 代码中,可以通过引用 `APP_INFO` 符号来获取应用程序的头部信息,例如: ``` extern uint32_t __APP_INFO[]; #define APP_START_ADDRESS __APP_INFO[0] #define APP_SIZE __APP_INFO[1] #define APP_CHECKSUM __APP_INFO[2] ``` 在这个例子中,`__APP_INFO[]` 是一个名为 `APP_INFO` 的段的起始地址,`APP_START_ADDRESS`、`APP_SIZE` 和 `APP_CHECKSUM` 分别表示应用程序的起始地址、大小和校验和。在编译和链接时,Keil MDK 编译器会将 `APP_INFO` 段的地址和大小写入应用程序的头部中,从而生成一个包含头部信息的可执行文件。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值