在Visual Studio中将输出锁定到输出窗口

时间:2011-05-24 20:52:59

标签: c++ visual-studio visual-studio-2008 winapi trace

我的应用程序使用TRACE宏将调试数据发送到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"));

如何在此功能期间将输出锁定到输出窗口,或者通过一次调用将整个字符串发送到TRACE?感谢。

2 个答案:

答案 0 :(得分:2)

我不相信有办法在Visual Studio中锁定输出窗口。我认为最简单的方法是将整个邮件构建到std::stringstreamwchar_t[]对象中,然后将该单个值输出到TRACE

自从我使用stringstream以来已经有一段时间了,所以这里可能会有一些错误,但以下情况应该会让您走上正轨

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());

答案 1 :(得分:1)

在使用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 );