解决方案

OutputDebugString完美封装

seo靠我 2023-09-25 10:19:41

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 #endif

TraceMsgW和TraceMsgA支持可变参SEO靠我数(类似printf)。

它最大的优点的是缓冲区可以自动增长,不用担心缓冲区不够,输出内容被截断。
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2