home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 May / Pcwk5b98.iso / Borland / Cplus45 / BC45 / BOCOLE.PAK / OLEDEBUG.CPP < prev    next >
C/C++ Source or Header  |  1995-08-29  |  42KB  |  1,490 lines

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