home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / VFORM.ZIP / Samples / vfTest / Debug.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-10  |  13.8 KB  |  415 lines

  1. ////////////////////////////////////////////////////////////////
  2. // Copyright 1996 Microsoft Systems Journal. 
  3. // If this program works, it was written by Paul DiLascia.
  4. // If not, I don't know who wrote it.
  5. //
  6. // General purpose debugging utilities
  7. // 
  8. #include "StdAfx.h"
  9. #include "Debug.h"
  10. #include <afxpriv.h>    // for MFC WM_ messages
  11.  
  12. #ifdef _DEBUG
  13.  
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17.  
  18. int CTraceFn::nIndent=-1;        // current indent level
  19.  
  20. #define _countof(array) (sizeof(array)/sizeof(array[0]))
  21.  
  22. ////////////////
  23. // These functions are copied from dumpout.cpp in the MFC source,
  24. // with my modification to do indented TRACEing
  25. //
  26. void AFXAPI AfxDump(const CObject* pOb)
  27. {
  28.     afxDump << pOb;
  29. }
  30.  
  31. void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...)
  32. {
  33. #ifdef _DEBUG // all AfxTrace output is controlled by afxTraceEnabled
  34.     if (!afxTraceEnabled)
  35.         return;
  36. #endif
  37.  
  38.     va_list args;
  39.     va_start(args, lpszFormat);
  40.  
  41.     int nBuf;
  42.     TCHAR szBuffer[512];
  43.  
  44.     nBuf = _vstprintf(szBuffer, lpszFormat, args);
  45.     ASSERT(nBuf < _countof(szBuffer));
  46.  
  47.     // PD: Here are my added lines to do the indenting. Search
  48.     // for newlines and insert prefix before each one. Yawn.
  49.     //
  50.     static BOOL bStartNewLine = TRUE;
  51.     TCHAR* nextline;
  52.     for (TCHAR* start = szBuffer; *start; start=nextline+1) {
  53.         if (bStartNewLine) {
  54.             if ((afxTraceFlags & traceMultiApp) && (AfxGetApp() != NULL))
  55.                 afxDump << AfxGetApp()->m_pszExeName << _T(": ");
  56.             afxDump << CString(_T(' '),CTraceFn::nIndent);
  57.             bStartNewLine = FALSE;
  58.         }
  59.         nextline = _tcschr(start, _T('\n'));
  60.         if (nextline) {
  61.             *nextline = 0; // terminate string at newline
  62.             bStartNewLine = TRUE;
  63.         }
  64.         afxDump << start;
  65.         if (!nextline)
  66.             break;
  67.         afxDump << _T("\n"); // the one I terminated
  68.     }
  69.         
  70.     va_end(args);
  71. }
  72.  
  73. //////////////////
  74. // Get window name in the form classname[HWND,title]
  75. // Searches all the parents for a window with a title.
  76. //
  77. CString sDbgName(CWnd* pWnd)
  78. {
  79.     CString sTitle;
  80.     HWND hwnd = pWnd->GetSafeHwnd();
  81.     if (hwnd==NULL)
  82.         sTitle = _T("NULL");
  83.     else if (!::IsWindow(hwnd))
  84.         sTitle = _T("[bad window]");
  85.     else {
  86.         sTitle = _T("[no title]");
  87.         for (CWnd* pw = pWnd; pw; pw = pw->GetParent()) {
  88.             if (pw->GetWindowTextLength() > 0) {
  89.                 pw->GetWindowText(sTitle);
  90.                 break;
  91.             }
  92.         }
  93.     }
  94.     CString s;
  95.     s.Format(_T("%s[0x%04x,\"%s\"]"), 
  96.         pWnd ? pWnd->GetRuntimeClass()->m_lpszClassName : "NULL",
  97.         hwnd, (LPCTSTR)sTitle);
  98.     return s;
  99. }
  100.  
  101. struct {
  102.     UINT        msg;
  103.     LPCTSTR    name;
  104. } MsgData[] = {
  105.     { WM_CREATE,_T("WM_CREATE") },
  106.     { WM_DESTROY,_T("WM_DESTROY") },
  107.     { WM_MOVE,_T("WM_MOVE") },
  108.     { WM_SIZE,_T("WM_SIZE") },
  109.     { WM_ACTIVATE,_T("WM_ACTIVATE") },
  110.     { WM_SETFOCUS,_T("WM_SETFOCUS") },
  111.     { WM_KILLFOCUS,_T("WM_KILLFOCUS") },
  112.     { WM_ENABLE,_T("WM_ENABLE") },
  113.     { WM_SETREDRAW,_T("WM_SETREDRAW") },
  114.     { WM_SETTEXT,_T("WM_SETTEXT") },
  115.     { WM_GETTEXT,_T("WM_GETTEXT") },
  116.     { WM_GETTEXTLENGTH,_T("WM_GETTEXTLENGTH") },
  117.     { WM_PAINT,_T("WM_PAINT") },
  118.     { WM_CLOSE,_T("WM_CLOSE") },
  119.     { WM_QUERYENDSESSION,_T("WM_QUERYENDSESSION") },
  120.     { WM_QUIT,_T("WM_QUIT") },
  121.     { WM_QUERYOPEN,_T("WM_QUERYOPEN") },
  122.     { WM_ERASEBKGND,_T("WM_ERASEBKGND") },
  123.     { WM_SYSCOLORCHANGE,_T("WM_SYSCOLORCHANGE") },
  124.     { WM_ENDSESSION,_T("WM_ENDSESSION") },
  125.     { WM_SHOWWINDOW,_T("WM_SHOWWINDOW") },
  126.     { WM_WININICHANGE,_T("WM_WININICHANGE") },
  127.     { WM_SETTINGCHANGE,_T("WM_SETTINGCHANGE") },
  128.     { WM_DEVMODECHANGE,_T("WM_DEVMODECHANGE") },
  129.     { WM_ACTIVATEAPP,_T("WM_ACTIVATEAPP") },
  130.     { WM_FONTCHANGE,_T("WM_FONTCHANGE") },
  131.     { WM_TIMECHANGE,_T("WM_TIMECHANGE") },
  132.     { WM_CANCELMODE,_T("WM_CANCELMODE") },
  133.     { WM_SETCURSOR,_T("WM_SETCURSOR") },
  134.     { WM_MOUSEACTIVATE,_T("WM_MOUSEACTIVATE") },
  135.     { WM_CHILDACTIVATE,_T("WM_CHILDACTIVATE") },
  136.     { WM_QUEUESYNC,_T("WM_QUEUESYNC") },
  137.     { WM_GETMINMAXINFO,_T("WM_GETMINMAXINFO") },
  138.     { WM_PAINTICON,_T("WM_PAINTICON") },
  139.     { WM_ICONERASEBKGND,_T("WM_ICONERASEBKGND") },
  140.     { WM_NEXTDLGCTL,_T("WM_NEXTDLGCTL") },
  141.     { WM_SPOOLERSTATUS,_T("WM_SPOOLERSTATUS") },
  142.     { WM_DRAWITEM,_T("WM_DRAWITEM") },
  143.     { WM_MEASUREITEM,_T("WM_MEASUREITEM") },
  144.     { WM_DELETEITEM,_T("WM_DELETEITEM") },
  145.     { WM_VKEYTOITEM,_T("WM_VKEYTOITEM") },
  146.     { WM_CHARTOITEM,_T("WM_CHARTOITEM") },
  147.     { WM_SETFONT,_T("WM_SETFONT") },
  148.     { WM_GETFONT,_T("WM_GETFONT") },
  149.     { WM_SETHOTKEY,_T("WM_SETHOTKEY") },
  150.     { WM_GETHOTKEY,_T("WM_GETHOTKEY") },
  151.     { WM_QUERYDRAGICON,_T("WM_QUERYDRAGICON") },
  152.     { WM_COMPAREITEM,_T("WM_COMPAREITEM") },
  153.     { WM_COMPACTING,_T("WM_COMPACTING") },
  154.     { WM_COMMNOTIFY,_T("WM_COMMNOTIFY") },
  155.     { WM_WINDOWPOSCHANGING,_T("WM_WINDOWPOSCHANGING") },
  156.     { WM_WINDOWPOSCHANGED,_T("WM_WINDOWPOSCHANGED") },
  157.     { WM_POWER,_T("WM_POWER") },
  158.     { WM_COPYDATA,_T("WM_COPYDATA") },
  159.     { WM_CANCELJOURNAL,_T("WM_CANCELJOURNAL") },
  160. #if(WINVER >= 0x0400)
  161.     { WM_NOTIFY,_T("WM_NOTIFY") },
  162.     { WM_INPUTLANGCHANGEREQUEST,_T("WM_INPUTLANGCHANGEREQUEST") },
  163.     { WM_INPUTLANGCHANGE,_T("WM_INPUTLANGCHANGE") },
  164.     { WM_TCARD,_T("WM_TCARD") },
  165.     { WM_HELP,_T("WM_HELP") },
  166.     { WM_USERCHANGED,_T("WM_USERCHANGED") },
  167.     { WM_NOTIFYFORMAT,_T("WM_NOTIFYFORMAT") },
  168.     { WM_CONTEXTMENU,_T("WM_CONTEXTMENU") },
  169.     { WM_STYLECHANGING,_T("WM_STYLECHANGING") },
  170.     { WM_STYLECHANGED,_T("WM_STYLECHANGED") },
  171.     { WM_DISPLAYCHANGE,_T("WM_DISPLAYCHANGE") },
  172.     { WM_GETICON,_T("WM_GETICON") },
  173.     { WM_SETICON,_T("WM_SETICON") },
  174. #endif /* WINVER >= 0x0400 */
  175.     { WM_NCCREATE,_T("WM_NCCREATE") },
  176.     { WM_NCDESTROY,_T("WM_NCDESTROY") },
  177.     { WM_NCCALCSIZE,_T("WM_NCCALCSIZE") },
  178.     { WM_NCHITTEST,_T("WM_NCHITTEST") },
  179.     { WM_NCPAINT,_T("WM_NCPAINT") },
  180.     { WM_NCACTIVATE,_T("WM_NCACTIVATE") },
  181.     { WM_GETDLGCODE,_T("WM_GETDLGCODE") },
  182.     { WM_NCMOUSEMOVE,_T("WM_NCMOUSEMOVE") },
  183.     { WM_NCLBUTTONDOWN,_T("WM_NCLBUTTONDOWN") },
  184.     { WM_NCLBUTTONUP,_T("WM_NCLBUTTONUP") },
  185.     { WM_NCLBUTTONDBLCLK,_T("WM_NCLBUTTONDBLCLK") },
  186.     { WM_NCRBUTTONDOWN,_T("WM_NCRBUTTONDOWN") },
  187.     { WM_NCRBUTTONUP,_T("WM_NCRBUTTONUP") },
  188.     { WM_NCRBUTTONDBLCLK,_T("WM_NCRBUTTONDBLCLK") },
  189.     { WM_NCMBUTTONDOWN,_T("WM_NCMBUTTONDOWN") },
  190.     { WM_NCMBUTTONUP,_T("WM_NCMBUTTONUP") },
  191.     { WM_NCMBUTTONDBLCLK,_T("WM_NCMBUTTONDBLCLK") },
  192.     { WM_KEYDOWN,_T("WM_KEYDOWN") },
  193.     { WM_KEYUP,_T("WM_KEYUP") },
  194.     { WM_CHAR,_T("WM_CHAR") },
  195.     { WM_DEADCHAR,_T("WM_DEADCHAR") },
  196.     { WM_SYSKEYDOWN,_T("WM_SYSKEYDOWN") },
  197.     { WM_SYSKEYUP,_T("WM_SYSKEYUP") },
  198.     { WM_SYSCHAR,_T("WM_SYSCHAR") },
  199.     { WM_SYSDEADCHAR,_T("WM_SYSDEADCHAR") },
  200.     { WM_KEYDOWN,_T("WM_KEYDOWN") },
  201.     { WM_KEYUP,_T("WM_KEYUP") },
  202.     { WM_CHAR,_T("WM_CHAR") },
  203.     { WM_DEADCHAR,_T("WM_DEADCHAR") },
  204.     { WM_SYSKEYDOWN,_T("WM_SYSKEYDOWN") },
  205.     { WM_SYSKEYUP,_T("WM_SYSKEYUP") },
  206.     { WM_SYSCHAR,_T("WM_SYSCHAR") },
  207.     { WM_SYSDEADCHAR,_T("WM_SYSDEADCHAR") },
  208. #if(WINVER >= 0x0400)
  209.     { WM_IME_STARTCOMPOSITION,_T("WM_IME_STARTCOMPOSITION") },
  210.     { WM_IME_ENDCOMPOSITION,_T("WM_IME_ENDCOMPOSITION") },
  211.     { WM_IME_COMPOSITION,_T("WM_IME_COMPOSITION") },
  212.     { WM_IME_KEYLAST,_T("WM_IME_KEYLAST") },
  213. #endif
  214.     { WM_INITDIALOG,_T("WM_INITDIALOG") },
  215.     { WM_COMMAND,_T("WM_COMMAND") },
  216.     { WM_SYSCOMMAND,_T("WM_SYSCOMMAND") },
  217.     { WM_TIMER,_T("WM_TIMER") },
  218.     { WM_HSCROLL,_T("WM_HSCROLL") },
  219.     { WM_VSCROLL,_T("WM_VSCROLL") },
  220.     { WM_INITMENU,_T("WM_INITMENU") },
  221.     { WM_INITMENUPOPUP,_T("WM_INITMENUPOPUP") },
  222.     { WM_MENUSELECT,_T("WM_MENUSELECT") },
  223.     { WM_MENUCHAR,_T("WM_MENUCHAR") },
  224.     { WM_ENTERIDLE,_T("WM_ENTERIDLE") },
  225.     { WM_CTLCOLORMSGBOX,_T("WM_CTLCOLORMSGBOX") },
  226.     { WM_CTLCOLOREDIT,_T("WM_CTLCOLOREDIT") },
  227.     { WM_CTLCOLORLISTBOX,_T("WM_CTLCOLORLISTBOX") },
  228.     { WM_CTLCOLORBTN,_T("WM_CTLCOLORBTN") },
  229.     { WM_CTLCOLORDLG,_T("WM_CTLCOLORDLG") },
  230.     { WM_CTLCOLORSCROLLBAR,_T("WM_CTLCOLORSCROLLBAR") },
  231.     { WM_CTLCOLORSTATIC,_T("WM_CTLCOLORSTATIC") },
  232.     { WM_MOUSEMOVE,_T("WM_MOUSEMOVE") },
  233.     { WM_LBUTTONDOWN,_T("WM_LBUTTONDOWN") },
  234.     { WM_LBUTTONUP,_T("WM_LBUTTONUP") },
  235.     { WM_LBUTTONDBLCLK,_T("WM_LBUTTONDBLCLK") },
  236.     { WM_RBUTTONDOWN,_T("WM_RBUTTONDOWN") },
  237.     { WM_RBUTTONUP,_T("WM_RBUTTONUP") },
  238.     { WM_RBUTTONDBLCLK,_T("WM_RBUTTONDBLCLK") },
  239.     { WM_MBUTTONDOWN,_T("WM_MBUTTONDOWN") },
  240.     { WM_MBUTTONUP,_T("WM_MBUTTONUP") },
  241.     { WM_MBUTTONDBLCLK,_T("WM_MBUTTONDBLCLK") },
  242.     { WM_MOUSEMOVE,_T("WM_MOUSEMOVE") },
  243.     { WM_LBUTTONDOWN,_T("WM_LBUTTONDOWN") },
  244.     { WM_LBUTTONUP,_T("WM_LBUTTONUP") },
  245.     { WM_LBUTTONDBLCLK,_T("WM_LBUTTONDBLCLK") },
  246.     { WM_RBUTTONDOWN,_T("WM_RBUTTONDOWN") },
  247.     { WM_RBUTTONUP,_T("WM_RBUTTONUP") },
  248.     { WM_RBUTTONDBLCLK,_T("WM_RBUTTONDBLCLK") },
  249.     { WM_MBUTTONDOWN,_T("WM_MBUTTONDOWN") },
  250.     { WM_MBUTTONUP,_T("WM_MBUTTONUP") },
  251.     { WM_MBUTTONDBLCLK,_T("WM_MBUTTONDBLCLK") },
  252.     { WM_PARENTNOTIFY,_T("WM_PARENTNOTIFY") },
  253.     { WM_ENTERMENULOOP,_T("WM_ENTERMENULOOP") },
  254.     { WM_EXITMENULOOP,_T("WM_EXITMENULOOP") },
  255. #if(WINVER >= 0x0400)
  256.     { WM_NEXTMENU,_T("WM_NEXTMENU") },
  257.     { WM_SIZING,_T("WM_SIZING") },
  258.     { WM_CAPTURECHANGED,_T("WM_CAPTURECHANGED") },
  259.     { WM_MOVING,_T("WM_MOVING") },
  260.     { WM_POWERBROADCAST,_T("WM_POWERBROADCAST") },
  261.     { WM_DEVICECHANGE,_T("WM_DEVICECHANGE") },
  262.     { WM_IME_SETCONTEXT,_T("WM_IME_SETCONTEXT") },
  263.     { WM_IME_NOTIFY,_T("WM_IME_NOTIFY") },
  264.     { WM_IME_CONTROL,_T("WM_IME_CONTROL") },
  265.     { WM_IME_COMPOSITIONFULL,_T("WM_IME_COMPOSITIONFULL") },
  266.     { WM_IME_SELECT,_T("WM_IME_SELECT") },
  267.     { WM_IME_CHAR,_T("WM_IME_CHAR") },
  268.     { WM_IME_KEYDOWN,_T("WM_IME_KEYDOWN") },
  269.     { WM_IME_KEYUP,_T("WM_IME_KEYUP") },
  270. #endif
  271.     { WM_MDICREATE,_T("WM_MDICREATE") },
  272.     { WM_MDIDESTROY,_T("WM_MDIDESTROY") },
  273.     { WM_MDIACTIVATE,_T("WM_MDIACTIVATE") },
  274.     { WM_MDIRESTORE,_T("WM_MDIRESTORE") },
  275.     { WM_MDINEXT,_T("WM_MDINEXT") },
  276.     { WM_MDIMAXIMIZE,_T("WM_MDIMAXIMIZE") },
  277.     { WM_MDITILE,_T("WM_MDITILE") },
  278.     { WM_MDICASCADE,_T("WM_MDICASCADE") },
  279.     { WM_MDIICONARRANGE,_T("WM_MDIICONARRANGE") },
  280.     { WM_MDIGETACTIVE,_T("WM_MDIGETACTIVE") },
  281.     { WM_MDISETMENU,_T("WM_MDISETMENU") },
  282.     { WM_ENTERSIZEMOVE,_T("WM_ENTERSIZEMOVE") },
  283.     { WM_EXITSIZEMOVE,_T("WM_EXITSIZEMOVE") },
  284.     { WM_DROPFILES,_T("WM_DROPFILES") },
  285.     { WM_MDIREFRESHMENU,_T("WM_MDIREFRESHMENU") },
  286.     { WM_CUT,_T("WM_CUT") },
  287.     { WM_COPY,_T("WM_COPY") },
  288.     { WM_PASTE,_T("WM_PASTE") },
  289.     { WM_CLEAR,_T("WM_CLEAR") },
  290.     { WM_UNDO,_T("WM_UNDO") },
  291.     { WM_RENDERFORMAT,_T("WM_RENDERFORMAT") },
  292.     { WM_RENDERALLFORMATS,_T("WM_RENDERALLFORMATS") },
  293.     { WM_DESTROYCLIPBOARD,_T("WM_DESTROYCLIPBOARD") },
  294.     { WM_DRAWCLIPBOARD,_T("WM_DRAWCLIPBOARD") },
  295.     { WM_PAINTCLIPBOARD,_T("WM_PAINTCLIPBOARD") },
  296.     { WM_VSCROLLCLIPBOARD,_T("WM_VSCROLLCLIPBOARD") },
  297.     { WM_SIZECLIPBOARD,_T("WM_SIZECLIPBOARD") },
  298.     { WM_ASKCBFORMATNAME,_T("WM_ASKCBFORMATNAME") },
  299.     { WM_CHANGECBCHAIN,_T("WM_CHANGECBCHAIN") },
  300.     { WM_HSCROLLCLIPBOARD,_T("WM_HSCROLLCLIPBOARD") },
  301.     { WM_QUERYNEWPALETTE,_T("WM_QUERYNEWPALETTE") },
  302.     { WM_PALETTEISCHANGING,_T("WM_PALETTEISCHANGING") },
  303.     { WM_PALETTECHANGED,_T("WM_PALETTECHANGED") },
  304.     { WM_HOTKEY,_T("WM_HOTKEY") },
  305. #if(WINVER >= 0x0400)
  306.     { WM_PRINT,_T("WM_PRINT") },
  307.     { WM_PRINTCLIENT,_T("WM_PRINTCLIENT") },
  308. #endif
  309.     // Below are MFC messages
  310.     { WM_QUERYAFXWNDPROC,_T("*WM_QUERYAFXWNDPROC") },
  311.     { WM_SIZEPARENT,_T("*WM_SIZEPARENT") },
  312.     { WM_SETMESSAGESTRING,_T("*WM_SETMESSAGESTRING") },
  313.     { WM_IDLEUPDATECMDUI,_T("*WM_IDLEUPDATECMDUI") },
  314.     { WM_INITIALUPDATE,_T("*WM_INITIALUPDATE") },
  315.     { WM_COMMANDHELP,_T("*WM_COMMANDHELP") },
  316.     { WM_HELPHITTEST,_T("*WM_HELPHITTEST") },
  317.     { WM_EXITHELPMODE,_T("*WM_EXITHELPMODE") },
  318.     { WM_RECALCPARENT,_T("*WM_RECALCPARENT") },
  319.     { WM_SIZECHILD,_T("*WM_SIZECHILD") },
  320.     { WM_KICKIDLE,_T("*WM_KICKIDLE") },
  321.     { WM_QUERYCENTERWND,_T("*WM_QUERYCENTERWND") },
  322.     { WM_DISABLEMODAL,_T("*WM_DISABLEMODAL") },
  323.     { WM_FLOATSTATUS,_T("*WM_FLOATSTATUS") },
  324.     { WM_ACTIVATETOPLEVEL,_T("*WM_ACTIVATETOPLEVEL") },
  325.     { WM_QUERY3DCONTROLS,_T("*WM_QUERY3DCONTROLS") },
  326.     { WM_SOCKET_NOTIFY,_T("*WM_SOCKET_NOTIFY") },
  327.     { WM_SOCKET_DEAD,_T("*WM_SOCKET_DEAD") },
  328.     { WM_POPMESSAGESTRING,_T("*WM_POPMESSAGESTRING") },
  329.     { WM_OCC_LOADFROMSTREAM,_T("*WM_OCC_LOADFROMSTREAM") },
  330.     { WM_OCC_LOADFROMSTORAGE,_T("*WM_OCC_LOADFROMSTORAGE") },
  331.     { WM_OCC_INITNEW,_T("*WM_OCC_INITNEW") },
  332.     { WM_QUEUE_SENTINEL,_T("*WM_QUEUE_SENTINEL") },
  333.     { 0,NULL }
  334. };
  335.  
  336. ////////////////
  337. // This class is basically just an array of 1024 strings,
  338. // the names of each WM_ message. Constructor initializes it.
  339. //
  340. class CWndMsgMap {
  341.     static LPCTSTR Names[];                // array of WM_ message names
  342. public:
  343.     CWndMsgMap();                            // constructor initializes them
  344.     CString GetMsgName(UINT msg);        // get name of message
  345. };
  346. LPCTSTR CWndMsgMap::Names[WM_USER];    // name of each WM_ message
  347.  
  348. //////////////////
  349. // Initialize array from sparse data
  350. //
  351. CWndMsgMap::CWndMsgMap()
  352. {
  353.     // copy sparse MsgData into table
  354.     memset(Names, 0, sizeof(Names));
  355.     for (int i=0; MsgData[i].msg; i++)        
  356.         Names[MsgData[i].msg] = MsgData[i].name;
  357. }
  358.  
  359. ////////////////
  360. // Get the name of a WM_ message
  361. //
  362. CString CWndMsgMap::GetMsgName(UINT msg)
  363. {
  364.     CString name;
  365.     if (msg>=WM_USER)
  366.         name.Format(_T("WM_USER+%d"), msg-WM_USER);
  367.     else if (Names[msg])
  368.         name = Names[msg];
  369.     else
  370.         name.Format(_T("0x%04x"), msg);
  371.     return name;
  372. }
  373.  
  374. //////////////////
  375. // Get name of WM_ message.
  376. //
  377. CString sDbgName(UINT uMsg)
  378. {
  379.     static CWndMsgMap wndMsgMap; // instantiate 1st time called
  380.     return wndMsgMap.GetMsgName(uMsg);
  381. }
  382.  
  383. // #ifdef REFIID
  384. #ifdef NOT_DEFINED            // **** Commented this section out ****
  385.  
  386. // Most apps don't need to use DbgName(REFIID)
  387. // Apps that do can set this static global to a table of
  388. // DBGINTERFACENAME's it wants to TRACE with DbgName(REFIID)
  389. //
  390. DBGINTERFACENAME* _pDbgInterfaceNames = NULL;
  391.  
  392. //////////////////
  393. // Get OLE interface name.
  394. //
  395. CString sDbgName(REFIID iid)
  396. {
  397.     if (_pDbgInterfaceNames) {
  398.         for (int i=0; _pDbgInterfaceNames[i].name; i++) {
  399.             if (memcmp(_pDbgInterfaceNames[i].piid, &iid, sizeof(IID))==0)
  400.                 return _pDbgInterfaceNames[i].name;
  401.         }
  402.     }
  403.     static CString s;
  404.     s.Format(_T("{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}"),
  405.         iid.Data1, iid.Data2, iid.Data3,
  406.         iid.Data4[0], iid.Data4[1], iid.Data4[2], iid.Data4[3],
  407.         iid.Data4[4], iid.Data4[5], iid.Data4[6], iid.Data4[7]);
  408.     return s;
  409. }
  410.  
  411. #endif // REFIID
  412.  
  413. #endif // DEBUG
  414.  
  415.