text: //
  // Debug dump functions for common ADTs
  //
  // This file should be #included by your DLL.  It is not part of
  // stocklib.lib because it requires linking to certain guid libs,
  // and DLLs like COMCTL32 do not do this.  (Therefore, COMCTL32
  // doesn't #include this file, but still links to stocklib.)
  //
  //
  
  #include <intshcut.h>       // For error values
  #include <sherror.h>
  #include <strsafe.h>
  
  #ifdef DEBUG
  
  /*
   * macro for simplifying result to string translation, assumes result string
   * pointer pcsz
   */
  
  #define STRING_CASE(val)               case val: pcsz = TEXT(#val); break
  
  
  //
  //  Debug value-to-string mapping functions
  //
  
  
  /*----------------------------------------------------------
  Purpose: Return the string form of the clipboard format.
  
  Returns: pointer to a static string
  Cond:    --
  */
  LPCTSTR 
  Dbg_GetCFName(
      UINT ucf)
  {
      LPCTSTR pcsz;
      static TCHAR s_szCFName[MAX_PATH];
  
      switch (ucf)
      {
          STRING_CASE(CF_TEXT);
          STRING_CASE(CF_BITMAP);
          STRING_CASE(CF_METAFILEPICT);
          STRING_CASE(CF_SYLK);
          STRING_CASE(CF_DIF);
          STRING_CASE(CF_TIFF);
          STRING_CASE(CF_OEMTEXT);
          STRING_CASE(CF_DIB);
          STRING_CASE(CF_PALETTE);
          STRING_CASE(CF_PENDATA);
          STRING_CASE(CF_RIFF);
          STRING_CASE(CF_WAVE);
          STRING_CASE(CF_UNICODETEXT);
          STRING_CASE(CF_ENHMETAFILE);
          STRING_CASE(CF_HDROP);
          STRING_CASE(CF_LOCALE);
          STRING_CASE(CF_MAX);
          STRING_CASE(CF_OWNERDISPLAY);
          STRING_CASE(CF_DSPTEXT);
          STRING_CASE(CF_DSPBITMAP);
          STRING_CASE(CF_DSPMETAFILEPICT);
          STRING_CASE(CF_DSPENHMETAFILE);
  
      default:
          if (! GetClipboardFormatName(ucf, s_szCFName, SIZECHARS(s_szCFName)))
              StringCchCopy(s_szCFName, ARRAYSIZE(s_szCFName), TEXT("UNKNOWN CLIPBOARD FORMAT"));
          pcsz = s_szCFName;
          break;
      }
  
      ASSERT(pcsz);
  
      return(pcsz);
  }
  
  
  LPCTSTR 
  Dbg_GetHRESULTName(
      HRESULT hr)
  {
      LPCTSTR pcsz;
      static TCHAR s_rgchHRESULT[] = TEXT("0x12345678");
  
      switch (hr)
          {
          STRING_CASE(S_OK);
          STRING_CASE(S_FALSE);
  
          STRING_CASE(DRAGDROP_S_CANCEL);
          STRING_CASE(DRAGDROP_S_DROP);
          STRING_CASE(DRAGDROP_S_USEDEFAULTCURSORS);
  
          STRING_CASE(E_UNEXPECTED);
          STRING_CASE(E_NOTIMPL);
          STRING_CASE(E_OUTOFMEMORY);
          STRING_CASE(E_INVALIDARG);
          STRING_CASE(E_NOINTERFACE);
          STRING_CASE(E_POINTER);
          STRING_CASE(E_HANDLE);
          STRING_CASE(E_ABORT);
          STRING_CASE(E_FAIL);
          STRING_CASE(E_ACCESSDENIED);
  
          STRING_CASE(CLASS_E_NOAGGREGATION);
  
          STRING_CASE(CO_E_NOTINITIALIZED);
          STRING_CASE(CO_E_ALREADYINITIALIZED);
          STRING_CASE(CO_E_INIT_ONLY_SINGLE_THREADED);
  
          STRING_CASE(DV_E_DVASPECT);
          STRING_CASE(DV_E_LINDEX);
          STRING_CASE(DV_E_TYMED);
          STRING_CASE(DV_E_FORMATETC);
  
          STRING_CASE(E_FLAGS);
  
          STRING_CASE(URL_E_INVALID_SYNTAX);
          STRING_CASE(URL_E_UNREGISTERED_PROTOCOL);
  
          STRING_CASE(IS_E_EXEC_FAILED);
  
          STRING_CASE(E_FILE_NOT_FOUND);
          STRING_CASE(E_PATH_NOT_FOUND);
  
      default:
          StringCchPrintf(s_rgchHRESULT, ARRAYSIZE(s_rgchHRESULT), TEXT("%#lx"), hr);
          pcsz = s_rgchHRESULT;
          break;
          }
  
      ASSERT(IS_VALID_STRING_PTR(pcsz, -1));
  
      return(pcsz);
  }
  
  
  /*----------------------------------------------------------
  Purpose: Dump propvariant types
  
  Returns: 
  Cond:    --
  */
  LPCTSTR 
  Dbg_GetVTName(
      VARTYPE vt)
  {
      LPCTSTR pcsz;
      static TCHAR s_szT[] = TEXT("0x12345678");
  
      switch (vt)
          {
          STRING_CASE(VT_EMPTY);
          STRING_CASE(VT_NULL);
          STRING_CASE(VT_I2);
          STRING_CASE(VT_I4);
          STRING_CASE(VT_R4);
          STRING_CASE(VT_R8);
          STRING_CASE(VT_CY);
          STRING_CASE(VT_DATE);
          STRING_CASE(VT_BSTR);
          STRING_CASE(VT_ERROR);
          STRING_CASE(VT_BOOL);
          STRING_CASE(VT_VARIANT);
          STRING_CASE(VT_UI1);
          STRING_CASE(VT_UI2);
          STRING_CASE(VT_UI4);
          STRING_CASE(VT_I8);
          STRING_CASE(VT_UI8);
          STRING_CASE(VT_LPSTR);
          STRING_CASE(VT_LPWSTR);
          STRING_CASE(VT_FILETIME);
          STRING_CASE(VT_BLOB);
          STRING_CASE(VT_STREAM);
          STRING_CASE(VT_STORAGE);
          STRING_CASE(VT_STREAMED_OBJECT);
          STRING_CASE(VT_STORED_OBJECT);
          STRING_CASE(VT_BLOB_OBJECT);
          STRING_CASE(VT_CLSID);
          STRING_CASE(VT_ILLEGAL);
          STRING_CASE(VT_CF);
  
      default:
          StringCchPrintf(s_szT, ARRAYSIZE(s_szT), TEXT("%#lx"), vt);
          pcsz = s_szT;
          break;
          }
  
      ASSERT(IS_VALID_STRING_PTR(pcsz, -1));
  
      return(pcsz);
  }
  
  
  #define STRING_RIID(val)               { &val, TEXT(#val) }
  
  //
  //  Alphabetical order, please.
  //
  
  struct 
      {
      REFIID riid;
      LPCTSTR psz;
      } const c_mpriid[] = 
  {
  #ifdef __IAddressList_INTERFACE_DEFINED__
          STRING_RIID(IID_IAddressList),
  #endif
          STRING_RIID(IID_IAdviseSink),
  #ifdef __IAddressList_INTERFACE_DEFINED__
          STRING_RIID(IID_IAddressList),
  #endif
  #ifdef __IAugmentedShellFolder_INTERFACE_DEFINED__
          STRING_RIID(IID_IAugmentedShellFolder),
  #endif
  #ifdef __IAugmentedShellFolder2_INTERFACE_DEFINED__
          STRING_RIID(IID_IAugmentedShellFolder2),
  #endif
  #ifdef __IAuthenticate_INTERFACE_DEFINED__
          STRING_RIID(IID_IAuthenticate),
  #endif
  #ifdef __IBandSiteHelper_INTERFACE_DEFINED__
          STRING_RIID(IID_IBandSiteHelper),
  #endif
  #ifdef __IBandProxy_INTERFACE_DEFINED__
          STRING_RIID(IID_IBandProxy),
  #endif
  #ifdef __IBindStatusCallback_INTERFACE_DEFINED__
          STRING_RIID(IID_IBindStatusCallback),
  #endif
  #ifdef __IBrowserBand_INTERFACE_DEFINED__
          STRING_RIID(IID_IBrowserBand),
  #endif
  #ifdef __IBrowserService_INTERFACE_DEFINED__
          STRING_RIID(IID_IBrowserService),
  #endif
  #ifdef __IBrowserService2_INTERFACE_DEFINED__
          STRING_RIID(IID_IBrowserService2),
  #endif
          STRING_RIID(IID_IConnectionPoint),
  #ifdef __IConnectionPointCB_INTERFACE_DEFINED__
          STRING_RIID(IID_IConnectionPointCB),
  #endif
          STRING_RIID(IID_IConnectionPointContainer),
          STRING_RIID(IID_IContextMenu),
          STRING_RIID(IID_IContextMenu2),
  #ifdef __IContextMenuCB_INTERFACE_DEFINED__
          STRING_RIID(IID_IContextMenuCB),
  #endif
  #ifdef __IContextMenuSire_INTERFACE_DEFINED__
          STRING_RIID(IID_IContextMenuSite),
  #endif
          STRING_RIID(IID_IDataObject),
          STRING_RIID(IID_IDeskBand),
          STRING_RIID(IID_IDispatch),
  #ifdef __IDocHostUIHandler_INTERFACE_DEFINED__
          STRING_RIID(IID_IDocHostUIHandler),
  #endif
          STRING_RIID(IID_IDockingWindowFrame),
          STRING_RIID(IID_IDockingWindow),
          STRING_RIID(IID_IDockingWindowSite),
  #ifdef __IDocNavigate_INTERFACE_DEFINED__
          STRING_RIID(IID_IDocNavigate),
  #endif
          STRING_RIID(IID_IDocViewSite),
          STRING_RIID(IID_IDropTarget),
  #ifdef __IDropTargetBackground_INTERFACE_DEFINED__
          STRING_RIID(IID_IDropTargetBackground),
  #endif
  #ifdef __IEFrameAuto_INTERFACE_DEFINED__
          STRING_RIID(IID_IEFrameAuto),
  #endif        
          STRING_RIID(IID_IEnumUnknown),
          STRING_RIID(IID_IErrorInfo),
  #ifdef __IExpDispSupport_INTERFACE_DEFINED__
          STRING_RIID(IID_IExpDispSupport),
  #endif
  #ifdef __IExpDispSupportOC_INTERFACE_DEFINED__
          STRING_RIID(IID_IExpDispSupportOC),
  #endif
  #ifdef __IExplorerToolbar_INTERFACE_DEFINED__
          STRING_RIID(IID_IExplorerToolbar),
  #endif
          STRING_RIID(IID_IExtractIcon),
          STRING_RIID(IID_IExternalConnection),
  #ifdef __FavoriteMenu_INTERFACE_DEFINED__
          STRING_RIID(IID_FavoriteMenu),
  #endif
  #ifdef __IHistSFPrivate_INTERFACE_DEFINED__
          STRING_RIID(IID_IHistSFPrivate),
  #endif
  #ifdef __IHlink_INTERFACE_DEFINED__
          STRING_RIID(IID_IHlink),
  #endif
  #ifdef __IHlinkFrame_INTERFACE_DEFINED__
          STRING_RIID(IID_IHlinkFrame),
  #endif
  #ifdef __IHlinkSite_INTERFACE_DEFINED__
          STRING_RIID(IID_IHlinkSite),
  #endif
  #ifdef __IHlinkTarget_INTERFACE_DEFINED__
          STRING_RIID(IID_IHlinkTarget),
  #endif
  #ifdef __IHttpNegotiate_INTERFACE_DEFINED__
          STRING_RIID(IID_IHttpNegotiate),
  #endif
  #ifdef __IHttpSecurity_INTERFACE_DEFINED__
          STRING_RIID(IID_IHttpSecurity),
  #endif
          STRING_RIID(IID_IInputObject),
          STRING_RIID(IID_IInputObjectSite),
  #ifdef __IIsWebBrowserSB_INTERFACE_DEFINED__
          STRING_RIID(IID_IIsWebBrowserSB),
  #endif
          STRING_RIID(IID_IMenuBand),
  #ifdef __IMRU_INTERFACE_DEFINED__
          STRING_RIID(IID_IMRU),
  #endif
  #ifdef __INavigationStack_INTERFACE_DEFINED__
          STRING_RIID(IID_INavigationStack),
  #endif
  #ifdef __INavigationStackItem_INTERFACE_DEFINED__
          STRING_RIID(IID_INavigationStackItem),
  #endif
          STRING_RIID(IID_INewShortcutHook),
  #ifdef __IObjectCache_INTERFACE_DEFINED__
          STRING_RIID(IID_IObjectCache),
  #endif
  #ifdef __IObjectSafety_INTERFACE_DEFINED__
          STRING_RIID(IID_IObjectSafety),
  #endif
          STRING_RIID(IID_IOleClientSite),
          STRING_RIID(IID_IOleCommandTarget),
          STRING_RIID(IID_IOleContainer),
          STRING_RIID(IID_IOleControl),
          STRING_RIID(IID_IOleControlSite),
          STRING_RIID(IID_IOleDocument),
          STRING_RIID(IID_IOleDocumentSite),
          STRING_RIID(IID_IOleDocumentView),
          STRING_RIID(IID_IOleInPlaceActiveObject),
          STRING_RIID(IID_IOleInPlaceFrame),
          STRING_RIID(IID_IOleInPlaceSite),
          STRING_RIID(IID_IOleInPlaceObject),
          STRING_RIID(IID_IOleInPlaceUIWindow),
          STRING_RIID(IID_IOleObject),
          STRING_RIID(IID_IOleWindow),
          STRING_RIID(IID_IPersist),
          STRING_RIID(IID_IPersistFolder),
  #ifdef __IPersistMoniker_INTERFACE_DEFINED__
          STRING_RIID(IID_IPersistMoniker),
  #endif
          STRING_RIID(IID_IPersistPropertyBag),
          STRING_RIID(IID_IPersistStorage),
          STRING_RIID(IID_IPersistStream),
          STRING_RIID(IID_IPersistStreamInit),
  #ifdef __IPersistString_INTERFACE_DEFINED__
          STRING_RIID(IID_IPersistString),
  #endif
          STRING_RIID(IID_IProvideClassInfo),
          STRING_RIID(IID_IPropertyNotifySink),
          STRING_RIID(IID_IPropertySetStorage),
          STRING_RIID(IID_IPropertyStorage),
  #ifdef __IProxyShellFolder_INTERFACE_DEFINED__
          STRING_RIID(IID_IProxyShellFolder),
  #endif
          STRING_RIID(IID_IServiceProvider),
  #ifdef __ISetWinHandler_INTERFACE_DEFINED__
          STRING_RIID(IID_ISetWinHandler),
  #endif
          STRING_RIID(IID_IShellBrowser),
          STRING_RIID(IID_IShellChangeNotify),
          STRING_RIID(IID_IShellDetails),
  #ifdef __IShellDetails2_INTERFACE_DEFINED__
          STRING_RIID(IID_IShellDetails2),
  #endif
          STRING_RIID(IID_IShellExtInit),
          STRING_RIID(IID_IShellFolder),
          STRING_RIID(IID_IShellIcon),
          STRING_RIID(IID_IShellLink),
          STRING_RIID(IID_IShellLinkDataList),
          STRING_RIID(IID_IShellMenu),
          STRING_RIID(IID_IShellMenuCallback),
          STRING_RIID(IID_IShellPropSheetExt),
  #ifdef __IShellService_INTERFACE_DEFINED__
          STRING_RIID(IID_IShellService),
  #endif
          STRING_RIID(IID_IShellView),
          STRING_RIID(IID_IShellView2),
  #ifdef __ITargetEmbedding_INTERFACE_DEFINED__
          STRING_RIID(IID_ITargetEmbedding),
  #endif
  #ifdef __ITargetFrame2_INTERFACE_DEFINED__
          STRING_RIID(IID_ITargetFrame2),
  #endif
  #ifdef __ITargetFramePriv_INTERFACE_DEFINED__
          STRING_RIID(IID_ITargetFramePriv),
  #endif
          STRING_RIID(IID_ITravelEntry),
          STRING_RIID(IID_ITravelLog),
          STRING_RIID(IID_IUniformResourceLocator),
          STRING_RIID(IID_IUnknown),
          STRING_RIID(IID_IViewObject),
          STRING_RIID(IID_IViewObject2),
          STRING_RIID(IID_IWebBrowser),
          STRING_RIID(IID_IWebBrowser2),
          STRING_RIID(IID_IWebBrowserApp),
  #ifdef __IWinEventHandler_INTERFACE_DEFINED__
          STRING_RIID(IID_IWinEventHandler),
  #endif
  };
  
  struct 
  {
      IID iid;
      TCHAR szGuid[GUIDSTR_MAX];
  } s_guid[50] = {0};
  
  LPCTSTR
  Dbg_GetREFIIDName(
      REFIID riid)
  {
      int i;
  
      // search the known list
      for (i = 0; i < ARRAYSIZE(c_mpriid); i++)
          {
          if (IsEqualIID(riid, c_mpriid[i].riid))
              return c_mpriid[i].psz;
          }
  
      // get a display name for the the first few unknown requests
      for (i = 0; i < ARRAYSIZE(s_guid); i++)
          {
          if (TEXT('{') /*}*/ == s_guid[i].szGuid[0])
              {
              if (IsEqualIID(riid, &s_guid[i].iid))
                  return s_guid[i].szGuid;
              }
          else
              {
              s_guid[i].iid = *riid;
              SHStringFromGUID(riid, s_guid[i].szGuid, ARRAYSIZE(s_guid[0].szGuid));
              return s_guid[i].szGuid;
              }
          }
  
      return TEXT("Unknown REFIID");
  }
  
  //***
  // NOTE
  //  must be called *after* Dbg_GetREFIIDName (since that is what creates entry)
  void *
  Dbg_GetREFIIDAtom(
      REFIID riid)
  {
      int i;
  
      for (i = 0; i < ARRAYSIZE(c_mpriid); i++)
          {
          if (IsEqualIID(riid, c_mpriid[i].riid))
              return (void *) c_mpriid[i].riid;
          }
  
      // get a display name for the the first few unknown requests
      for (i = 0; i < ARRAYSIZE(s_guid); i++)
          {
          if (TEXT('{') /*}*/ == s_guid[i].szGuid[0])
              {
              if (IsEqualIID(riid, &s_guid[i].iid))
                  return (void *) &s_guid[i].iid;
              }
          else
              {
              return NULL;
              }
          }
  
      return NULL;
  }
  
  #endif  // DEBUG
  