在自己的程序中封装类似trace的功能,一种比较简单的方式就是使用ATL提供的ATLTRACE宏。该宏定义在<atltrace.h>中。许多ATL工具类实现为inline方式(.h文件外,还带有一个同名的inl文件),这些类通常位于$VC目录/atlmfc/include目录下。不过该宏背后的类并非此方式,所以如果仅仅是包含该atltrace.h头文件,
将会出现如下link错误:
AtlTraceLinkError.obj : error LNK2001: unresolved external symbol "public: static class ATL::CTrace ATL::CTrace::s_trace" (?s_trace@CTrace@ATL@@2V12@A)
AtlTraceLinkError.obj : error LNK2001: unresolved external symbol "class ATL::CTraceCategory ATL::atlTraceGeneral" (?atlTraceGeneral@ATL@@3VCTraceCategory@1@A)
AtlTraceLinkError.obj : error LNK2019: unresolved external symbol _AtlTraceVA referenced in function "public: void __cdecl ATL::CTrace::TraceV(char const *,int,unsigned long,unsigned int,char const *,char *)const " (?TraceV@CTrace@ATL@@QBAXPBDHKI0PAD@Z)
原因当然是找不到这些方法或成员的实现。因此,我们需要包含它们的实现,即:包含atlsd.lib(debug)或者atls.lib。有两种方式:
一种通过Project配置,如下图:
另外一种方式为,在代码头加入如下编译命令:
#pragma comment(lib, "atlsd.lib")
所有的atls的实现源代码位于$VC目录/atlmfc/src/atl/atls下(.h文件仍然位于上述include目录下)。对于ATLTRACE宏,相应的实现位于atltrace.cpp中。这些类的实现被打包成上述lib库,注意不是dll,所以不存在所谓的atls.dll。
另外,由于ATLTRACE只在Debug下起作用,所以对于release版本,不需要做上述设置,不会产生link错误。下面是atltrace.h中,release下的定义部分:
#else // !DEBUG
inline void _cdecl AtlTraceNull(...){}
inline void _cdecl AtlTrace(LPCSTR , ...){}
inline void _cdecl AtlTrace2(DWORD_PTR, UINT, LPCSTR , ...){}
inline void _cdecl AtlTrace(LPCWSTR , ...){}
inline void _cdecl AtlTrace2(DWORD_PTR, UINT, LPCWSTR , ...){}
#ifndef ATLTRACE
#define ATLTRACE __noop
#define ATLTRACE2 __noop
#endif //ATLTRACE
#define ATLTRACENOTIMPL(funcname) return E_NOTIMPL
#define DECLARE_NOUIASSERT()
#endif //!_DEBUG