可变参数函数问题
金融码农 2009-12-30 01:05:17 自定义了一个可变参数函数,其中对int、char、char*、CString可以进行处理。
具体函数如下:
====================================
bool CMyLog::LogWrite(char level,char *szType,...)
{
if (OpenFile(filePath)) //if can open the log file
{
//===============================
//print the classification and time
//===============================
CString LogText;
SYSTEMTIME currTime;
GetLocalTime(&currTime);
CString myTime;
myTime.Format(L"%d-%d-%d %d:%d:%d --->", currTime.wYear, currTime.wMonth, currTime.wDay, currTime.wHour, currTime.wMinute, currTime.wSecond);
if (level == 'e')
{
LogText =L"[ERROR] " + myTime;
}
else if (level == 'i')
{
LogText =L"[INFO] " + myTime;
}
// szTypes is the argument specified; all
// others must be accessed using the variable-
// argument macros.
va_list vl;
CString tmpStr;
va_start( vl, szType);
for(int i=0; szType[i]!='\0'; i++)
{
union Printable_t {
int i;
char c;
char *s;
} Printable;
CString cs;
DWORD dwNum;
switch (szType[i])
{
case 'i':
Printable.i = va_arg(vl,int);
tmpStr.Format(L"%d",Printable.i);
LogText += tmpStr;
break;
case 'c':
Printable.c = va_arg(vl,char);
tmpStr.Format(L"%c",Printable.c);
LogText += tmpStr;
break;
case 's':
Printable.s = va_arg(vl,char*);
dwNum = MultiByteToWideChar(CP_ACP,0,Printable.s,-1,NULL,0);
MultiByteToWideChar(CP_ACP,0,Printable.s,-1,tmpStr.GetBuffer(dwNum),dwNum);
tmpStr.ReleaseBuffer();
LogText += tmpStr;
break;
case 'w':
cs = va_arg(vl,CString);
LogText += cs;
break;
default:
break;
}
LogText.ReleaseBuffer();
}
va_end(vl);
LogText += L"\r\n";
myFile.SeekToEnd();
//to show chinese. just for debug!
//char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );
//setlocale( LC_CTYPE, "chs" );//set
myFile.WriteString(LogText);
//setlocale( LC_CTYPE, old_locale );//restore
//free( old_locale );
CloseFile();
return true;
}
return false;
}
====================================
在调用时我传入int、char、char*都是正确的。但是,当传入CString时就会有问题了。代码如下:
====================================
LogWrite(L"abcd"); //有问题。说是什么内存错误。
CString logText = L"abcd";
LogWrite(logText); //这个就没有问题。
====================================
一直不知道是为什么?
求高手回答。。。