C/C++开发中经常需要输出调试信息,我们一般使用OutputDebugString输出到DebugView或者调试器输出窗口。
OutputDebugString原型如下:void WINAPI OuSEO靠我tputDebugString(LPCTSTR lpOutputString );它只支持一个字符串参数。
在实际使用中,一般都会将其封装,支持可变参数,方便调用。封装了2个函数TracSEO靠我eMsgA和TraceMsgW,分别支持窄字符和宽字符:
void TraceMsgW(const wchar_t *lpFormat, ...) {if(!lpFormat)return;wchar_SEO靠我t *pMsgBuffer = NULL;unsigned int iMsgBufCount = 0;va_list arglist;va_start(arglist, lpFormat);HRESUSEO靠我LT hr = STRSAFE_E_INSUFFICIENT_BUFFER;while(hr == STRSAFE_E_INSUFFICIENT_BUFFER) {iMsgBufCount += 10SEO靠我24;if(pMsgBuffer) {free(pMsgBuffer);pMsgBuffer = NULL;}pMsgBuffer = (wchar_t*) malloc(iMsgBufCount *SEO靠我 sizeof(wchar_t));if(!pMsgBuffer) {break;}hr = StringCchVPrintfW(pMsgBuffer, iMsgBufCount, lpFormat,SEO靠我 arglist);}va_end(arglist);if(hr == S_OK) {OutputDebugStringW(pMsgBuffer);}if(pMsgBuffer) {free(pMsgSEO靠我Buffer);pMsgBuffer = NULL;}} void TraceMsgA(const char *lpFormat, ...) {if(!lpFormat)return;SEO靠我char *pMsgBuffer = NULL;unsigned int iMsgBufCount = 0;va_list arglist;va_start(arglist, lpFormat);HRSEO靠我ESULT hr = STRSAFE_E_INSUFFICIENT_BUFFER;while(hr == STRSAFE_E_INSUFFICIENT_BUFFER) {iMsgBufCount +=SEO靠我 1024;if(pMsgBuffer) {free(pMsgBuffer);pMsgBuffer = NULL;}pMsgBuffer = (char*) malloc(iMsgBufCount *SEO靠我 sizeof(char));if(!pMsgBuffer) {break;}hr = StringCchVPrintfA(pMsgBuffer, iMsgBufCount, lpFormat, arSEO靠我glist);}va_end(arglist);if(hr == S_OK) {OutputDebugStringA(pMsgBuffer);}if(pMsgBuffer) {free(pMsgBufSEO靠我fer);pMsgBuffer = NULL;}} #if (defined UNICODE) || (defined _UNICODE) #define TraceMSEO靠我sg TraceMsgW #else #define TraceMsg TraceMsgA #endifTraceMsgW和TraceMsgA支持可变参SEO靠我数(类似printf)。
它最大的优点的是缓冲区可以自动增长,不用担心缓冲区不够,输出内容被截断。网站备案号:浙ICP备17034767号-2