Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// Debug.h: generic debugging facilities.
//
//////////////////////////////////////////////////////////////////////
#ifndef __DEBUG_H__
#define __DEBUG_H__
#ifdef _DEBUG
//////////////////////////////////////////////////////////////////////
// Class CTraceEx
//
// Implements TRACEX macro.
// Don't ever use directly, just use TRACEX
//
class CTraceEx {
// Construction/Destruction
public: CTraceEx() { nIndent++; } ~CTraceEx() { nIndent--; }
private: static int nIndent; // current indent level
friend void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...);
};
// NOTE: YOU MUST NOT USE TRACEX IN A ONE-LINE IF STATEMENT!
// This will fail:
//
// if (foo)
// TRACEX(...)
//
// Instead, you must enclose the TRACE in squiggle-brackets
//
// if (foo) {
// TRACEX(...)
// }
//
#define TRACEX CTraceEx __fooble; TRACE(_T("->")); TRACE
// Goodies to get names of things.
//
extern CString sDbgName(CWnd* pWnd); // get name of window
extern CString sDbgName(UINT uMsg); // get name of WM_ message
#ifdef REFIID
struct DBGINTERFACENAME { const IID* piid; // ptr to GUID
LPCSTR name; // human-readable name of interface
};
// Change this to whatever interfaces you want to track
// Default is none
//
extern DBGINTERFACENAME* _pDbgInterfaceNames;
extern CString sDbgName(REFIID iid); // get name of COM interface
#endif // REFIID
#else // Not _DEBUG
#define sDbgName(x) CString()
#define TRACEX TRACE
#endif
// Macro casts to LPCTSTR for use with TRACE/printf/CString::Format
//
#define DbgName(x) (LPCTSTR)sDbgName(x)
//////////////////////////////////////////////////////////////////////
// Inlines
inline bool CHECKOBJPTR(CObject* pObj, const CRuntimeClass* pClass, size_t size) { ASSERT(pObj);
if( pObj == NULL ) { TRACE(_T("WARNING : object pointer is NULL !\n")); return false; }
if( ! AfxIsValidAddress((LPVOID)pObj,size) ) { TRACE(_T("FAILED : object pointer points to invalid memory !\n")); return false; }
ASSERT_VALID(pObj);
if( ! pObj->IsKindOf(pClass) ) { TRACE(_T("FAILED : object pointer is not of type %s !\n"),pClass->m_lpszClassName); return false; }
return true; }
inline bool CHECKPTR(LPVOID pVoid, size_t size) { ASSERT(pVoid);
if( pVoid == NULL ) { TRACE(_T("WARNING : pointer is NULL !\n")); return false; }
if( ! AfxIsValidAddress((LPVOID)pVoid,size) ) { TRACE(_T("FAILED : pointer points to invalid memory !\n")); return false; }
return true; }
inline bool CHECKHRESULT(HRESULT hr) { ASSERT(hr != E_FAIL);
if( hr != S_OK ) { TRACE(_T("FAILED : HRESULT=%X\n"),hr); // ASSERT(FALSE);
return false; }
return true; }
#define TRACEARGn(Arg) (TRACE(_T("[")_T(#Arg)_T("]=%d\n"),Arg))
#define TRACEARGs(Arg) (TRACE(_T("[")_T(#Arg)_T("]=%s\n"),Arg))
#define GfxCheckObjPtr(p,classname) (CHECKOBJPTR(p,RUNTIME_CLASS(classname),sizeof(#classname)))
#define GfxCheckPtr(p,classname) (CHECKPTR(p,sizeof(#classname)))
#endif //__DEBUG_H__
|