当前位置:C++技术网 > 资讯 > wsprintf函数参数定义为CString类型易错分析

wsprintf函数参数定义为CString类型易错分析

更新时间:2016-01-24 22:01:53浏览次数:1+次

我在写代码实现“获取和显示电脑开机运行了多长时间”的时候,遇到了一个问题,算是小问题吧,不过还是分享下,以免大家也走进这样的误区。
我刚开始定义的是CString的变量,然后在构造函数中初始化
tip=_T("");

写代码:

void CGetTickCountDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	DWORD dwTime=GetTickCount();
	d=dwTime/(24*60*60*1000);
	dwTime%=24*60*60*1000;
	//切割小时数          
	h = dwTime/3600/1000;   
	dwTime %=3600*1000; 
	//切割分钟数     
	m = dwTime /60/1000;      	
	dwTime %=60*1000;       
	//切割秒数和毫秒数     
	s = dwTime/1000;    
	ms = dwTime%1000; 
	wsprintf(tip.AllocSysString(),_T("已开机:%d天%d小时%d分%d秒%d"),d,h,m,s,ms);
	Invalidate();
	CDialogEx::OnTimer(nIDEvent);
}

后来我想应该是AllocSysString函数的释放问题,就调用了::SysFreeString函数,最后还是装逼失败,就跑去研究了一下wsprintf函数,后来就换了一下,没有调用CString变量来存储,而是LPWSTR变量,后来又不行,又报错,在研究了一下发现是内存区的问题,于是我在构造函数中定义了1024大小的内存:

tip=new TCHAR[1024];(注意tip是LPWSTR类型)
运行了成功了。
其实如果使用win32来写,很容易避免这样的问题,在MFC中,变量是在头文件中定义,初始化是在构造函数中实现,相对于win32来讲,所有的代码都是写在一个文件里面,变量定义,初始化,都在一个文件,因此不容易出错,但MFC的话,就容易出问题了。