atltrace.h
上传用户:hfwmdy
上传日期:2016-01-14
资源大小:83k
文件大小:12k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // This is a part of the Active Template Library.
  2. // Copyright (C) Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Active Template Library Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Active Template Library product.
  10. #ifndef __ATLTRACE_H__
  11. #define __ATLTRACE_H__
  12. #pragma once
  13. #include <atldef.h>
  14. #include <atlconv.h>
  15. #ifdef _DEBUG
  16. #include <stdio.h>
  17. #include <stdarg.h>
  18. #endif
  19. #ifdef _DEBUG
  20. #include <atldebugapi.h>
  21. extern "C" IMAGE_DOS_HEADER __ImageBase;
  22. #endif  // _DEBUG
  23.  
  24. #pragma pack(push,_ATL_PACKING)
  25. namespace ATL
  26. {
  27. // Declare a global instance of this class to automatically register a custom trace category at startup
  28. class CTraceCategory
  29. {
  30. public:
  31. explicit CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel = 0 ) throw();
  32. #ifdef _DEBUG
  33. UINT GetLevel() const throw();
  34. void SetLevel( UINT nLevel ) throw();
  35. ATLTRACESTATUS GetStatus() const throw();
  36. void SetStatus( ATLTRACESTATUS eStatus) throw();
  37. #endif
  38. operator DWORD_PTR() const throw();
  39. public:
  40. #ifdef _DEBUG
  41. DWORD_PTR m_dwCategory;
  42. #endif
  43. };
  44. #ifdef _DEBUG
  45. class CTrace
  46. {
  47. public:
  48. typedef int (__cdecl *fnCrtDbgReport_t)(int,const char *,int,const char *,const char *,...);
  49. private:
  50. CTrace(
  51. #ifdef _ATL_NO_DEBUG_CRT
  52. fnCrtDbgReport_t pfnCrtDbgReport = NULL)
  53. #else
  54. fnCrtDbgReport_t pfnCrtDbgReport = _CrtDbgReport)
  55. #endif
  56. : m_hInst(reinterpret_cast<HINSTANCE>(&__ImageBase)),
  57. m_dwModule( 0 )
  58. {
  59. m_dwModule = AtlTraceRegister(m_hInst, pfnCrtDbgReport);
  60. }
  61. ~CTrace()
  62. {
  63. AtlTraceUnregister(m_dwModule);
  64. }
  65. public:
  66. bool ChangeCategory(DWORD_PTR dwCategory, UINT nLevel, ATLTRACESTATUS eStatus)
  67. {
  68. return 0 !=
  69. AtlTraceModifyCategory(0, dwCategory, nLevel, eStatus);
  70. }
  71. bool GetCategory(DWORD_PTR dwCategory, UINT *pnLevel, ATLTRACESTATUS *peStatus)
  72. {
  73. ATLASSERT(pnLevel && peStatus);
  74. return 0 != AtlTraceGetCategory(0, dwCategory, pnLevel, peStatus);
  75. }
  76. UINT GetLevel()
  77. {
  78. ATLTRACESTATUS eStatus;
  79. UINT nLevel;
  80. AtlTraceGetModule(0, m_dwModule, &nLevel, &eStatus);
  81. return nLevel;
  82. }
  83. void SetLevel(UINT nLevel)
  84. {
  85. AtlTraceModifyModule(0, m_dwModule, nLevel, ATLTRACESTATUS_ENABLED);
  86. }
  87. ATLTRACESTATUS GetStatus()
  88. {
  89. ATLTRACESTATUS eStatus;
  90. UINT nLevel;
  91. AtlTraceGetModule(0, m_dwModule, &nLevel, &eStatus);
  92. return eStatus;
  93. }
  94. void SetStatus(ATLTRACESTATUS eStatus)
  95. {
  96. ATLTRACESTATUS eOldStatus;
  97. UINT nLevel;
  98. AtlTraceGetModule(0, m_dwModule, &nLevel, &eOldStatus);
  99. AtlTraceModifyModule(0, m_dwModule, nLevel, eStatus);
  100. }
  101. void __cdecl TraceV(const char *pszFileName, int nLine,
  102. DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const;
  103. void __cdecl TraceV(const char *pszFileName, int nLine,
  104. DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const;
  105. DWORD_PTR RegisterCategory(LPCSTR pszCategory)
  106. {return(AtlTraceRegisterCategoryA(m_dwModule, pszCategory));}
  107. #ifdef _UNICODE
  108. DWORD_PTR RegisterCategory(LPCWSTR pszCategory)
  109. {return(AtlTraceRegisterCategoryU(m_dwModule, pszCategory));}
  110. #endif
  111. bool LoadSettings(LPCTSTR pszFileName = NULL) const
  112. {return 0 != AtlTraceLoadSettings(pszFileName);}
  113. void SaveSettings(LPCTSTR pszFileName = NULL) const
  114. {AtlTraceSaveSettings(pszFileName);}
  115. public:
  116. static CTrace s_trace;
  117. protected:
  118. HINSTANCE m_hInst;
  119. DWORD_PTR m_dwModule;
  120. };
  121.     inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine,
  122. DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const
  123. {
  124. AtlTraceVA(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args);
  125. }
  126. inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine,
  127. DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const
  128. {
  129. AtlTraceVU(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args);
  130. }
  131. extern CTraceCategory atlTraceGeneral;
  132. class CTraceFileAndLineInfo
  133. {
  134. public:
  135. CTraceFileAndLineInfo(const char *pszFileName, int nLineNo)
  136. : m_pszFileName(pszFileName), m_nLineNo(nLineNo)
  137. {}
  138. #pragma warning(push)
  139. #pragma warning(disable : 4793)
  140. void __cdecl operator()(DWORD_PTR dwCategory, UINT nLevel, const char *pszFmt, ...) const
  141. {
  142. va_list ptr; va_start(ptr, pszFmt);
  143. ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr);
  144. va_end(ptr);
  145. }
  146. #pragma warning(pop)
  147. #pragma warning(push)
  148. #pragma warning(disable : 4793)
  149. void __cdecl operator()(DWORD_PTR dwCategory, UINT nLevel, const wchar_t *pszFmt, ...) const
  150. {
  151. va_list ptr; va_start(ptr, pszFmt);
  152. ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr);
  153. va_end(ptr);
  154. }
  155. #pragma warning(pop)
  156. #pragma warning(push)
  157. #pragma warning(disable : 4793)
  158. void __cdecl operator()(const char *pszFmt, ...) const
  159. {
  160. va_list ptr; va_start(ptr, pszFmt);
  161. ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, atlTraceGeneral, 0, pszFmt, ptr);
  162. va_end(ptr);
  163. }
  164. #pragma warning(pop)
  165. #pragma warning(push)
  166. #pragma warning(disable : 4793)
  167. void __cdecl operator()(const wchar_t *pszFmt, ...) const
  168. {
  169. va_list ptr; va_start(ptr, pszFmt);
  170. ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, atlTraceGeneral, 0, pszFmt, ptr);
  171. va_end(ptr);
  172. }
  173. #pragma warning(pop)
  174. private:
  175. /* unimplemented */
  176. CTraceFileAndLineInfo &__cdecl operator=(const CTraceFileAndLineInfo &right);
  177. const char *const m_pszFileName;
  178. const int m_nLineNo;
  179. };
  180. #endif  // _DEBUG
  181. #ifdef _DEBUG
  182. inline CTraceCategory::CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel ) throw() :
  183. m_dwCategory( 0 )
  184. {
  185. m_dwCategory = ATL::CTrace::s_trace.RegisterCategory( pszCategoryName );
  186. ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nStartingLevel, ATLTRACESTATUS_INHERIT);
  187. }
  188. inline CTraceCategory::operator DWORD_PTR() const throw()
  189. {
  190. return( m_dwCategory );
  191. }
  192. inline UINT CTraceCategory::GetLevel() const throw()
  193. {
  194. UINT nLevel;
  195. ATLTRACESTATUS eStatus;
  196. ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eStatus );
  197. return( nLevel );
  198. }
  199. inline void CTraceCategory::SetLevel( UINT nLevel ) throw()
  200. {
  201. ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nLevel, ATLTRACESTATUS_ENABLED );
  202. }
  203. inline ATLTRACESTATUS CTraceCategory::GetStatus() const throw()
  204. {
  205. UINT nLevel;
  206. ATLTRACESTATUS eStatus;
  207. ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eStatus );
  208. return( eStatus );
  209. }
  210. inline void CTraceCategory::SetStatus( ATLTRACESTATUS eStatus ) throw()
  211. {
  212. UINT nLevel;
  213. ATLTRACESTATUS eOldStatus;
  214. ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eOldStatus );
  215. ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nLevel, eStatus );
  216. }
  217. #else  // !_DEBUG
  218. inline CTraceCategory::CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel ) throw()
  219. {
  220. (void)pszCategoryName;
  221. (void)nStartingLevel;
  222. }
  223. inline CTraceCategory::operator DWORD_PTR() const throw()
  224. {
  225. return( 0 );
  226. }
  227. #endif  // _DEBUG
  228. }  // namespace ATL
  229.  
  230. namespace ATL
  231. {
  232. #ifdef _DEBUG
  233. #define DECLARE_TRACE_CATEGORY( name ) extern ATL::CTraceCategory name;
  234. #else
  235. #define DECLARE_TRACE_CATEGORY( name ) const DWORD_PTR name = 0;
  236. #endif
  237. DECLARE_TRACE_CATEGORY( atlTraceGeneral )
  238. DECLARE_TRACE_CATEGORY( atlTraceCOM )  
  239. DECLARE_TRACE_CATEGORY( atlTraceQI )
  240. DECLARE_TRACE_CATEGORY( atlTraceRegistrar )
  241. DECLARE_TRACE_CATEGORY( atlTraceRefcount )
  242. DECLARE_TRACE_CATEGORY( atlTraceWindowing )
  243. DECLARE_TRACE_CATEGORY( atlTraceControls )
  244. DECLARE_TRACE_CATEGORY( atlTraceHosting ) 
  245. DECLARE_TRACE_CATEGORY( atlTraceDBClient )  
  246. DECLARE_TRACE_CATEGORY( atlTraceDBProvider )
  247. DECLARE_TRACE_CATEGORY( atlTraceSnapin )
  248. DECLARE_TRACE_CATEGORY( atlTraceNotImpl )   
  249. DECLARE_TRACE_CATEGORY( atlTraceAllocation )
  250. DECLARE_TRACE_CATEGORY( atlTraceException )
  251. DECLARE_TRACE_CATEGORY( atlTraceTime )
  252. DECLARE_TRACE_CATEGORY( atlTraceCache )
  253. DECLARE_TRACE_CATEGORY( atlTraceStencil )
  254. DECLARE_TRACE_CATEGORY( atlTraceString )
  255. DECLARE_TRACE_CATEGORY( atlTraceMap )
  256. DECLARE_TRACE_CATEGORY( atlTraceUtil )
  257. DECLARE_TRACE_CATEGORY( atlTraceSecurity )
  258. DECLARE_TRACE_CATEGORY( atlTraceSync )
  259. DECLARE_TRACE_CATEGORY( atlTraceISAPI )
  260. // atlTraceUser categories are no longer needed.  Just declare your own trace category using CTraceCategory.
  261. DECLARE_TRACE_CATEGORY( atlTraceUser )
  262. DECLARE_TRACE_CATEGORY( atlTraceUser2 )
  263. DECLARE_TRACE_CATEGORY( atlTraceUser3 )
  264. DECLARE_TRACE_CATEGORY( atlTraceUser4 )
  265. #pragma deprecated( atlTraceUser )
  266. #pragma deprecated( atlTraceUser2 )
  267. #pragma deprecated( atlTraceUser3 )
  268. #pragma deprecated( atlTraceUser4 )
  269. #ifdef _DEBUG
  270. #ifndef _ATL_NO_DEBUG_CRT
  271. class CNoUIAssertHook
  272. {
  273. public:
  274. CNoUIAssertHook()
  275. {
  276. ATLASSERT( s_pfnPrevHook == NULL );
  277. s_pfnPrevHook = _CrtSetReportHook(CrtHookProc);
  278. }
  279. ~CNoUIAssertHook()
  280. {
  281. _CrtSetReportHook(s_pfnPrevHook);
  282. s_pfnPrevHook = NULL;
  283. }
  284. private:
  285. static int __cdecl CrtHookProc(__in int eReportType, __in_z char* pszMessage, __out int* pnRetVal)
  286. {
  287. if (eReportType == _CRT_ASSERT)
  288. {
  289. ::OutputDebugStringA( "ASSERTION FAILEDn" );
  290. ::OutputDebugStringA( pszMessage );
  291. //If caller doesn't want retVal, so be it.
  292. if (pnRetVal != NULL)
  293. {
  294. *pnRetVal = 1;
  295. }
  296. return TRUE;
  297. }
  298. if (s_pfnPrevHook != NULL)
  299. {
  300. return s_pfnPrevHook(eReportType, pszMessage, pnRetVal);
  301. }
  302. else
  303. {
  304. return FALSE;
  305. }
  306. }
  307. private:
  308. static _CRT_REPORT_HOOK s_pfnPrevHook;
  309. };
  310. __declspec( selectany ) _CRT_REPORT_HOOK CNoUIAssertHook::s_pfnPrevHook = NULL;
  311. #define DECLARE_NOUIASSERT() ATL::CNoUIAssertHook _g_NoUIAssertHook;
  312. #endif  // _ATL_NO_DEBUG_CRT
  313. #ifndef ATLTRACE
  314. #define ATLTRACE ATL::CTraceFileAndLineInfo(__FILE__, __LINE__)
  315. #define ATLTRACE2 ATLTRACE
  316. #endif
  317. #pragma warning(push)
  318. #pragma warning(disable : 4793)
  319. inline void __cdecl AtlTrace(LPCSTR pszFormat, ...)
  320. {
  321. va_list ptr;
  322. va_start(ptr, pszFormat);
  323. ATL::CTrace::s_trace.TraceV(NULL, -1, atlTraceGeneral, 0, pszFormat, ptr);
  324. va_end(ptr);
  325. }
  326. #pragma warning(pop)
  327. #pragma warning(push)
  328. #pragma warning(disable : 4793)
  329. inline void __cdecl AtlTrace(LPCWSTR pszFormat, ...)
  330. {
  331. va_list ptr;
  332. va_start(ptr, pszFormat);
  333. ATL::CTrace::s_trace.TraceV(NULL, -1, atlTraceGeneral, 0, pszFormat, ptr);
  334. va_end(ptr);
  335. }
  336. #pragma warning(pop)
  337. #pragma warning(push)
  338. #pragma warning(disable : 4793)
  339. inline void __cdecl AtlTrace2(DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFormat, ...)
  340. {
  341. va_list ptr;
  342. va_start(ptr, pszFormat);
  343. ATL::CTrace::s_trace.TraceV(NULL, -1, dwCategory, nLevel, pszFormat, ptr);
  344. va_end(ptr);
  345. }
  346. #pragma warning(pop)
  347. #pragma warning(push)
  348. #pragma warning(disable : 4793)
  349. inline void __cdecl AtlTrace2(DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFormat, ...)
  350. {
  351. va_list ptr;
  352. va_start(ptr, pszFormat);
  353. ATL::CTrace::s_trace.TraceV(NULL, -1, dwCategory, nLevel, pszFormat, ptr);
  354. va_end(ptr);
  355. }
  356. #pragma warning(pop)
  357. #define ATLTRACENOTIMPL(funcname)  do { ATLTRACE(ATL::atlTraceNotImpl, 0, _T("ATL: %s not implemented.n"), funcname); return E_NOTIMPL; } while(0)
  358. #else // !DEBUG
  359. #pragma warning(push)
  360. #pragma warning(disable : 4793)
  361. inline void __cdecl AtlTraceNull(...){}
  362. inline void __cdecl AtlTrace(LPCSTR , ...){}
  363. inline void __cdecl AtlTrace2(DWORD_PTR, UINT, LPCSTR , ...){}
  364. inline void __cdecl AtlTrace(LPCWSTR , ...){}
  365. inline void __cdecl AtlTrace2(DWORD_PTR, UINT, LPCWSTR , ...){}
  366. #pragma warning(pop)
  367. #ifndef ATLTRACE
  368. #define ATLTRACE            __noop
  369. #define ATLTRACE2           __noop
  370. #endif //ATLTRACE
  371. #define ATLTRACENOTIMPL(funcname)   return E_NOTIMPL
  372. #define DECLARE_NOUIASSERT()
  373. #endif //!_DEBUG
  374. };  // namespace ATL
  375. #pragma pack(pop)
  376. #endif  // __ATLTRACE_H__