WindowsXP-SP1/admin/hmonitor/snapin/debug.h
2020-09-30 16:53:49 +02:00

148 lines
3.0 KiB
C++

// 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__