home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / BC_502 / BOCOLE.PAK / OLEDEBUG.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-06  |  41.3 KB  |  1,488 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectComponents
  3. // Copyright (c) 1991, 1996 by Borland International, All Rights Reserved
  4. //
  5. // $Revision:   2.2  $
  6. //
  7. // OleDebug.cpp -- Some debugging utilities for getting symbolic output
  8. //                 from the OLE2 error codes and enums
  9. //----------------------------------------------------------------------------
  10. #include <BOle.h>
  11. #include <Olestd.h>
  12. #include <OleDebug.h>
  13.  
  14. #include <stdarg.h>
  15. #include <stdlib.h>
  16. #include <stdio.h>
  17.  
  18. OLEDBGDATA;
  19.  
  20. #undef OleDbgOutHResult(lpsz, hr)
  21. #define OleDbgOutHResult(lpsz,hr)   \
  22.         OleDbgPrintScodeAlways(g_szDbgPrefix,lpsz,GetScode(hr))
  23.  
  24. #define BUFFERSIZE 200
  25. STDAPI_(void) OleDbgPrintScodeAlways(LPSTR lpszPrefix, LPSTR lpszMsg, SCODE sc);
  26.  
  27.  
  28. #ifdef OLEDBG
  29.  
  30. static WORD level = 0;
  31.  
  32. char * cDebug::prepareBuf (char * pB)
  33. {
  34.     for (int i=0;i<level;i++) {
  35.         *pB++ = '-';
  36.         *pB++ = '-';
  37.     }
  38.     return pB;
  39. }
  40.  
  41. void cDebug::DebugEnter(char * dc, char * df, LPOLESTR s)
  42. {
  43.     if (DebugMode) {
  44.         char buf [BUFFERSIZE];
  45.         if (s)
  46.             wsprintf (prepareBuf(buf),"Enter %s::%s of object %s\n\r", dc, df, s);
  47.         else
  48.             wsprintf (prepareBuf(buf),"Enter %s::%s\n\r", dc, df);
  49.         OleDbgOut (buf);
  50.     }
  51.     level++;
  52. }
  53.  
  54. SCODE cDebug::DebugReturn(char * dc, char * df, SCODE sc)
  55. {
  56.     if (level)
  57.         level--;
  58.     if (DebugMode) {
  59.         char buf [BUFFERSIZE];
  60.         wsprintf (prepareBuf(buf),"Leave %s::%s with ", dc, df);
  61.         OleDbgOutScode (buf, sc);
  62.     }
  63.     return sc;
  64. }
  65.  
  66. HRESULT cDebug::DebugReturn(char * dc, char * df, HRESULT hrErr)
  67. {
  68.     if (level)
  69.         level--;
  70.     if (DebugMode) {
  71.         char buf [BUFFERSIZE];
  72.         wsprintf (prepareBuf(buf),"Leave %s::%s with ", dc, df);
  73.         OleDbgOutHResult (buf, hrErr);
  74.     }
  75.     return hrErr;
  76. }
  77.  
  78. BOOL cDebug::DebugReturn(char * dc, char * df, BOOL f)
  79. {
  80.     if (level)
  81.         level--;
  82.     if (DebugMode) {
  83.         char buf [BUFFERSIZE];
  84.         wsprintf (prepareBuf(buf),"Leave %s::%s with %s", dc, df, f ? "TRUE" : "FALSE");
  85.         OleDbgOut (buf);
  86.     }
  87.     return f;
  88. }
  89.  
  90. void cDebug::DebugReturn(char * dc, char * df, REFIID iid, void * P)
  91. {
  92.     if (level)
  93.         level--;
  94.     if (DebugMode) {
  95.         char buf [BUFFERSIZE];
  96.         wsprintf (prepareBuf(buf),"Leave %s::%s with pointer %08lX", dc, df, P);
  97.         OleDbgOut (buf);
  98.     }
  99. }
  100.  
  101. ULONG cDebug::DebugReturn (char * dc, char * df, LPOLESTR s, ULONG r)
  102. {
  103.     if (level)
  104.         level--;
  105.     if (DebugMode) {
  106.         char buf [BUFFERSIZE];
  107.         wsprintf (prepareBuf(buf),"Refcount in %s::%s for object %s - %ld\n\r", dc, df, s, r);
  108.         OleDbgOut (buf);
  109.     }
  110.     return r;
  111. }
  112.  
  113. void cDebug::DebugExit (char * dc, char * df)
  114. {
  115.     if (level)
  116.         level--;
  117.     if (DebugMode) {
  118.         char buf [BUFFERSIZE];
  119.         wsprintf (prepareBuf(buf),"Exit %s:%s\n\r", dc, df);
  120.         OleDbgOut (buf);
  121.     }
  122. }
  123.  
  124. HRESULT cDebug::DebugHResult (LPOLESTR s, HRESULT hrErr)
  125. {
  126.     if (DebugMode) {
  127.         char buf [BUFFERSIZE];
  128.         wsprintf (prepareBuf(buf),"%s ", s);
  129.         OleDbgOutHResult (buf, hrErr);
  130.     }
  131.     return hrErr;
  132. }
  133.  
  134. ULONG cDebug::DebugRefCnt (LPOLESTR s, ULONG r)
  135. {
  136.     if (DebugMode) {
  137.         char buf [BUFFERSIZE];
  138.         wsprintf (prepareBuf(buf),"Refcount for object %s - %ld\n\r", s, r);
  139.         OleDbgOut (buf);
  140.     }
  141.     return r;
  142. }
  143.  
  144. void cdecl cDebug::DebugPrintf (LPOLESTR s, ...)
  145. {
  146.     va_list paramList;
  147.     va_start (paramList, s);
  148.     if (DebugMode) {
  149.         char buf1 [BUFFERSIZE];
  150.         vsprintf (buf1, s, paramList);
  151.         char buf [BUFFERSIZE];
  152.         wsprintf (prepareBuf(buf), "%s\n\r", buf1);
  153.         OleDbgOut (buf);
  154.     }
  155.     va_end (paramList);
  156. }
  157.  
  158. void cDebug::DebugPrint (LPOLESTR pS, const RECT FAR * pR)
  159. {
  160.     if (DebugMode) {
  161.         char buf [BUFFERSIZE];
  162.         if (pR) {
  163.             if (pS)
  164.                 wsprintf (prepareBuf(buf), "%s %04X %04X %04X %04X\n\r", pS, pR->left, pR->top, pR->right, pR->bottom);
  165.             else
  166.                 wsprintf (prepareBuf(buf), "%04X %04X %04X %04X\n\r", pR->left, pR->top, pR->right, pR->bottom);
  167.         }
  168.         else {
  169.             if (pS)
  170.                 wsprintf (prepareBuf(buf), "%s\n\r", pS);
  171.             else
  172.                 wsprintf (prepareBuf(buf), "\n\r");
  173.         }
  174.         OleDbgOut (buf);
  175.     }
  176. }
  177.  
  178. void cDebug::DebugPrint (LPOLESTR pS, const SIZEL FAR * pL)
  179. {
  180.     if (DebugMode) {
  181.         char buf [BUFFERSIZE];
  182.         if (pS)
  183.             wsprintf (prepareBuf(buf), "%s %08lX %08lX\n\r", pS, pL->cx, pL->cy);
  184.         else
  185.             wsprintf (prepareBuf(buf), "%08lX %08lX\n\r", pL->cx, pL->cy);
  186.         OleDbgOut (buf);
  187.     }
  188. }
  189.  
  190. void cDebug::DebugPrint (LPOLESTR pS, BOOL f)
  191. {
  192.     if (DebugMode) {
  193.         char buf [BUFFERSIZE];
  194.         if (pS)
  195.             wsprintf (prepareBuf(buf), "%s %s\n\r", pS, f ? "TRUE" : "FALSE");
  196.         else
  197.             wsprintf (prepareBuf(buf), "%s\n\r", f ? "TRUE" : "FALSE");
  198.         OleDbgOut (buf);
  199.     }
  200. }
  201.  
  202. void cDebug::DebugPrint (REFIID riid)
  203. {
  204. #if 0
  205.     if (DebugMode) {
  206.         char buf [BUFFERSIZE];
  207.         char * P = prepareBuf (buf);
  208.         LPOLESTR * ppC = 0;
  209.         if (StringFromIID(riid, ppC) == NOERROR)
  210.             strcpy (P, *ppC);
  211.         else if (StringFromCLSID(riid, ppC) != NOERROR) 
  212.             strcpy (P, *ppC);
  213.         else 
  214.             wsprintf (P, "IID not recog 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,    riid.Data3);
  215.         OleDbgOut (buf);
  216.     }
  217. #else
  218.     if (DebugMode) {
  219.         char buf [BUFFERSIZE];
  220.      if (riid == IID_IUnknown)
  221.      {
  222.             wsprintf (prepareBuf(buf), "IID = IID_IUnknown 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  223.                              riid.Data3);
  224.             goto ll_return;
  225.      }
  226.      if (riid == IID_IClassFactory)
  227.      {
  228.             wsprintf (prepareBuf(buf), "IID = IID_IClassFactory 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  229.                              riid.Data3);
  230.             goto ll_return;
  231.      }
  232.      if (riid == IID_IMalloc)
  233.      {
  234.             wsprintf (prepareBuf(buf), "IID = IID_IMalloc 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  235.                              riid.Data3);
  236.             goto ll_return;
  237.      }
  238.      if (riid == IID_IMarshal)
  239.      {
  240.             wsprintf (prepareBuf(buf), "IID = IID_IMarshal 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  241.                              riid.Data3);
  242.             goto ll_return;
  243.      }
  244.      if (riid == IID_IRpcChannel)
  245.      {
  246.             wsprintf (prepareBuf(buf), "IID = IID_IRpcChannel 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  247.                              riid.Data3);
  248.             goto ll_return;
  249.      }
  250.      if (riid == IID_IRpcStub)
  251.      {
  252.             wsprintf (prepareBuf(buf), "IID = IID_IRpcStub 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  253.                              riid.Data3);
  254.             goto ll_return;
  255.      }
  256.      if (riid == IID_IStubManager)
  257.      {
  258.             wsprintf (prepareBuf(buf), "IID = IID_IStubManager 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  259.                              riid.Data3);
  260.             goto ll_return;
  261.      }
  262.      if (riid == IID_IRpcProxy)
  263.      {
  264.             wsprintf (prepareBuf(buf), "IID = IID_IRpcProxy 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  265.                              riid.Data3);
  266.             goto ll_return;
  267.      }
  268.      if (riid == IID_IProxyManager)
  269.      {
  270.             wsprintf (prepareBuf(buf), "IID = IID_IProxyManager 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  271.                              riid.Data3);
  272.             goto ll_return;
  273.      }
  274.      if (riid == IID_IPSFactory)
  275.      {
  276.             wsprintf (prepareBuf(buf), "IID = IID_IPSFactory 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  277.                              riid.Data3);
  278.             goto ll_return;
  279.      }
  280.      if (riid == IID_ILockBytes)
  281.      {
  282.             wsprintf (prepareBuf(buf), "IID = IID_ILockBytes 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  283.                              riid.Data3);
  284.             goto ll_return;
  285.      }
  286.      if (riid == IID_IStorage)
  287.      {
  288.             wsprintf (prepareBuf(buf), "IID = IID_IStorage 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  289.                              riid.Data3);
  290.             goto ll_return;
  291.      }
  292.      if (riid == IID_IStream)
  293.      {
  294.             wsprintf (prepareBuf(buf), "IID = IID_IStream 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  295.                              riid.Data3);
  296.             goto ll_return;
  297.      }
  298.      if (riid == IID_IEnumSTATSTG)
  299.      {
  300.             wsprintf (prepareBuf(buf), "IID = IID_IEnumSTATSTG 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  301.                              riid.Data3);
  302.             goto ll_return;
  303.      }
  304.      if (riid == IID_IBindCtx)
  305.      {
  306.             wsprintf (prepareBuf(buf), "IID = IID_IBindCtx 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  307.                              riid.Data3);
  308.             goto ll_return;
  309.      }
  310.      if (riid == IID_IMoniker)
  311.      {
  312.             wsprintf (prepareBuf(buf), "IID = IID_IMoniker 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  313.                              riid.Data3);
  314.             goto ll_return;
  315.      }
  316.      if (riid == IID_IRunningObjectTable)
  317.      {
  318.             wsprintf (prepareBuf(buf), "IID = IID_IRunningObjectTable 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  319.                              riid.Data3);
  320.             goto ll_return;
  321.      }
  322.      if (riid == IID_IInternalMoniker)
  323.      {
  324.             wsprintf (prepareBuf(buf), "IID = IID_IInternalMoniker 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  325.                              riid.Data3);
  326.             goto ll_return;
  327.      }
  328.      if (riid == IID_IRootStorage)
  329.      {
  330.             wsprintf (prepareBuf(buf), "IID = IID_IRootStorage 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  331.                              riid.Data3);
  332.             goto ll_return;
  333.      }
  334.      if (riid == IID_IDfReserved1)
  335.      {
  336.             wsprintf (prepareBuf(buf), "IID = IID_IDfReserved1 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  337.                              riid.Data3);
  338.             goto ll_return;
  339.      }
  340.      if (riid == IID_IDfReserved2)
  341.      {
  342.             wsprintf (prepareBuf(buf), "IID = IID_IDfReserved2 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  343.                              riid.Data3);
  344.             goto ll_return;
  345.      }
  346.      if (riid == IID_IDfReserved3)
  347.      {
  348.             wsprintf (prepareBuf(buf), "IID = IID_IDfReserved3 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  349.                              riid.Data3);
  350.             goto ll_return;
  351.      }
  352.      if (riid == IID_IMessageFilter)
  353.      {
  354.             wsprintf (prepareBuf(buf), "IID = IID_IMessageFilter 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  355.                              riid.Data3);
  356.             goto ll_return;
  357.      }
  358. #ifdef    INCLUDE_IDISPATCH
  359.      if (riid == IID_IDispatch)
  360.      {
  361.             wsprintf (prepareBuf(buf), "IID = IID_IDispatch 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  362.                              riid.Data3);
  363.             goto ll_return;
  364.      }
  365.      if (riid == IID_ITypeInfo)
  366.      {
  367.             wsprintf (prepareBuf(buf), "IID = IID_ITypeInfo 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  368.                              riid.Data3);
  369.             goto ll_return;
  370.      }
  371.      if (riid == IID_ITypeLib)
  372.      {
  373.             wsprintf (prepareBuf(buf), "IID = IID_ITypeLib 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  374.                              riid.Data3);
  375.             goto ll_return;
  376.      }
  377.      if (riid == IID_ITypeComp)
  378.      {
  379.             wsprintf (prepareBuf(buf), "IID = IID_ITypeComp 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  380.                              riid.Data3);
  381.             goto ll_return;
  382.      }
  383.      if (riid == IID_IEnumVARIANT)
  384.      {
  385.             wsprintf (prepareBuf(buf), "IID = IID_IEnumVARIANT 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  386.                              riid.Data3);
  387.             goto ll_return;
  388.      }
  389. #endif    // INCLUDE_IDISPATCH
  390.      if (riid == IID_IEnumUnknown)
  391.      {
  392.             wsprintf (prepareBuf(buf), "IID = IID_IEnumUnknown 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  393.                              riid.Data3);
  394.             goto ll_return;
  395.      }
  396.      if (riid == IID_IEnumString)
  397.      {
  398.             wsprintf (prepareBuf(buf), "IID = IID_IEnumString 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  399.                              riid.Data3);
  400.             goto ll_return;
  401.      }
  402.      if (riid == IID_IEnumMoniker)
  403.      {
  404.             wsprintf (prepareBuf(buf), "IID = IID_IEnumMoniker 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  405.                              riid.Data3);
  406.             goto ll_return;
  407.      }
  408.      if (riid == IID_IEnumFORMATETC)
  409.      {
  410.             wsprintf (prepareBuf(buf), "IID = IID_IEnumFORMATETC 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  411.                              riid.Data3);
  412.             goto ll_return;
  413.      }
  414.      if (riid == IID_IEnumOLEVERB)
  415.      {
  416.             wsprintf (prepareBuf(buf), "IID = IID_IEnumOLEVERB 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  417.                              riid.Data3);
  418.             goto ll_return;
  419.      }
  420.      if (riid == IID_IEnumSTATDATA)
  421.      {
  422.             wsprintf (prepareBuf(buf), "IID = IID_IEnumSTATDATA 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  423.                              riid.Data3);
  424.             goto ll_return;
  425.      }
  426.      if (riid == IID_IEnumGeneric)
  427.      {
  428.             wsprintf (prepareBuf(buf), "IID = IID_IEnumGeneric 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  429.                              riid.Data3);
  430.             goto ll_return;
  431.      }
  432.      if (riid == IID_IEnumHolder)
  433.      {
  434.             wsprintf (prepareBuf(buf), "IID = IID_IEnumHolder 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  435.                              riid.Data3);
  436.             goto ll_return;
  437.      }
  438.      if (riid == IID_IEnumCallback)
  439.      {
  440.             wsprintf (prepareBuf(buf), "IID = IID_IEnumCallback 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  441.                              riid.Data3);
  442.             goto ll_return;
  443.      }
  444.      if (riid == IID_IPersistStream)
  445.      {
  446.             wsprintf (prepareBuf(buf), "IID = IID_IPersistStream 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  447.                              riid.Data3);
  448.             goto ll_return;
  449.      }
  450.      if (riid == IID_IPersistStorage)
  451.      {
  452.             wsprintf (prepareBuf(buf), "IID = IID_IPersistStorage 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  453.                              riid.Data3);
  454.             goto ll_return;
  455.      }
  456.      if (riid == IID_IPersistFile)
  457.      {
  458.             wsprintf (prepareBuf(buf), "IID = IID_IPersistFile 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  459.                              riid.Data3);
  460.             goto ll_return;
  461.      }
  462.      if (riid == IID_IPersist)
  463.      {
  464.             wsprintf (prepareBuf(buf), "IID = IID_IPersist 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  465.                              riid.Data3);
  466.             goto ll_return;
  467.      }
  468.      if (riid == IID_IViewObject)
  469.      {
  470.             wsprintf (prepareBuf(buf), "IID = IID_IViewObject 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  471.                              riid.Data3);
  472.             goto ll_return;
  473.      }
  474.      if (riid == IID_IDataObject)
  475.      {
  476.             wsprintf (prepareBuf(buf), "IID = IID_IDataObject 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  477.                              riid.Data3);
  478.             goto ll_return;
  479.      }
  480.      if (riid == IID_IAdviseSink)
  481.      {
  482.             wsprintf (prepareBuf(buf), "IID = IID_IAdviseSink 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  483.                              riid.Data3);
  484.             goto ll_return;
  485.      }
  486.      if (riid == IID_IDataAdviseHolder)
  487.      {
  488.             wsprintf (prepareBuf(buf), "IID = IID_IDataAdviseHolder 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  489.                              riid.Data3);
  490.             goto ll_return;
  491.      }
  492.      if (riid == IID_IOleAdviseHolder)
  493.      {
  494.             wsprintf (prepareBuf(buf), "IID = IID_IOleAdviseHolder 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  495.                              riid.Data3);
  496.             goto ll_return;
  497.      }
  498.      if (riid == IID_IOleObject)
  499.      {
  500.             wsprintf (prepareBuf(buf), "IID = IID_IOleObject 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  501.                              riid.Data3);
  502.             goto ll_return;
  503.      }
  504.      if (riid == IID_IOleInPlaceObject)
  505.      {
  506.             wsprintf (prepareBuf(buf), "IID = IID_IOleInPlaceObject 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  507.                              riid.Data3);
  508.             goto ll_return;
  509.      }
  510.      if (riid == IID_IOleWindow)
  511.      {
  512.             wsprintf (prepareBuf(buf), "IID = IID_IOleWindow 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  513.                              riid.Data3);
  514.             goto ll_return;
  515.      }
  516.      if (riid == IID_IOleInPlaceUIWindow)
  517.      {
  518.             wsprintf (prepareBuf(buf), "IID = IID_IOleInPlaceUIWindow 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  519.                              riid.Data3);
  520.             goto ll_return;
  521.      }
  522.      if (riid == IID_IOleInPlaceFrame)
  523.      {
  524.             wsprintf (prepareBuf(buf), "IID = IID_IOleInPlaceFrame 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  525.                              riid.Data3);
  526.             goto ll_return;
  527.      }
  528.      if (riid == IID_IOleInPlaceActiveObject)
  529.      {
  530.             wsprintf (prepareBuf(buf), "IID = IID_IOleInPlaceActiveObject 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  531.                              riid.Data3);
  532.             goto ll_return;
  533.      }
  534.      if (riid == IID_IOleClientSite)
  535.      {
  536.             wsprintf (prepareBuf(buf), "IID = IID_IOleClientSite 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  537.                              riid.Data3);
  538.             goto ll_return;
  539.      }
  540.      if (riid == IID_IOleInPlaceSite)
  541.      {
  542.             wsprintf (prepareBuf(buf), "IID = IID_IOleInPlaceSite 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  543.                              riid.Data3);
  544.             goto ll_return;
  545.      }
  546.      if (riid == IID_IParseDisplayName)
  547.      {
  548.             wsprintf (prepareBuf(buf), "IID = IID_IParseDisplayName 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  549.                              riid.Data3);
  550.             goto ll_return;
  551.      }
  552.      if (riid == IID_IOleContainer)
  553.      {
  554.             wsprintf (prepareBuf(buf), "IID = IID_IOleContainer 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  555.                              riid.Data3);
  556.             goto ll_return;
  557.      }
  558.      if (riid == IID_IOleItemContainer)
  559.      {
  560.             wsprintf (prepareBuf(buf), "IID = IID_IOleItemContainer 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  561.                              riid.Data3);
  562.             goto ll_return;
  563.      }
  564.      if (riid == IID_IOleLink)
  565.      {
  566.             wsprintf (prepareBuf(buf), "IID = IID_IOleLink 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  567.                              riid.Data3);
  568.             goto ll_return;
  569.      }
  570.      if (riid == IID_IOleCache)
  571.      {
  572.             wsprintf (prepareBuf(buf), "IID = IID_IOleCache 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  573.                              riid.Data3);
  574.             goto ll_return;
  575.      }
  576.      if (riid == IID_IOleManager)
  577.      {
  578.             wsprintf (prepareBuf(buf), "IID = IID_IOleManager 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  579.                              riid.Data3);
  580.             goto ll_return;
  581.      }
  582.      if (riid == IID_IOlePresObj)
  583.      {
  584.             wsprintf (prepareBuf(buf), "IID = IID_IOlePresObj 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  585.                              riid.Data3);
  586.             goto ll_return;
  587.      }
  588.      if (riid == IID_IDropSource)
  589.      {
  590.             wsprintf (prepareBuf(buf), "IID = IID_IDropSource 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  591.                              riid.Data3);
  592.             goto ll_return;
  593.      }
  594.      if (riid == IID_IDropTarget)
  595.      {
  596.             wsprintf (prepareBuf(buf), "IID = IID_IDropTarget 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  597.                              riid.Data3);
  598.             goto ll_return;
  599.      }
  600.      if (riid == IID_IDebug)
  601.      {
  602.             wsprintf (prepareBuf(buf), "IID = IID_IDebug 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  603.                              riid.Data3);
  604.             goto ll_return;
  605.      }
  606.      if (riid == IID_IDebugStream)
  607.      {
  608.             wsprintf (prepareBuf(buf), "IID = IID_IDebugStream 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  609.                              riid.Data3);
  610.             goto ll_return;
  611.      }
  612.      
  613.      wsprintf (prepareBuf(buf), "     IID not recog 0x%lx.%x.%x\n\r", riid.Data1, riid.Data2,
  614.                         riid.Data3);
  615.  
  616. ll_return:
  617.         OleDbgOut (buf);
  618.     }
  619. #endif
  620. }
  621.  
  622. #define CASE_SCODE(sc)  \
  623.         case sc: \
  624.             lstrcpy((LPSTR)szErrName, (LPSTR)#sc); \
  625.             break;
  626.  
  627. STDAPI_(void) OleDbgPrintScodeAlways(LPSTR lpszPrefix, LPSTR lpszMsg, SCODE sc)
  628. {
  629.     char szBuf[256];
  630.     char szErrName[40];
  631.  
  632.     switch (sc) {
  633.  
  634.         /* SCODE's defined in SCODE.H */
  635.  
  636.         CASE_SCODE(S_OK)
  637.         CASE_SCODE(S_FALSE)
  638.         CASE_SCODE(E_UNEXPECTED)
  639.         CASE_SCODE(E_OUTOFMEMORY)
  640.         CASE_SCODE(E_INVALIDARG)
  641.         CASE_SCODE(E_NOINTERFACE)
  642.         CASE_SCODE(E_POINTER)
  643.         CASE_SCODE(E_HANDLE)
  644.         CASE_SCODE(E_ABORT)
  645.         CASE_SCODE(E_FAIL)
  646.         CASE_SCODE(E_ACCESSDENIED)
  647.  
  648.         /* SCODE's defined in OLE2.H */
  649.  
  650.         CASE_SCODE(OLE_E_OLEVERB)
  651.         CASE_SCODE(OLE_E_ADVF)
  652.         CASE_SCODE(OLE_E_ENUM_NOMORE)
  653.         CASE_SCODE(OLE_E_ADVISENOTSUPPORTED)
  654.         CASE_SCODE(OLE_E_NOCONNECTION)
  655.         CASE_SCODE(OLE_E_NOTRUNNING)
  656.         CASE_SCODE(OLE_E_NOCACHE)
  657.         CASE_SCODE(OLE_E_BLANK)
  658.         CASE_SCODE(OLE_E_CLASSDIFF)
  659.         CASE_SCODE(OLE_E_CANT_GETMONIKER)
  660.         CASE_SCODE(OLE_E_CANT_BINDTOSOURCE)
  661.         CASE_SCODE(OLE_E_STATIC)
  662.         CASE_SCODE(OLE_E_PROMPTSAVECANCELLED)
  663.         CASE_SCODE(OLE_E_INVALIDRECT)
  664.         CASE_SCODE(OLE_E_WRONGCOMPOBJ)
  665.         CASE_SCODE(OLE_E_INVALIDHWND)
  666.         CASE_SCODE(OLE_E_NOT_INPLACEACTIVE)
  667.         CASE_SCODE(OLE_E_CANTCONVERT)
  668.         CASE_SCODE(OLE_E_NOSTORAGE)
  669.  
  670.         CASE_SCODE(DV_E_FORMATETC)
  671.         CASE_SCODE(DV_E_DVTARGETDEVICE)
  672.         CASE_SCODE(DV_E_STGMEDIUM)
  673.         CASE_SCODE(DV_E_STATDATA)
  674.         CASE_SCODE(DV_E_LINDEX)
  675.         CASE_SCODE(DV_E_TYMED)
  676.         CASE_SCODE(DV_E_CLIPFORMAT)
  677.         CASE_SCODE(DV_E_DVASPECT)
  678.         CASE_SCODE(DV_E_DVTARGETDEVICE_SIZE)
  679.         CASE_SCODE(DV_E_NOIVIEWOBJECT)
  680.  
  681.         CASE_SCODE(OLE_S_USEREG)
  682.         CASE_SCODE(OLE_S_STATIC)
  683.         CASE_SCODE(OLE_S_MAC_CLIPFORMAT)
  684.  
  685.         CASE_SCODE(CONVERT10_E_OLESTREAM_GET)
  686.         CASE_SCODE(CONVERT10_E_OLESTREAM_PUT)
  687.         CASE_SCODE(CONVERT10_E_OLESTREAM_FMT)
  688.         CASE_SCODE(CONVERT10_E_OLESTREAM_BITMAP_TO_DIB)
  689.         CASE_SCODE(CONVERT10_E_STG_FMT)
  690.         CASE_SCODE(CONVERT10_E_STG_NO_STD_STREAM)
  691.         CASE_SCODE(CONVERT10_E_STG_DIB_TO_BITMAP)
  692.         CASE_SCODE(CONVERT10_S_NO_PRESENTATION)
  693.  
  694.         CASE_SCODE(CLIPBRD_E_CANT_OPEN)
  695.         CASE_SCODE(CLIPBRD_E_CANT_EMPTY)
  696.         CASE_SCODE(CLIPBRD_E_CANT_SET)
  697.         CASE_SCODE(CLIPBRD_E_BAD_DATA)
  698.         CASE_SCODE(CLIPBRD_E_CANT_CLOSE)
  699.  
  700.         CASE_SCODE(DRAGDROP_E_NOTREGISTERED)
  701.         CASE_SCODE(DRAGDROP_E_ALREADYREGISTERED)
  702.         CASE_SCODE(DRAGDROP_E_INVALIDHWND)
  703.         CASE_SCODE(DRAGDROP_S_DROP)
  704.         CASE_SCODE(DRAGDROP_S_CANCEL)
  705.         CASE_SCODE(DRAGDROP_S_USEDEFAULTCURSORS)
  706.  
  707.         CASE_SCODE(OLEOBJ_E_NOVERBS)
  708.         CASE_SCODE(OLEOBJ_E_INVALIDVERB)
  709.         CASE_SCODE(OLEOBJ_S_INVALIDVERB)
  710.         CASE_SCODE(OLEOBJ_S_CANNOT_DOVERB_NOW)
  711.         CASE_SCODE(OLEOBJ_S_INVALIDHWND)
  712.         CASE_SCODE(INPLACE_E_NOTUNDOABLE)
  713.         CASE_SCODE(INPLACE_E_NOTOOLSPACE)
  714.         CASE_SCODE(INPLACE_S_TRUNCATED)
  715.  
  716.         /* SCODE's defined in COMPOBJ.H */
  717.  
  718.         CASE_SCODE(CO_E_NOTINITIALIZED)
  719.         CASE_SCODE(CO_E_ALREADYINITIALIZED)
  720.         CASE_SCODE(CO_E_CANTDETERMINECLASS)
  721.         CASE_SCODE(CO_E_CLASSSTRING)
  722.         CASE_SCODE(CO_E_IIDSTRING)
  723.         CASE_SCODE(CO_E_APPNOTFOUND)
  724.         CASE_SCODE(CO_E_APPSINGLEUSE)
  725.         CASE_SCODE(CO_E_ERRORINAPP)
  726.         CASE_SCODE(CO_E_DLLNOTFOUND)
  727.         CASE_SCODE(CO_E_ERRORINDLL)
  728.         CASE_SCODE(CO_E_WRONGOSFORAPP)
  729.         CASE_SCODE(CO_E_OBJNOTREG)
  730.         CASE_SCODE(CO_E_OBJISREG)
  731.         CASE_SCODE(CO_E_OBJNOTCONNECTED)
  732.         CASE_SCODE(CO_E_APPDIDNTREG)
  733.         CASE_SCODE(CLASS_E_NOAGGREGATION)
  734.         CASE_SCODE(CLASS_E_CLASSNOTAVAILABLE)
  735.         CASE_SCODE(REGDB_E_READREGDB)
  736.         CASE_SCODE(REGDB_E_WRITEREGDB)
  737.         CASE_SCODE(REGDB_E_KEYMISSING)
  738.         CASE_SCODE(REGDB_E_INVALIDVALUE)
  739.         CASE_SCODE(REGDB_E_CLASSNOTREG)
  740.         CASE_SCODE(REGDB_E_IIDNOTREG)
  741.         CASE_SCODE(RPC_E_CALL_REJECTED)
  742.         CASE_SCODE(RPC_E_CALL_CANCELED)
  743.         CASE_SCODE(RPC_E_CANTPOST_INSENDCALL)
  744.         CASE_SCODE(RPC_E_CANTCALLOUT_INASYNCCALL)
  745.         CASE_SCODE(RPC_E_CANTCALLOUT_INEXTERNALCALL)
  746.         CASE_SCODE(RPC_E_CONNECTION_TERMINATED)
  747.         CASE_SCODE(RPC_E_SERVER_DIED)
  748.         CASE_SCODE(RPC_E_CLIENT_DIED)
  749.         CASE_SCODE(RPC_E_INVALID_DATAPACKET)
  750.         CASE_SCODE(RPC_E_CANTTRANSMIT_CALL)
  751.         CASE_SCODE(RPC_E_CLIENT_CANTMARSHAL_DATA)
  752.         CASE_SCODE(RPC_E_CLIENT_CANTUNMARSHAL_DATA)
  753.         CASE_SCODE(RPC_E_SERVER_CANTMARSHAL_DATA)
  754.         CASE_SCODE(RPC_E_SERVER_CANTUNMARSHAL_DATA)
  755.         CASE_SCODE(RPC_E_INVALID_DATA)
  756.         CASE_SCODE(RPC_E_INVALID_PARAMETER)
  757.         CASE_SCODE(RPC_E_CANTCALLOUT_AGAIN)
  758.         CASE_SCODE(RPC_E_UNEXPECTED)
  759.  
  760.         /* SCODE's defined in DVOBJ.H */
  761.  
  762.         CASE_SCODE(DATA_S_SAMEFORMATETC)
  763.         CASE_SCODE(VIEW_E_DRAW)
  764.         CASE_SCODE(VIEW_S_ALREADY_FROZEN)
  765.         CASE_SCODE(CACHE_E_NOCACHE_UPDATED)
  766.         CASE_SCODE(CACHE_S_FORMATETC_NOTSUPPORTED)
  767.         CASE_SCODE(CACHE_S_SAMECACHE)
  768.         CASE_SCODE(CACHE_S_SOMECACHES_NOTUPDATED)
  769.  
  770.         /* SCODE's defined in STORAGE.H */
  771.  
  772.         CASE_SCODE(STG_E_INVALIDFUNCTION)
  773.         CASE_SCODE(STG_E_FILENOTFOUND)
  774.         CASE_SCODE(STG_E_PATHNOTFOUND)
  775.         CASE_SCODE(STG_E_TOOMANYOPENFILES)
  776.         CASE_SCODE(STG_E_ACCESSDENIED)
  777.         CASE_SCODE(STG_E_INVALIDHANDLE)
  778.         CASE_SCODE(STG_E_INSUFFICIENTMEMORY)
  779.         CASE_SCODE(STG_E_INVALIDPOINTER)
  780.         CASE_SCODE(STG_E_NOMOREFILES)
  781.         CASE_SCODE(STG_E_DISKISWRITEPROTECTED)
  782.         CASE_SCODE(STG_E_SEEKERROR)
  783.         CASE_SCODE(STG_E_WRITEFAULT)
  784.         CASE_SCODE(STG_E_READFAULT)
  785.         CASE_SCODE(STG_E_SHAREVIOLATION)
  786.         CASE_SCODE(STG_E_LOCKVIOLATION)
  787.         CASE_SCODE(STG_E_FILEALREADYEXISTS)
  788.         CASE_SCODE(STG_E_INVALIDPARAMETER)
  789.         CASE_SCODE(STG_E_MEDIUMFULL)
  790.         CASE_SCODE(STG_E_ABNORMALAPIEXIT)
  791.         CASE_SCODE(STG_E_INVALIDHEADER)
  792.         CASE_SCODE(STG_E_INVALIDNAME)
  793.         CASE_SCODE(STG_E_UNKNOWN)
  794.         CASE_SCODE(STG_E_UNIMPLEMENTEDFUNCTION)
  795.         CASE_SCODE(STG_E_INVALIDFLAG)
  796.         CASE_SCODE(STG_E_INUSE)
  797.         CASE_SCODE(STG_E_NOTCURRENT)
  798.         CASE_SCODE(STG_E_REVERTED)
  799.         CASE_SCODE(STG_E_CANTSAVE)
  800.         CASE_SCODE(STG_E_OLDFORMAT)
  801.         CASE_SCODE(STG_E_OLDDLL)
  802.         CASE_SCODE(STG_E_SHAREREQUIRED)
  803.         CASE_SCODE(STG_E_NOTFILEBASEDSTORAGE)
  804.         CASE_SCODE(STG_E_EXTANTMARSHALLINGS)
  805.         CASE_SCODE(STG_S_CONVERTED)
  806.  
  807.         /* SCODE's defined in STORAGE.H */
  808.  
  809.         CASE_SCODE(MK_E_CONNECTMANUALLY)
  810.         CASE_SCODE(MK_E_EXCEEDEDDEADLINE)
  811.         CASE_SCODE(MK_E_NEEDGENERIC)
  812.         CASE_SCODE(MK_E_UNAVAILABLE)
  813.         CASE_SCODE(MK_E_SYNTAX)
  814.         CASE_SCODE(MK_E_NOOBJECT)
  815.         CASE_SCODE(MK_E_INVALIDEXTENSION)
  816.         CASE_SCODE(MK_E_INTERMEDIATEINTERFACENOTSUPPORTED)
  817.         CASE_SCODE(MK_E_NOTBINDABLE)
  818.         CASE_SCODE(MK_E_NOTBOUND)
  819.         CASE_SCODE(MK_E_CANTOPENFILE)
  820.         CASE_SCODE(MK_E_MUSTBOTHERUSER)
  821.         CASE_SCODE(MK_E_NOINVERSE)
  822.         CASE_SCODE(MK_E_NOSTORAGE)
  823.         CASE_SCODE(MK_E_NOPREFIX)
  824.         CASE_SCODE(MK_S_REDUCED_TO_SELF)
  825.         CASE_SCODE(MK_S_ME)
  826.         CASE_SCODE(MK_S_HIM)
  827.         CASE_SCODE(MK_S_US)
  828.         CASE_SCODE(MK_S_MONIKERALREADYREGISTERED)
  829.  
  830.         default:
  831.             lstrcpy(szErrName, "UNKNOWN SCODE");
  832.     }
  833.  
  834.     wsprintf(szBuf, "%s %s (0x%lx)\n", lpszMsg, (LPSTR)szErrName, sc);
  835.     OleDbgPrintAlways(lpszPrefix, szBuf, 0);
  836. }
  837.  
  838. char cDebugEnum::enumBuf [200];
  839.  
  840. void cDebugEnum::Print (DWORD e)
  841. {
  842.     for (WORD w = 0; w < count; w++) 
  843.         if (pEnumRecs [w].eValue == (WORD)e) {
  844.             wsprintf (enumBuf, "%s:%s", pEnumName, pEnumRecs [w].pEnumS);
  845.             return;
  846.         }
  847.     wsprintf (enumBuf, "%s:%s", pEnumName, "**INVALID**");
  848. }
  849.  
  850. cDebugEnumRecord rOLERENDER [] =
  851. {
  852.     {"OLERENDER_NONE", OLERENDER_NONE},
  853.     {"OLERENDER_DRAW", OLERENDER_DRAW},
  854.     {"OLERENDER_FORMAT", OLERENDER_FORMAT},
  855.     {"OLERENDER_ASIS", OLERENDER_ASIS}
  856. };
  857.  
  858. cDebugEnum cOLERENDER ("OLERENDER", rOLERENDER, sizeof (rOLERENDER) / sizeof (cDebugEnumRecord));
  859.  
  860. cDebugEnumRecord rOLEVERBATTRIB [] =
  861. {
  862.     {"OLEVERBATTRIB_NEVERDIRTIES", OLEVERBATTRIB_NEVERDIRTIES},
  863.     {"OLEVERBATTRIB_ONCONTAINERMENU", OLEVERBATTRIB_ONCONTAINERMENU}
  864. };
  865.  
  866. cDebugEnum cOLEVERBATTRIB ("OLEVERBATTRIB", rOLEVERBATTRIB, sizeof (rOLEVERBATTRIB) / sizeof (cDebugEnumRecord));
  867.  
  868. cDebugEnumRecord rUSERCLASSTYPE [] =
  869. {
  870.     {"USERCLASSTYPE_FULL", USERCLASSTYPE_FULL},
  871.     {"USERCLASSTYPE_SHORT", USERCLASSTYPE_SHORT},
  872.     {"USERCLASSTYPE_APPNAME", USERCLASSTYPE_APPNAME},
  873. };
  874.  
  875. cDebugEnum cUSERCLASSTYPE ("USERCLASSTYPE", rUSERCLASSTYPE, sizeof (rUSERCLASSTYPE) / sizeof (cDebugEnumRecord));
  876.  
  877. cDebugEnumRecord rOLEMISC [] =
  878. {
  879.     {"OLEMISC_RECOMPOSEONRESIZE", OLEMISC_RECOMPOSEONRESIZE},
  880.     {"OLEMISC_ONLYICONIC", OLEMISC_ONLYICONIC},
  881.     {"OLEMISC_INSERTNOTREPLACE", OLEMISC_INSERTNOTREPLACE},
  882.     {"OLEMISC_STATIC", OLEMISC_STATIC},
  883.     {"OLEMISC_CANTLINKINSIDE", OLEMISC_CANTLINKINSIDE},
  884.     {"OLEMISC_CANLINKBYOLE1", OLEMISC_CANLINKBYOLE1},
  885.     {"OLEMISC_ISLINKOBJECT", OLEMISC_ISLINKOBJECT},
  886.     {"OLEMISC_INSIDEOUT", OLEMISC_INSIDEOUT},
  887.     {"OLEMISC_ACTIVATEWHENVISIBLE", OLEMISC_ACTIVATEWHENVISIBLE}
  888. };
  889.  
  890. cDebugEnum cOLEMISC ("OLEMISC", rOLEMISC, sizeof (rOLEMISC) / sizeof (cDebugEnumRecord));
  891.  
  892. cDebugEnumRecord rOLECLOSE [] =
  893. {
  894.     {"OLECLOSE_SAVEIFDIRTY", OLECLOSE_SAVEIFDIRTY},
  895.     {"OLECLOSE_NOSAVE", OLECLOSE_NOSAVE},
  896.     {"OLECLOSE_PROMPTSAVE", OLECLOSE_PROMPTSAVE}
  897. };
  898.  
  899. cDebugEnum cOLECLOSE ("OLECLOSE", rOLECLOSE, sizeof (rOLECLOSE) / sizeof (cDebugEnumRecord));
  900.  
  901. cDebugEnumRecord rOLEGETMONIKER [] =
  902. {
  903.     {"OLEGETMONIKER_ONLYIFTHERE", OLEGETMONIKER_ONLYIFTHERE},
  904.     {"OLEGETMONIKER_FORCEASSIGN", OLEGETMONIKER_FORCEASSIGN},
  905.     {"OLEGETMONIKER_UNASSIGN", OLEGETMONIKER_UNASSIGN},
  906.     {"OLEGETMONIKER_TEMPFORUSER", OLEGETMONIKER_TEMPFORUSER}
  907. };
  908.  
  909. cDebugEnum cOLEGETMONIKER ("OLEGETMONIKER", rOLEGETMONIKER, sizeof (rOLEGETMONIKER) / sizeof (cDebugEnumRecord));
  910.  
  911. cDebugEnumRecord rOLEWHICHMK [] =
  912. {
  913.     {"OLEWHICHMK_CONTAINER", OLEWHICHMK_CONTAINER},
  914.     {"OLEWHICHMK_OBJREL", OLEWHICHMK_OBJREL},
  915.     {"OLEWHICHMK_OBJFULL", OLEWHICHMK_OBJFULL}
  916. };
  917.  
  918. cDebugEnum cOLEWHICHMK ("OLEWHICHMK", rOLEWHICHMK, sizeof (rOLEWHICHMK) / sizeof (cDebugEnumRecord));
  919.  
  920. cDebugEnumRecord rBINDSPEED [] =
  921. {
  922.     {"BINDSPEED_INDEFINITE", BINDSPEED_INDEFINITE},
  923.     {"BINDSPEED_MODERATE", BINDSPEED_MODERATE},
  924.     {"BINDSPEED_IMMEDIATE", BINDSPEED_IMMEDIATE}
  925. };
  926.  
  927. cDebugEnum cBINDSPEED ("BINDSPEED", rBINDSPEED, sizeof (rBINDSPEED) / sizeof (cDebugEnumRecord));
  928.  
  929. cDebugEnumRecord rOLECONTF [] =
  930. {
  931.     {"OLECONTF_EMBEDDINGS", OLECONTF_EMBEDDINGS},
  932.     {"OLECONTF_LINKS", OLECONTF_LINKS},
  933.     {"OLECONTF_OTHERS", OLECONTF_OTHERS},
  934.     {"OLECONTF_ONLYUSER", OLECONTF_ONLYUSER},
  935.     {"OLECONTF_ONLYIFRUNNING", OLECONTF_ONLYIFRUNNING}
  936. };
  937.  
  938. cDebugEnum cOLECONTF ("OLECONTF", rOLECONTF, sizeof (rOLECONTF) / sizeof (cDebugEnumRecord));
  939.  
  940. cDebugEnumRecord rOLEUPDATE [] =
  941. {
  942.     {"OLEUPDATE_ALWAYS", OLEUPDATE_ALWAYS},
  943.     {"OLEUPDATE_ONCALL", OLEUPDATE_ONCALL}
  944. };
  945.  
  946. cDebugEnum cOLEUPDATE ("OLEUPDATE", rOLEUPDATE, sizeof (rOLEUPDATE) / sizeof (cDebugEnumRecord));
  947.  
  948. cDebugEnumRecord rOLELINKBIND [] =
  949. {
  950.     {"OLELINKBIND_EVENIFCLASSDIFF", OLELINKBIND_EVENIFCLASSDIFF},
  951. };
  952.  
  953. cDebugEnum cOLELINKBIND ("OLELINKBIND", rOLELINKBIND, sizeof (rOLELINKBIND) / sizeof (cDebugEnumRecord));
  954.  
  955.  
  956. cDebugEnumRecord rDVASPECT [] =
  957. {
  958.     {"DVASPECT_CONTENT", DVASPECT_CONTENT},
  959.     {"DVASPECT_THUMBNAIL", DVASPECT_THUMBNAIL},
  960.     {"DVASPECT_ICON", DVASPECT_ICON},
  961.     {"DVASPECT_DOCPRINT", DVASPECT_DOCPRINT}
  962. };
  963.  
  964. cDebugEnum cDVASPECT ("DVASPECT", rDVASPECT, sizeof (rDVASPECT) / sizeof (cDebugEnumRecord));
  965.  
  966. cDebugEnumRecord rTYMED [] =
  967. {
  968.     {"TYMED_HGLOBAL", TYMED_HGLOBAL},
  969.     {"TYMED_FILE", TYMED_FILE},
  970.     {"TYMED_ISTREAM", TYMED_ISTREAM},
  971.     {"TYMED_ISTORAGE", TYMED_ISTORAGE},
  972.     {"TYMED_GDI", TYMED_GDI},
  973.     {"TYMED_MFPICT", TYMED_MFPICT},
  974.     {"TYMED_NULL", TYMED_NULL}
  975. };
  976.  
  977. cDebugEnum cTYMED ("TYMED", rTYMED, sizeof (rTYMED) / sizeof (cDebugEnumRecord));
  978.  
  979. cDebugEnumRecord rDATADIR [] =
  980. {
  981.     {"DATADIR_GET", DATADIR_GET},
  982.     {"DATADIR_SET", DATADIR_SET},
  983. };
  984.  
  985. cDebugEnum cDATADIR ("DATADIR", rDATADIR, sizeof (rDATADIR) / sizeof (cDebugEnumRecord));
  986.  
  987. cDebugEnumRecord rADVF [] =
  988. {
  989.     {"ADVF_NODATA", ADVF_NODATA},
  990.     {"ADVF_PRIMEFIRST", ADVF_PRIMEFIRST},
  991.     {"ADVF_ONLYONCE", ADVF_ONLYONCE},
  992.     {"ADVF_DATAONSTOP", ADVF_DATAONSTOP},
  993.     {"ADVFCACHE_NOHANDLER", ADVFCACHE_NOHANDLER},
  994.     {"ADVFCACHE_FORCEBUILTIN", ADVFCACHE_FORCEBUILTIN},
  995.     {"ADVFCACHE_ONSAVE", ADVFCACHE_ONSAVE}
  996. };
  997.  
  998. cDebugEnum cADVF ("ADVF", rADVF, sizeof (rADVF) / sizeof (cDebugEnumRecord));
  999.  
  1000.  
  1001. cDebugEnumRecord rMEMCTX [] =
  1002. {
  1003.     {"MEMCTX_TASK", MEMCTX_TASK},
  1004.     {"MEMCTX_SHARED", MEMCTX_SHARED},
  1005. #ifdef _MAC
  1006.    {"MEMCTX_MACSYSTEM", MEMCTX_MACSYSTEM},
  1007. #endif 
  1008.     {"MEMCTX_UNKNOWN", MEMCTX_UNKNOWN},
  1009.     {"MEMCTX_SAME", MEMCTX_SAME},
  1010. };
  1011.  
  1012. cDebugEnum cMEMCTX ("MEMCTX", rMEMCTX, sizeof (rMEMCTX) / sizeof (cDebugEnumRecord));
  1013.  
  1014. cDebugEnumRecord rCLSCTX [] =
  1015. {
  1016.     {"CLSCTX_INPROC_SERVER", CLSCTX_INPROC_SERVER},
  1017.     {"CLSCTX_INPROC_HANDLER", CLSCTX_INPROC_HANDLER},
  1018.     {"CLSCTX_LOCAL_SERVER", CLSCTX_LOCAL_SERVER} 
  1019. };
  1020.  
  1021. cDebugEnum cCLSCTX ("CLSCTX", rCLSCTX, sizeof (rCLSCTX) / sizeof (cDebugEnumRecord));
  1022.  
  1023. cDebugEnumRecord rREGCLS [] =
  1024. {
  1025.     {"REGCLS_SINGLEUSE", REGCLS_SINGLEUSE},
  1026.     {"REGCLS_MULTIPLEUSE", REGCLS_MULTIPLEUSE} 
  1027. };
  1028.  
  1029. cDebugEnum cREGCLS ("REGCLS", rREGCLS, sizeof (rREGCLS) / sizeof (cDebugEnumRecord));
  1030.  
  1031. cDebugEnumRecord rMSHLFLAGS [] =
  1032. {
  1033.     {"MSHLFLAGS_NORMAL", MSHLFLAGS_NORMAL},
  1034.     {"MSHLFLAGS_TABLESTRONG", MSHLFLAGS_TABLESTRONG},
  1035.     {"MSHLFLAGS_TABLEWEAK", MSHLFLAGS_TABLEWEAK} 
  1036. };
  1037.  
  1038. cDebugEnum cMSHLFLAGS ("MSHLFLAGS", rMSHLFLAGS, sizeof (rMSHLFLAGS) / sizeof (cDebugEnumRecord));
  1039.  
  1040. cDebugEnumRecord rMSHCTX [] =
  1041. {
  1042.     {"MSHCTX_LOCAL", MSHCTX_LOCAL},
  1043.     {"MSHCTX_NOSHAREDMEM", MSHCTX_NOSHAREDMEM},
  1044. };
  1045.  
  1046. cDebugEnum cMSHCTX ("MSHCTX", rMSHCTX, sizeof (rMSHCTX) / sizeof (cDebugEnumRecord));
  1047.  
  1048. cDebugEnumRecord rCALLTYPE [] =
  1049. {
  1050.     {"CALLTYPE_TOPLEVEL", CALLTYPE_TOPLEVEL},
  1051.     {"CALLTYPE_NESTED", CALLTYPE_NESTED},
  1052.     {"CALLTYPE_ASYNC", CALLTYPE_ASYNC},
  1053.     {"CALLTYPE_TOPLEVEL_CALLPENDING", CALLTYPE_TOPLEVEL_CALLPENDING},
  1054.     {"CALLTYPE_ASYNC_CALLPENDING", CALLTYPE_ASYNC_CALLPENDING} 
  1055. };
  1056.  
  1057. cDebugEnum cCALLTYPE ("CALLTYPE", rCALLTYPE, sizeof (rCALLTYPE) / sizeof (cDebugEnumRecord));
  1058.  
  1059. cDebugEnumRecord rSERVERCALL [] =
  1060. {
  1061.     {"SERVERCALL_ISHANDLED", SERVERCALL_ISHANDLED},
  1062.     {"SERVERCALL_REJECTED", SERVERCALL_REJECTED},
  1063.     {"SERVERCALL_RETRYLATER", SERVERCALL_RETRYLATER} 
  1064. };
  1065.  
  1066. cDebugEnum cSERVERCALL ("SERVERCALL", rSERVERCALL, sizeof (rSERVERCALL) / sizeof (cDebugEnumRecord));
  1067.  
  1068. cDebugEnumRecord rPENDINGTYPE [] =
  1069. {
  1070.     {"PENDINGTYPE_TOPLEVEL", PENDINGTYPE_TOPLEVEL},
  1071.     {"PENDINGTYPE_NESTED", PENDINGTYPE_NESTED}
  1072. };
  1073.  
  1074. cDebugEnum cPENDINGTYPE ("PENDINGTYPE", rPENDINGTYPE, sizeof (rPENDINGTYPE) / sizeof (cDebugEnumRecord));
  1075.  
  1076. cDebugEnumRecord rPENDINGMSG [] =
  1077. {
  1078.     {"PENDINGMSG_CANCELCALL", PENDINGMSG_CANCELCALL},
  1079.     {"PENDINGMSG_WAITNOPROCESS", PENDINGMSG_WAITNOPROCESS},
  1080.     {"PENDINGMSG_WAITDEFPROCESS", PENDINGMSG_WAITDEFPROCESS} 
  1081.     
  1082. };
  1083.  
  1084. cDebugEnum cPENDINGMSG ("PENDINGMSG", rPENDINGMSG, sizeof (rPENDINGMSG) / sizeof (cDebugEnumRecord));
  1085.  
  1086. cDebugEnumRecord rBIND_FLAGS [] =
  1087. {
  1088.     {"BIND_MAYBOTHERUSER", BIND_MAYBOTHERUSER},
  1089.     {"BIND_JUSTTESTEXISTENCE", BIND_JUSTTESTEXISTENCE}
  1090. };
  1091.  
  1092. cDebugEnum cBIND_FLAGS ("BIND_FLAGS", rBIND_FLAGS, sizeof (rBIND_FLAGS) / sizeof (cDebugEnumRecord));
  1093.  
  1094. cDebugEnumRecord rKSYS [] =
  1095. {
  1096.     {"MKSYS_NONE", MKSYS_NONE},
  1097.     {"MKSYS_GENERICCOMPOSITE", MKSYS_GENERICCOMPOSITE},
  1098.     {"MKSYS_FILEMONIKER", MKSYS_FILEMONIKER},
  1099.     {"MKSYS_ANTIMONIKER", MKSYS_ANTIMONIKER},
  1100.     {"MKSYS_ITEMMONIKER", MKSYS_ITEMMONIKER},
  1101.     {"MKSYS_POINTERMONIKER", MKSYS_POINTERMONIKER}
  1102. };
  1103.  
  1104. cDebugEnum cKSYS ("KSYS", rKSYS, sizeof (rKSYS) / sizeof (cDebugEnumRecord));
  1105.  
  1106. cDebugEnumRecord rMKRREDUCE [] =
  1107. {
  1108.     {"MKRREDUCE_ONE", MKRREDUCE_ONE},
  1109.     {"MKRREDUCE_TOUSER", MKRREDUCE_TOUSER},
  1110.     {"MKRREDUCE_THROUGHUSER", MKRREDUCE_THROUGHUSER},
  1111.     {"MKRREDUCE_ALL", MKRREDUCE_ALL}
  1112. };
  1113.  
  1114. cDebugEnum cMKRREDUCE ("MKRREDUCE", rMKRREDUCE, sizeof (rMKRREDUCE) / sizeof (cDebugEnumRecord));
  1115.  
  1116. cDebugEnumRecord rSTGC [] =
  1117. {
  1118.     {"STGC_DEFAULT", STGC_DEFAULT},
  1119.     {"STGC_OVERWRITE", STGC_OVERWRITE},
  1120.     {"STGC_ONLYIFCURRENT", STGC_ONLYIFCURRENT},
  1121.     {"STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE", STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE}
  1122. };
  1123.  
  1124. cDebugEnum cSTGC ("STGC", rSTGC, sizeof (rSTGC) / sizeof (cDebugEnumRecord));
  1125.  
  1126. cDebugEnumRecord rSTGTY [] =
  1127. {
  1128.     {"STGTY_STORAGE", STGTY_STORAGE},
  1129.     {"STGTY_STREAM", STGTY_STREAM},
  1130.     {"STGTY_LOCKBYTES", STGTY_LOCKBYTES},
  1131.     {"STGTY_PROPERTY", STGTY_PROPERTY}
  1132. };
  1133.  
  1134. cDebugEnum cSTGTY ("STGTY", rSTGTY, sizeof (rSTGTY) / sizeof (cDebugEnumRecord));
  1135.  
  1136. cDebugEnumRecord rSTREAM_SEEK [] =
  1137. {
  1138.     {"STREAM_SEEK_SET", STREAM_SEEK_SET},
  1139.     {"STREAM_SEEK_CUR", STREAM_SEEK_CUR},
  1140.     {"STREAM_SEEK_END", STREAM_SEEK_END}
  1141. };
  1142.  
  1143. cDebugEnum cSTREAM_SEEK ("STREAM_SEEK", rSTREAM_SEEK, sizeof (rSTREAM_SEEK) / sizeof (cDebugEnumRecord));
  1144.  
  1145. cDebugEnumRecord rLOCKTYPE [] =
  1146. {
  1147.     {"LOCK_WRITE", LOCK_WRITE},
  1148.     {"LOCK_EXCLUSIVE", LOCK_EXCLUSIVE},
  1149.     {"LOCK_ONLYONCE", LOCK_ONLYONCE}
  1150. };
  1151.  
  1152. cDebugEnum cLOCKTYPE ("LOCKTYPE", rLOCKTYPE, sizeof (rLOCKTYPE) / sizeof (cDebugEnumRecord));
  1153.  
  1154. cDebugEnumRecord rSTGMOVE [] =
  1155. {
  1156.     {"STGMOVE_MOVE", STGMOVE_MOVE},
  1157.     {"STGMOVE_COPY", STGMOVE_COPY}
  1158. };
  1159.  
  1160. cDebugEnum cSTGMOVE ("STGMOVE", rSTGMOVE, sizeof (rSTGMOVE) / sizeof (cDebugEnumRecord));
  1161.  
  1162. cDebugEnumRecord rSTATFLAG [] =
  1163. {
  1164.     {"STATFLAG_DEFAULT", STATFLAG_DEFAULT},
  1165.     {"STATFLAG_NONAME", STATFLAG_NONAME}
  1166. };
  1167.  
  1168. cDebugEnum cSTATFLAG ("STATFLAG", rSTATFLAG, sizeof (rSTATFLAG) / sizeof (cDebugEnumRecord));
  1169.  
  1170. cDebugEnumRecord rOLEUIPASTEFLAG [] =
  1171. {
  1172.    {"OLEUIPASTE_PASTEONLY", OLEUIPASTE_PASTEONLY},
  1173.    {"OLEUIPASTE_PASTE", OLEUIPASTE_PASTE},
  1174.    {"OLEUIPASTE_LINKANYTYPE", OLEUIPASTE_LINKANYTYPE},
  1175.    {"OLEUIPASTE_LINKTYPE1", OLEUIPASTE_LINKTYPE1},
  1176.    {"OLEUIPASTE_LINKTYPE2", OLEUIPASTE_LINKTYPE2},
  1177.    {"OLEUIPASTE_LINKTYPE3", OLEUIPASTE_LINKTYPE3},
  1178.    {"OLEUIPASTE_LINKTYPE4", OLEUIPASTE_LINKTYPE4},
  1179.    {"OLEUIPASTE_LINKTYPE5", OLEUIPASTE_LINKTYPE5},
  1180.    {"OLEUIPASTE_LINKTYPE6", OLEUIPASTE_LINKTYPE6},
  1181.    {"OLEUIPASTE_LINKTYPE7", OLEUIPASTE_LINKTYPE7},
  1182.    {"OLEUIPASTE_LINKTYPE8", OLEUIPASTE_LINKTYPE8}
  1183. };
  1184.  
  1185. cDebugEnum cOLEUIPASTEFLAG ("OLEUIPASTEFLAG", rOLEUIPASTEFLAG, sizeof (rOLEUIPASTEFLAG) / sizeof (cDebugEnumRecord));
  1186.  
  1187. #endif
  1188.  
  1189. #ifdef    _DEBUG
  1190. //**************************************************************************
  1191. //
  1192. // IUnknownWatcher
  1193. //
  1194. //**************************************************************************
  1195.  
  1196. IUnknownWatcher::IUnknownWatcher( IUnknown *punk, char *name ) : pUnk( punk ){
  1197.     strncpy( Name, name, sizeof( Name ) );
  1198.     char tmp[80];
  1199.     wsprintf( tmp, "%s %04x:%04x created, nRef=%d\n\r", Name, HIWORD((DWORD)pUnk),LOWORD((DWORD)pUnk), nRef() );
  1200.     OutputDebugString( tmp );
  1201. }
  1202. HRESULT _IFUNC IUnknownWatcher::QueryInterface(REFIID iid, void FAR* FAR* pif){
  1203.     HRESULT hr;
  1204.     if( iid == IID_IUnknown ){
  1205.         *pif = this;
  1206.         pUnk->AddRef();
  1207.         hr = ResultFromScode(S_OK);
  1208.     } else
  1209.         hr = pUnk->QueryInterface( iid, pif );
  1210.     if( hr == ResultFromScode(S_OK) ){
  1211.         char tmp[80];
  1212.         wsprintf( tmp, "%s %04x:%04x QI OK, nRef=%d\n\r", Name, HIWORD((DWORD)pUnk),LOWORD((DWORD)pUnk), nRef() );
  1213.         OutputDebugString( tmp );
  1214.     }
  1215.     return hr;
  1216. }
  1217. ULONG _IFUNC IUnknownWatcher::AddRef(){
  1218.     int i = pUnk->AddRef();
  1219.     char tmp[80];
  1220.     wsprintf( tmp, "%s %04x:%04x AddRef to %d\n\r", Name, HIWORD((DWORD)pUnk),LOWORD((DWORD)pUnk), i );
  1221.     OutputDebugString( tmp );
  1222.     return i;
  1223. }
  1224. ULONG _IFUNC IUnknownWatcher::Release(){
  1225.     int i = pUnk->Release();
  1226.     char tmp[80];
  1227.     wsprintf( tmp, "%s %04x:%04x Released to %d\n\r", Name, HIWORD((DWORD)pUnk),LOWORD((DWORD)pUnk), i );
  1228.     OutputDebugString( tmp );
  1229.     if( i-1 == 0 ){
  1230.         wsprintf( tmp, "%s %04x:%04x DELETED\n\r", Name, HIWORD((DWORD)pUnk),LOWORD((DWORD)pUnk) );
  1231.         OutputDebugString( tmp );
  1232.         delete this;
  1233.         return 0;
  1234.     }
  1235.     return i;
  1236. }
  1237. int IUnknownWatcher::nRef(){
  1238.     int i = pUnk->AddRef();
  1239.     pUnk->Release();
  1240.     return i;
  1241. }
  1242.  
  1243. #endif
  1244.  
  1245. #ifdef    _DEBUG
  1246. //**************************************************************************
  1247. //
  1248. // IMonikerWatcher
  1249. //
  1250. //**************************************************************************
  1251.  
  1252. IMonikerWatcher::IMonikerWatcher( IMoniker *pmoniker, char *name ) : pMoniker( pmoniker ){
  1253.     strncpy( Name, name, sizeof( Name ) );
  1254.     char tmp[80];
  1255.     int i = pMoniker->AddRef();
  1256.     pMoniker->Release();
  1257.     wsprintf( tmp, "%s %04x:%04x created, nRef=%d\n\r",
  1258.         Name, HIWORD((DWORD)pMoniker),LOWORD((DWORD)pMoniker), i-1 );
  1259.     OutputDebugString( tmp );
  1260. }
  1261.  
  1262. // *** IUnknown methods ***
  1263. HRESULT _IFUNC
  1264. IMonikerWatcher::QueryInterface(REFIID riid, LPVOID FAR* ppvObj) {
  1265.     HRESULT hr = ResultFromScode(S_OK);
  1266.     int i;
  1267.     if( riid == IID_IUnknown ){
  1268.         *ppvObj = (IUnknown * )this;
  1269.         i = pMoniker->AddRef();
  1270.     } else
  1271.     if( riid == IID_IMoniker ){
  1272.         *ppvObj = (IMoniker * )this;
  1273.         i = pMoniker->AddRef();
  1274.     } else
  1275.         hr = pMoniker->QueryInterface( riid, ppvObj );
  1276.     if( hr == ResultFromScode(S_OK) ){
  1277.         char tmp[80];
  1278.         i = pMoniker->AddRef();
  1279.         pMoniker->Release();
  1280.         i--;
  1281.     wsprintf( tmp, "%s %04x:%04x QI-OK, nRef=%d\n\r",
  1282.         Name, HIWORD((DWORD)pMoniker),LOWORD((DWORD)pMoniker), i );
  1283.         OutputDebugString( tmp );
  1284.     }
  1285.     return hr;
  1286. }
  1287.  
  1288. ULONG _IFUNC
  1289. IMonikerWatcher::AddRef(){
  1290.     int i = pMoniker->AddRef();
  1291.     char tmp[80];
  1292.     wsprintf( tmp, "%s %04x:%04x AddRef, nRef=%d\n\r",
  1293.         Name, HIWORD((DWORD)pMoniker),LOWORD((DWORD)pMoniker), i );
  1294.     OutputDebugString( tmp );
  1295.     return i;
  1296. }
  1297.  
  1298. ULONG _IFUNC
  1299. IMonikerWatcher::Release() {
  1300.     int i = pMoniker->Release();
  1301.     char tmp[80];
  1302.     wsprintf( tmp, "%s %04x:%04x Release, nRef=%d\n\r",
  1303.         Name, HIWORD((DWORD)pMoniker),LOWORD((DWORD)pMoniker), i );
  1304.     OutputDebugString( tmp );
  1305.     if( i == 0 ){
  1306.         wsprintf( tmp, "%s %04x:%04x DELETED\n\r",
  1307.             Name, HIWORD((DWORD)pMoniker),LOWORD((DWORD)pMoniker) );
  1308.         OutputDebugString( tmp );
  1309.         delete this;
  1310.         return 0;
  1311.     }
  1312.     return i;
  1313. }
  1314.  
  1315.  
  1316. // *** IPersist methods ***
  1317. HRESULT _IFUNC
  1318. IMonikerWatcher::GetClassID(LPCLSID lpClassID) {
  1319.     HRESULT hr;
  1320.     hr = pMoniker->GetClassID(lpClassID) ;
  1321.     return hr;
  1322. }
  1323.  
  1324.  
  1325. // *** IPersistStream methods ***
  1326. HRESULT _IFUNC
  1327. IMonikerWatcher::IsDirty() {
  1328.     HRESULT hr;
  1329.     hr = pMoniker->IsDirty() ;
  1330.     return hr;
  1331. }
  1332.  
  1333. HRESULT _IFUNC
  1334. IMonikerWatcher::Load(LPSTREAM pStm) {
  1335.     HRESULT hr;
  1336.     hr = pMoniker->Load(pStm) ;
  1337.     return hr;
  1338. }
  1339.  
  1340. HRESULT _IFUNC
  1341. IMonikerWatcher::Save(LPSTREAM pStm, BOOL fClearDirty) {
  1342.     HRESULT hr;
  1343.     hr = pMoniker->Save(pStm, fClearDirty) ;
  1344.     return hr;
  1345. }
  1346.  
  1347. HRESULT _IFUNC
  1348. IMonikerWatcher::GetSizeMax(ULARGE_INTEGER FAR * pcbSize) {
  1349.     HRESULT hr;
  1350.     hr = pMoniker->GetSizeMax(pcbSize) ;
  1351.     return hr;
  1352. }
  1353.  
  1354.  
  1355. // *** IMoniker methods ***
  1356. HRESULT _IFUNC
  1357. IMonikerWatcher::BindToObject(LPBC pbc, LPMONIKER pmkToLeft, REFIID riidResult, LPVOID FAR* ppvResult) {
  1358.     HRESULT hr;
  1359.     hr = pMoniker->BindToObject(pbc, pmkToLeft, riidResult, ppvResult) ;
  1360.     return hr;
  1361. }
  1362.  
  1363. HRESULT _IFUNC
  1364. IMonikerWatcher::BindToStorage(LPBC pbc, LPMONIKER pmkToLeft, REFIID riid, LPVOID FAR* ppvObj) {
  1365.     HRESULT hr;
  1366.     hr = pMoniker->BindToStorage(pbc, pmkToLeft, riid, ppvObj) ;
  1367.     return hr;
  1368. }
  1369.  
  1370. HRESULT _IFUNC
  1371. IMonikerWatcher::Reduce(LPBC pbc, DWORD dwReduceHowFar, LPMONIKER FAR*ppmkToLeft, LPMONIKER FAR * ppmkReduced) {
  1372.     HRESULT hr;
  1373.     hr = pMoniker->Reduce(pbc, dwReduceHowFar, ppmkToLeft, ppmkReduced) ;
  1374.     return hr;
  1375. }
  1376.  
  1377. HRESULT _IFUNC
  1378. IMonikerWatcher::ComposeWith(LPMONIKER pmkRight, BOOL fOnlyIfNotGeneric, LPMONIKER FAR* ppmkComposite) {
  1379.     HRESULT hr;
  1380.     hr = pMoniker->ComposeWith(pmkRight, fOnlyIfNotGeneric, ppmkComposite) ;
  1381.     return hr;
  1382. }
  1383.  
  1384. HRESULT _IFUNC
  1385. IMonikerWatcher::Enum(BOOL fForward, LPENUMMONIKER FAR* ppenumMoniker){
  1386.     HRESULT hr;
  1387.     hr = pMoniker->Enum(fForward, ppenumMoniker);
  1388.     return hr;
  1389. }
  1390.  
  1391.  
  1392. HRESULT _IFUNC
  1393. IMonikerWatcher::IsEqual(LPMONIKER pmkOtherMoniker) {
  1394.     HRESULT hr;
  1395.     hr = pMoniker->IsEqual(pmkOtherMoniker) ;
  1396.     return hr;
  1397. }
  1398.  
  1399. HRESULT _IFUNC
  1400. IMonikerWatcher::Hash(LPDWORD pdwHash) {
  1401.     HRESULT hr;
  1402.     hr = pMoniker->Hash(pdwHash) ;
  1403.     return hr;
  1404. }
  1405.  
  1406. HRESULT _IFUNC
  1407. IMonikerWatcher::IsRunning(LPBC pbc, LPMONIKER pmkToLeft, LPMONIKER pmkNewlyRunning) {
  1408.     HRESULT hr;
  1409.     hr = pMoniker->IsRunning(pbc, pmkToLeft, pmkNewlyRunning) ;
  1410.     return hr;
  1411. }
  1412.  
  1413. HRESULT _IFUNC
  1414. IMonikerWatcher::GetTimeOfLastChange(LPBC pbc, LPMONIKER pmkToLeft, FILETIME FAR* pfiletime) {
  1415.     HRESULT hr;
  1416.     hr = pMoniker->GetTimeOfLastChange(pbc, pmkToLeft, pfiletime) ;
  1417.     return hr;
  1418. }
  1419.  
  1420. HRESULT _IFUNC
  1421. IMonikerWatcher::Inverse(LPMONIKER FAR* ppmk) {
  1422.     HRESULT hr;
  1423.     hr = pMoniker->Inverse(ppmk) ;
  1424.     return hr;
  1425. }
  1426.  
  1427. HRESULT _IFUNC
  1428. IMonikerWatcher::CommonPrefixWith(LPMONIKER pmkOther, LPMONIKER FAR*ppmkPrefix) {
  1429.     HRESULT hr;
  1430.     hr = pMoniker->CommonPrefixWith(pmkOther, ppmkPrefix) ;
  1431.     return hr;
  1432. }
  1433.  
  1434. HRESULT _IFUNC
  1435. IMonikerWatcher::RelativePathTo(LPMONIKER pmkOther, LPMONIKER FAR*ppmkRelPath) {
  1436.     HRESULT hr;
  1437.     hr = pMoniker->RelativePathTo(pmkOther, ppmkRelPath) ;
  1438.     return hr;
  1439. }
  1440.  
  1441. HRESULT _IFUNC
  1442. IMonikerWatcher::GetDisplayName(LPBC pbc, LPMONIKER pmkToLeft, LPSTR FAR* lplpszDisplayName) {
  1443.     HRESULT hr;
  1444.     hr = pMoniker->GetDisplayName(pbc, pmkToLeft, lplpszDisplayName) ;
  1445.     return hr;
  1446. }
  1447.  
  1448. HRESULT _IFUNC
  1449. IMonikerWatcher::ParseDisplayName(LPBC pbc, LPMONIKER pmkToLeft, LPSTR lpszDisplayName, ULONG FAR* pchEaten, LPMONIKER FAR* ppmkOut) {
  1450.     HRESULT hr;
  1451.     hr = pMoniker->ParseDisplayName(pbc, pmkToLeft, lpszDisplayName, pchEaten, ppmkOut) ;
  1452.     return hr;
  1453. }
  1454.  
  1455. HRESULT _IFUNC
  1456. IMonikerWatcher::IsSystemMoniker(LPDWORD pdwMksys) {
  1457.     HRESULT hr;
  1458.     hr = pMoniker->IsSystemMoniker(pdwMksys) ;
  1459.     return hr;
  1460. }
  1461. #endif
  1462.  
  1463.  
  1464.  
  1465. #ifdef    _DEBUG
  1466. //**************************************************************************
  1467. //
  1468. // ReleaseWatcher
  1469. //
  1470. //**************************************************************************
  1471.  
  1472. HRESULT _IFUNC
  1473. ReleaseWatcher::QueryInterface( REFIID, LPVOID FAR *ppid ){
  1474.     *ppid = NULL;
  1475.     return ResultFromScode( E_NOINTERFACE );
  1476. }
  1477. ULONG   _IFUNC
  1478. ReleaseWatcher::AddRef(){
  1479.     return ++nRef;
  1480. }
  1481. ULONG   _IFUNC
  1482. ReleaseWatcher::Release(){
  1483.     return --nRef;
  1484. }
  1485.  
  1486. #endif
  1487.  
  1488.