Блокировка вывода в окно вывода в Visual Studio - PullRequest
1 голос
/ 25 мая 2011

Мое приложение отправляет данные отладки в окно вывода в Visual Studio с помощью макроса TRACE. Некоторые из этих выходных строк создаются с использованием нескольких вызовов макроса 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 ]

2 голосов
/ 25 мая 2011

Я не верю, что есть способ заблокировать окно вывода в Visual Studio.Я думаю, что самый простой способ сделать это - собрать все сообщение в объект std::stringstream или wchar_t[], а затем вывести это единственное значение в макрос TRACE

.* так что, скорее всего, здесь есть несколько ошибок, но следующее должно привести вас на правильный путь

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 голос
/ 25 мая 2011

Создайте одну строку перед использованием макроса 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 );
...