VS2015中MFC应用使用TRACE时消除烦人的AtlTraceGeneral消息求助
我之前在VS2015的MFC项目里也被AtlTraceGeneral的冗余输出烦到过,试了好几种方法,下面这些思路应该能帮你解决问题:
直接通过预处理器关闭ATL Trace
先打开项目属性,进入配置属性 -> C/C++ -> 预处理器,在“预处理器定义”里添加_ATL_TRACE_LEVEL=0。这个宏会直接关闭所有ATL类别的Trace输出,如果你的项目不需要ATL的任何Trace信息,这是最干脆的办法。手动覆盖atlTraceGeneral类别定义
之前的方案用#ifdef ATLTRACE失效,是因为VS2015的MFC项目默认没预定义这个宏。你可以跳过#ifdef判断,直接在项目的公共头文件(比如stdafx.h)末尾添加代码,注意要放在ATL相关头文件(比如atlbase.h)之后:#undef atlTraceGeneral #define atlTraceGeneral 0这样就把AtlTraceGeneral类别的输出直接禁用,不会影响你自己的
TRACE调用。自定义TRACE宏屏蔽ATL输出
如果上面的方法还是没效果,可以自己封装一个TRACE宏,完全替代系统的版本,只输出你需要的内容:// 先取消系统默认的TRACE定义 #undef TRACE // 自定义TRACE,添加自定义前缀并直接调用OutputDebugString #define TRACE(fmt, ...) \ do { \ char buffer[1024]; \ sprintf_s(buffer, fmt, __VA_ARGS__); \ ::OutputDebugStringA(buffer); \ } while(0)这样所有的调试输出都由你自己控制,不会触发ATL的默认Trace消息。
用VS输出窗口筛选器临时屏蔽
如果你不想改代码,可以直接在VS的调试输出窗口里过滤:右键输出窗口,选择“筛选器”,在“排除包含”输入框里填AtlTraceGeneral,点击确定后,这些消息就会被自动隐藏,这是快速解决的临时方案。
需要注意的是,这些方法只对调试模式有效,Release模式下本来就不会输出TRACE相关信息;如果是MFC和ATL混合的项目,一定要确保头文件的包含顺序,自定义宏要放在系统头文件之后。
内容的提问来源于stack exchange,提问作者chara

