OutputDebugString完美封装

来源:互联网 发布:网络大专多少钱一年 编辑:程序博客网 时间:2024/06/03 12:16

C/C++开发中经常需要输出调试信息,我们一般使用OutputDebugString输出到DebugView或者调试器输出窗口。
OutputDebugString原型如下:

void WINAPI OutputDebugString(  LPCTSTR lpOutputString);

它只支持一个字符串参数。
在实际使用中,一般都会将其封装,支持可变参数,方便调用。

封装了2个函数TraceMsgATraceMsgW,分别支持窄字符和宽字符:

  void TraceMsgW(const wchar_t *lpFormat, ...) {       if(!lpFormat)           return;       wchar_t *pMsgBuffer = NULL;       unsigned int iMsgBufCount = 0;       va_list arglist;       va_start(arglist, lpFormat);       HRESULT hr = STRSAFE_E_INSUFFICIENT_BUFFER;       while(hr == STRSAFE_E_INSUFFICIENT_BUFFER) {           iMsgBufCount += 1024;           if(pMsgBuffer) {               free(pMsgBuffer);               pMsgBuffer = NULL;           }           pMsgBuffer = (wchar_t*) malloc(iMsgBufCount * sizeof(wchar_t));           if(!pMsgBuffer) {               break;           }           hr = StringCchVPrintfW(pMsgBuffer, iMsgBufCount, lpFormat, arglist);       }       va_end(arglist);       if(hr == S_OK) {           OutputDebugStringW(pMsgBuffer);       }       if(pMsgBuffer) {           free(pMsgBuffer);           pMsgBuffer = NULL;       }   }
   void TraceMsgA(const char *lpFormat, ...) {       if(!lpFormat)           return;       char *pMsgBuffer = NULL;       unsigned int iMsgBufCount = 0;       va_list arglist;       va_start(arglist, lpFormat);       HRESULT hr = STRSAFE_E_INSUFFICIENT_BUFFER;       while(hr == STRSAFE_E_INSUFFICIENT_BUFFER) {           iMsgBufCount += 1024;           if(pMsgBuffer) {               free(pMsgBuffer);               pMsgBuffer = NULL;           }           pMsgBuffer = (char*) malloc(iMsgBufCount * sizeof(char));           if(!pMsgBuffer) {               break;           }           hr = StringCchVPrintfA(pMsgBuffer, iMsgBufCount, lpFormat, arglist);       }       va_end(arglist);       if(hr == S_OK) {           OutputDebugStringA(pMsgBuffer);       }       if(pMsgBuffer) {           free(pMsgBuffer);           pMsgBuffer = NULL;       }   }
#if (defined UNICODE) || (defined _UNICODE)#define TraceMsg TraceMsgW#else#define TraceMsg TraceMsgA#endif

TraceMsgWTraceMsgA支持可变参数(类似printf)。
它最大的优点的是缓冲区可以自动增长,不用担心缓冲区不够,输出内容被截断。

原创粉丝点击