OutputDebugString完美封装

发布时间:2025-12-09 16:04:22 浏览次数:3

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

void WINAPI OutputDebugString(LPCTSTR lpOutputString);

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

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

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

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

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477