问题描述
|
我的应用程序使用“ 0”宏将调试数据发送到Visual Studio中的“输出”窗口。其中一些输出字符串是使用对
TRACE
宏的多次调用构建的,如以下代码片段所示:
BYTE i,len;
len = pMsg[APP_LEN_OFFSET] + sizeof(appPktHead_t) - APP_MSG_CODE_LEN;
TRACE(_T(\"%s: \"),fnName);
TRACE(GetCmdIdStr( pMsg[APP_MSG_CODE_OFFSET] ));
TRACE(_T(\" 0x\"));
for ( i = 0; i < len; i++ )
{
TRACE(_T(\"%.2X \"),pMsg[i]);
}
TRACE(_T(\"\\r\\n\"));
如何在此功能持续时间内将输出锁定到“输出窗口”,或在一次调用中将整个字符串发送给“ 0”?谢谢。
解决方法
我不相信有一种方法可以在Visual Studio中锁定输出窗口。我认为最简单的方法是将整个消息构建为
std::stringstream
或wchar_t[]
对象,然后将该单个值输出到TRACE
宏
自从我使用ѭ7以来已经有一段时间了,所以这里可能会出现一些错误,但是以下内容应该可以使您走上正确的轨道
std::stringstream stream;
stream << fnName << \": \";
stream << GetCmdIdStr( pMsg[APP_MSG_CODE_OFFSET] );
stream << \" 0x\";
for ( i = 0; i < len; i++ )
{
stream << pMsg[i] << \" \";
}
stream << \"\\r\\n\";
TRACE(stream.str().c_str());
,使用TRACE
宏之前,请构建一个字符串。
byMsgLen = pMsg[DEV_LEN_OFFSET] + sizeof(devPktHead_t) + sizeof(devPktTail_t);
cmd = pMsg[DEV_CMD_MSB_OFFSET];
cmd <<= 8;
cmd |= pMsg[DEV_CMD_LSB_OFFSET];
pCmdIdStr = GetCmdIdStr( cmd );
iPreOffset = ::wcsnlen_s(fnName,128) // function name
+ 2 // \": \"
+ ::wcsnlen_s(pCmdIdStr,128) // command ID string
+ 3; // \" 0x\"
iPostOffset = iPreOffset + byMsgLen * 3; // \"%.2X \" (formatted: 2 hex-nibble bytes and space)
iStrLen = iPostOffset + 3; // \"\\r\\n\\0\"
pBuf = (wchar_t *)malloc( iStrLen * sizeof(wchar_t) );
::swprintf_s( pBuf,iStrLen,_T(\"%s: %s 0x\"),fnName,pCmdIdStr);
for ( i = iPreOffset; i < iPostOffset; i += 3 )
{
::swprintf_s( &(pBuf[i]),4,_T(\"%.2X \"),pMsg[j++] );
}
::swprintf_s( &(pBuf[i]),3,_T(\"\\r\\n\") );
TRACE( pBuf );
::free( pBuf );