升级到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
答案 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应用程序中也只需要宽字符挂钩。