摆脱ATLTRACE输出中显示的atlTraceGeneral类别

时间:2013-12-11 00:16:29

标签: c++ visual-studio-2013 atl

升级到VS2013后,我开始在“():atlTraceGeneral - 我的输出”格式中接收所有ATLTRACE2消息。

e.g。

ATLTRACE(_T("This is my data: %d\n"), 124);

......显示为

dllmain.cpp(1121) : atlTraceGeneral - This is my data: 124

我不需要任何其他信息。这里有一些方法可以回到以前的格式,以便输出只是

This is my data: 124

2 个答案:

答案 0 :(得分:10)

唯一可行的解​​决方法是在_DEBUG宏下unf ATLTRACE并自己实现跟踪。微软的家伙推荐the same

解决方案如下所示:

#ifdef _DEBUG
#ifdef ATLTRACE 
#undef ATLTRACE
#undef ATLTRACE2

#define ATLTRACE CustomTrace
#define ATLTRACE2 ATLTRACE
#endif // ATLTRACE
#endif // _DEBUG

使用以下CustomTraces:

void CustomTrace(const wchar_t* format, ...)
{
    const int TraceBufferSize = 1024;
    wchar_t buffer[TraceBufferSize];

    va_list argptr; va_start(argptr, format);
    vswprintf_s(buffer, format, argptr);
    va_end(argptr);

    ::OutputDebugString(buffer);
}

void CustomTrace(int dwCategory, int line, const wchar_t* format, ...)
{
    va_list argptr; va_start(argptr, format);
    CustomTrace(format, argptr);
    va_end(argptr);
}

答案 1 :(得分:2)

我选择了不同的路线 - 我选择像这样编辑输出(信息只会变短,所以不需要分配):

#ifdef _DEBUG
static int __cdecl crtReportHookW(int nReportType, wchar_t* wszMsg, int* pnRet)
{
    const wchar_t wszTrace[] = L"atlTraceGeneral - ";
    const int ccTrace = _countof(wszTrace) - 1;         // exclude L'\0'
    if (nReportType == _CRT_WARN)
    {
        wchar_t* pwsz = wcsstr(wszMsg, wszTrace);
        if (pwsz != nullptr)
        {
            int ccBuf = wcslen(pwsz) + 1;       // remaining buffer size (include L'\0')
            wmemmove_s(pwsz, ccBuf, &pwsz[ccTrace], ccBuf - ccTrace);
        }
    }
    return FALSE;       // always keep processing
}
#endif

在CWinApp派生的构造函数中:

#ifdef _DEBUG
    _CrtSetReportHookW2(_CRT_RPTHOOK_INSTALL, crtReportHookW);
#endif

和CWinApp派生的析构函数:

#ifdef _DEBUG
    _CrtSetReportHookW2(_CRT_RPTHOOK_REMOVE, crtReportHookW);
#endif

出于某种原因,使用相同的消息调用挂钩的MCBS和宽字符版本,因此即使在MBCS应用程序中也只需要宽字符挂钩。