////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000 Microsoft Corporation // // Module Name: // BCATrace.h // // Description: // Contains definition of a few macros and a class that helps in tracing. // // Implementation Files: // None // // Maintained By: // Vij Vasu (Vvasu) 03-MAR-2000 // ////////////////////////////////////////////////////////////////////////////// // Make sure that this file is included only once per compile path. #pragma once #ifdef DEBUG ////////////////////////////////////////////////////////////////////////////// // Include Files ////////////////////////////////////////////////////////////////////////////// // For debugging functions. #include "Debug.h" // For Logging functions. #include "Log.h" // For PszTraceFindInterface() #include "CiTracker.h" ////////////////////////////////////////////////////////////////////// // Macro Definitions ////////////////////////////////////////////////////////////////////////////// #define BCA_TRACE_FLAGS static_cast< unsigned long >( mtfALWAYS ) ////////////////////////////////////////////////////////////////////////////// //++ // // MACRO // BCATraceMsg( // _pszfn // ) // // Description: // Displays file, line number, module and "_pszfn" only if the // mtfOUTPUTTODISK | mtfFunc is set in g_tfModule. "_pszfn" is the name of the // function just entered. // // Arguments: // _pszfn - Name of the function just entered. // // Return Values: // None. // //-- ////////////////////////////////////////////////////////////////////////////// #define BCATraceMsg( _pszfn ) \ do \ { \ if ( g_tfModule != 0 ) \ { \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, BCA_TRACE_FLAGS, TEXT("| ") TEXT(_pszfn) ); \ } \ } while ( 0 ) // // These next macros are just like TraceFunc except they take additional // arguments to display the values passed into the function call. "_pszfn" // should contain a printf string on how to display the arguments. // #define BCATraceMsg1( _pszfn, _arg1 ) \ do \ { \ if ( g_tfModule != 0 ) \ { \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, BCA_TRACE_FLAGS, TEXT("| ") TEXT(_pszfn), _arg1 ); \ } \ } while ( 0 ) #define BCATraceMsg2( _pszfn, _arg1, _arg2 ) \ do \ { \ if ( g_tfModule != 0 ) \ { \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, BCA_TRACE_FLAGS, TEXT("| ") TEXT(_pszfn), _arg1, _arg2 ); \ } \ } while ( 0 ) #define BCATraceMsg3( _pszfn, _arg1, _arg2, _arg3 ) \ do \ { \ if ( g_tfModule != 0 ) \ { \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, BCA_TRACE_FLAGS, TEXT("| ") TEXT(_pszfn), _arg1, _arg2, _arg3 ); \ } \ } while ( 0 ) #define BCATraceMsg4( _pszfn, _arg1, _arg2, _arg3, _arg4 ) \ do \ { \ if ( g_tfModule != 0 ) \ { \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, BCA_TRACE_FLAGS, TEXT("| ") TEXT(_pszfn), _arg1, _arg2, _arg3, _arg4 ); \ } \ } while ( 0 ) #define BCATraceMsg5( _pszfn, _arg1, _arg2, _arg3, _arg4, _arg5 ) \ do \ { \ if ( g_tfModule != 0 ) \ { \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, BCA_TRACE_FLAGS, TEXT("| ") TEXT(_pszfn), _arg1, _arg2, _arg3, _arg4, _arg5 ); \ } \ } while ( 0 ) #define BCATraceMsg6( _pszfn, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6 ) \ do \ { \ if ( g_tfModule != 0 ) \ { \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, BCA_TRACE_FLAGS, TEXT("| ") TEXT(_pszfn), _arg1, _arg2, _arg3, _arg4, _arg5, _arg6 ); \ } \ } while ( 0 ) #define BCATraceScope( _szArgs ) \ CBCATraceScope scopeTracker##__LINE__( TEXT(__FILE__), __LINE__, __MODULE__, TEXT(__FUNCTION__) ); \ if ( g_tfModule != 0 ) \ { \ DebugIncrementStackDepthCounter( ); \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, mtfFUNC, TEXT("+ ") TEXT(__FUNCTION__) TEXT("( ") TEXT(_szArgs) TEXT(" )") ); \ } #define BCATraceScope1( _szArgs, _arg1 ) \ CBCATraceScope scopeTracker##__LINE__( TEXT(__FILE__), __LINE__, __MODULE__, TEXT(__FUNCTION__) ); \ if ( g_tfModule != 0 ) \ { \ DebugIncrementStackDepthCounter( ); \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, mtfFUNC, TEXT("+ ") TEXT(__FUNCTION__) TEXT("( ") TEXT(_szArgs) TEXT(" )"), _arg1 ); \ } #define BCATraceScope2( _szArgs, _arg1, _arg2 ) \ CBCATraceScope scopeTracker##__LINE__( TEXT(__FILE__), __LINE__, __MODULE__, TEXT(__FUNCTION__) ); \ if ( g_tfModule != 0 ) \ { \ DebugIncrementStackDepthCounter( ); \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, mtfFUNC, TEXT("+ ") TEXT(__FUNCTION__) TEXT("( ") TEXT(_szArgs) TEXT(" )"), _arg1, _arg2 ); \ } #define BCATraceScope3( _szArgs, _arg1, _arg2, _arg3 ) \ CBCATraceScope scopeTracker##__LINE__( TEXT(__FILE__), __LINE__, __MODULE__, TEXT(__FUNCTION__) ); \ if ( g_tfModule != 0 ) \ { \ DebugIncrementStackDepthCounter( ); \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, mtfFUNC, TEXT("+ ") TEXT(__FUNCTION__) TEXT("( ") TEXT(_szArgs) TEXT(" )"), _arg1, _arg2, _arg3 ); \ } #define BCATraceScope4( _szArgs, _arg1, _arg2, _arg3, _arg4 ) \ CBCATraceScope scopeTracker##__LINE__( TEXT(__FILE__), __LINE__, __MODULE__, TEXT(__FUNCTION__) ); \ if ( g_tfModule != 0 ) \ { \ DebugIncrementStackDepthCounter( ); \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, mtfFUNC, TEXT("+ ") TEXT(__FUNCTION__) TEXT("( ") TEXT(_szArgs) TEXT(" )"), _arg1, _arg2, _arg3, _arg4 ); \ } #define BCATraceScope5( _szArgs, _arg1, _arg2, _arg3, _arg4, _arg5 ) \ CBCATraceScope scopeTracker##__LINE__( TEXT(__FILE__), __LINE__, __MODULE__, TEXT(__FUNCTION__) ); \ if ( g_tfModule != 0 ) \ { \ DebugIncrementStackDepthCounter( ); \ TraceMessage( TEXT(__FILE__), __LINE__, __MODULE__, mtfFUNC, TEXT("+ ") TEXT(__FUNCTION__) TEXT("( ") TEXT(_szArgs) TEXT(" )"), _arg1, _arg2, _arg3, _arg4, _arg5 ); \ } #define BCATraceQIScope( _riid, _ppv ) \ CBCATraceScope scopeTracker##__LINE__( TEXT(__FILE__), __LINE__, __MODULE__, TEXT(__FUNCTION__), _riid, _ppv ) ////////////////////////////////////////////////////////////////////////////// // Class Definitions ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //++ // // class CBCATraceScope // // Description: // This class traces entry and exit of a scope. To use this class, // instantiate an object of this class in the scope to be traced. // //-- ////////////////////////////////////////////////////////////////////////////// class CBCATraceScope { public: const TCHAR * const m_pszFileName; const UINT m_uiLine; const TCHAR * const m_pszModuleName; const TCHAR * const m_pszScopeName; // Constructor - prints function entry. CBCATraceScope( const TCHAR * const pszFileNameIn , const UINT uiLineIn , const TCHAR * const pszModuleNameIn , const TCHAR * const pszScopeNameIn ) : m_pszFileName( pszFileNameIn ) , m_uiLine( uiLineIn ) , m_pszModuleName( pszModuleNameIn ) , m_pszScopeName( pszScopeNameIn ) { } //*** CBCATraceScope::CBCATraceScope( ) // Constructor for QIs CBCATraceScope( const TCHAR * const pszFileNameIn , const UINT uiLineIn , const TCHAR * const pszModuleNameIn , const TCHAR * const pszScopeNameIn , REFIID riid , void ** ppv ) : m_pszFileName( pszFileNameIn ) , m_uiLine( uiLineIn ) , m_pszModuleName( pszModuleNameIn ) , m_pszScopeName( pszScopeNameIn ) { if ( g_tfModule != 0 ) { WCHAR szGuid[ cchGUID_STRING_SIZE ]; DebugIncrementStackDepthCounter( ); TraceMessage( m_pszFileName , m_uiLine , m_pszModuleName , mtfFUNC , TEXT("+ %s( [IUnknown] %s, ppv = %#x )") , m_pszScopeName , PszTraceFindInterface( riid, szGuid ) , ppv ); } } //*** CBCATraceScope::CBCATraceScope( ) // Destructor - prints function exit. ~CBCATraceScope( void ) { if ( g_tfModule != 0 ) { TraceMessage( m_pszFileName , m_uiLine , m_pszModuleName , mtfFUNC , TEXT("V %s") , m_pszScopeName ); DebugDecrementStackDepthCounter( ); } } //*** CBCATraceScope::~CBCATraceScope( ) }; //*** class CBCATraceScope #else // ifdef DEBUG // For Logging functions. #include "Log.h" #define BCATraceMsg( _pszfn ) #define BCATraceMsg1( _pszfn, _arg1 ) #define BCATraceMsg2( _pszfn, _arg1, _arg2 ) #define BCATraceMsg3( _pszfn, _arg1, _arg2, _arg3 ) #define BCATraceMsg4( _pszfn, _arg1, _arg2, _arg3, _arg4 ) #define BCATraceMsg5( _pszfn, _arg1, _arg2, _arg3, _arg4, _arg5 ) #define BCATraceMsg6( _pszfn, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6 ) #define BCATraceScope( _szArgs ) #define BCATraceScope1( _szArgs, _arg1 ) #define BCATraceScope2( _szArgs, _arg1, _arg2 ) #define BCATraceScope3( _szArgs, _arg1, _arg2, _arg3 ) #define BCATraceScope4( _szArgs, _arg1, _arg2, _arg3, _arg4 ) #define BCATraceScope5( _szArgs, _arg1, _arg2, _arg3, _arg4, _arg5 ) #define BCATraceQIScope( _riid, _ppv ) #endif // ifdef DEBUG