//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1992. // // File: dbgpoint.hxx // // Contents: Support for visual debug values // // Classes: CDebugBaseClass // CDebugBreakPoint // CDebugValue // // Functions: // // History: 12-Mar-93 KevinRo Created // // This module handles debug values, such as breakpoints and settable // values. By using this module, the values can be examined and changed // in a debugging window. The debugging window uses its own thread, so // changes can be effected asynchronously. // //-------------------------------------------------------------------------- #ifndef __DBGPOINT_HXX__ #define __DBGPOINT_HXX__ #if defined(__cplusplus) enum DebugValueType { dvtBreakPoint, dvtInfoLevel, dvtValue }; class CDebugBaseClass; // // The following routines are exported from commnot.dll // extern "C" EXPORTDEF void APINOT dbgRegisterGroup(WCHAR const *pwzName,HANDLE *hGroup); extern "C" EXPORTDEF void APINOT dbgRemoveGroup(HANDLE hGroup); extern "C" EXPORTDEF void APINOT dbgRegisterValue(WCHAR const *pwzName,HANDLE hGroup,CDebugBaseClass *pdv); extern "C" EXPORTDEF void APINOT dbgRemoveValue(HANDLE hGroup,CDebugBaseClass *pdv); extern "C" EXPORTDEF void APINOT dbgNotifyChange(HANDLE hGroup,CDebugBaseClass *pdv); extern "C" EXPORTDEF ULONG APINOT dbgGetIniInfoLevel(WCHAR const *pwzName,ULONG ulDefault); extern "C" EXPORTDEF ULONG APINOT dbgBreakDialog(char const *pszFileName,ULONG ulLineNumber,WCHAR const *pwzName,long ulCode); // The following values may be returned by dbgBreakDialog #define CDBG_BREAKPOINT_CONTINUE 0x01 #define CDBG_BREAKPOINT_BREAK 0x02 #define CDBG_BREAKPOINT_DISABLE 0x04 // // The following group is for the Infolevel Group. The group is automatically // registered when a value is added to it. // #define HANDLE_INFOLEVELGROUP ((HANDLE)-1) //+------------------------------------------------------------------------- // // Class: CDebugBaseClass // // Purpose: Defines a base class used by visual debug value system // // Interface: // // History: 12-Mar-93 KevinRo Created // // Notes: // //-------------------------------------------------------------------------- class CDebugBaseClass { public: CDebugBaseClass(WCHAR const *pwzValueName, HANDLE hGroupHandle, DebugValueType dvtType): _dvtType(dvtType), _hGroupHandle(hGroupHandle) { } void Register(WCHAR const *pwzValueName) { dbgRegisterValue(pwzValueName,_hGroupHandle,this); } virtual ~CDebugBaseClass() { dbgRemoveValue(_hGroupHandle,this); } virtual void NotifyChange() { dbgNotifyChange(_hGroupHandle,this); } DebugValueType GetValueType() {return _dvtType;} HANDLE GetGroupHandle() { return _hGroupHandle;} private: HANDLE _hGroupHandle; DebugValueType _dvtType; }; //+------------------------------------------------------------------------- // // Class: CDebugBreakPoint // // Purpose: Defines an externally switchable break point. By using the // visual debug window, you can set or clear this breakpoint // while a program runs. // // Interface: // // History: 12-Mar-93 KevinRo Created // // Notes: // //-------------------------------------------------------------------------- class CDebugBreakPoint : public CDebugBaseClass { public: CDebugBreakPoint(WCHAR const *pwzName,HANDLE hGroup,ULONG fBreakSet): _fBreakSet(fBreakSet), _pwzName(pwzName), CDebugBaseClass(pwzName,hGroup,dvtBreakPoint) { Register(pwzName); } ~CDebugBreakPoint() { } void ToggleBreakPoint() { _fBreakSet = !_fBreakSet; NotifyChange(); } ULONG GetBreakPoint() { return(_fBreakSet); } ULONG SetBreakPoint() { register ret = _fBreakSet; _fBreakSet = TRUE; NotifyChange(); return(ret); } ULONG ClearBreakPoint() { register ret = _fBreakSet; _fBreakSet = FALSE; NotifyChange(); return(ret); } inline BOOL BreakPointTest() { return _fBreakSet; } inline BOOL BreakPointMessage(char *pszFileName,ULONG ulLineNo,long lCode=0) { ULONG rc = dbgBreakDialog(pszFileName,ulLineNo,_pwzName,lCode); if(rc & CDBG_BREAKPOINT_DISABLE) ClearBreakPoint(); return(rc & CDBG_BREAKPOINT_BREAK); } public: WCHAR const * _pwzName; BOOL _fBreakSet; }; //+------------------------------------------------------------------------- // // Class: CDebugValue // // Purpose: A DebugValue makes a ULONG value visible and settable // from the debugging window. By accepting a ULONG reference, // it is possible to expose a ULONG value to the debugging // window. // // Interface: // // History: 12-Mar-93 KevinRo Created // // Notes: // //-------------------------------------------------------------------------- class CDebugValue : public CDebugBaseClass { public: CDebugValue(WCHAR const *pwzName,HANDLE hGroup,ULONG & ulValue): _ulValue(ulValue), CDebugBaseClass(pwzName,hGroup,dvtValue) { Register(pwzName); } ~CDebugValue() { } ULONG GetValue() { return(_ulValue); } ULONG SetValue(ULONG ulValue) { register ret = _ulValue; _ulValue = ulValue; NotifyChange(); return(ret); } private: ULONG & _ulValue; }; //+------------------------------------------------------------------------- // // Class: CInfoLevel // // Purpose: A CInfoLevel makes an InfoLevel value accessable by the // debugging window. // // Interface: // // History: 12-Mar-93 KevinRo Created // // Notes: // //-------------------------------------------------------------------------- class CInfoLevel : public CDebugBaseClass { public: CInfoLevel(WCHAR const *pwzName,ULONG & ulValue,ULONG deflvl = DEF_INFOLEVEL): _ulInfoLevel(ulValue), CDebugBaseClass(pwzName,HANDLE_INFOLEVELGROUP,dvtInfoLevel) { _ulInfoLevel = dbgGetIniInfoLevel(pwzName,deflvl); Register(pwzName); } ~CInfoLevel() { } ULONG GetInfoLevel() { return(_ulInfoLevel); } ULONG SetInfoLevel(ULONG ulValue) { register ret = _ulInfoLevel; _ulInfoLevel = ulValue; NotifyChange(); return(ret); } private: ULONG & _ulInfoLevel; }; //+------------------------------------------------------------------------- // // Class: CDebugGroupClass // // Purpose: Encapsulates a Debug Group // // Notes: // //-------------------------------------------------------------------------- class CDebugGroupClass { public: CDebugGroupClass(WCHAR *pwzName) { dbgRegisterGroup(pwzName,&_hGroup); } ~CDebugGroupClass() { dbgRemoveGroup(_hGroup); } operator HANDLE() { return(_hGroup); } private: HANDLE _hGroup; }; #endif // defined(__cplusplus) #endif // __DBGPOINT_HXX__