isdtobj.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 4k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "priv.h"
  2. #include "ishcut.h"
  3. STDMETHODIMP Intshcut::GetData(FORMATETC *pfmtetc, STGMEDIUM *pstgmed)
  4. {
  5.     HRESULT hr;
  6.     ZeroMemory(pstgmed, SIZEOF(*pstgmed));
  7.     if (pfmtetc->cfFormat == g_cfURL)
  8.         hr = TransferUniformResourceLocator(pfmtetc, pstgmed);
  9.     else if (pfmtetc->cfFormat == CF_TEXT)
  10.         hr = TransferText(pfmtetc, pstgmed);
  11.     else if (pfmtetc->cfFormat == g_cfFileDescA)
  12.         hr = TransferFileGroupDescriptorA(pfmtetc, pstgmed);
  13.     else if (pfmtetc->cfFormat == g_cfFileDescW)
  14.         hr = TransferFileGroupDescriptorW(pfmtetc, pstgmed);
  15.     else if (pfmtetc->cfFormat == g_cfFileContents)
  16.         hr = TransferFileContents(pfmtetc, pstgmed);
  17.     else
  18.         hr = DV_E_FORMATETC;
  19.     return hr;
  20. }
  21. STDMETHODIMP Intshcut::GetDataHere(FORMATETC *pfmtetc, STGMEDIUM *pstgpmed)
  22. {
  23.     return E_NOTIMPL;
  24. }
  25. STDMETHODIMP Intshcut::QueryGetData(FORMATETC *pfmtetc)
  26. {
  27.     HRESULT hr;
  28.     if ((pfmtetc->cfFormat == g_cfURL) ||
  29.         (pfmtetc->cfFormat == CF_TEXT) ||
  30.         (pfmtetc->cfFormat == g_cfFileDescA) ||
  31.         (pfmtetc->cfFormat == g_cfFileDescW))
  32.     {
  33.         hr = (pfmtetc->tymed & TYMED_HGLOBAL) ? S_OK : DV_E_TYMED;
  34.     }
  35.     else if (pfmtetc->cfFormat == g_cfFileContents)
  36.     {
  37.         if (pfmtetc->dwAspect == DVASPECT_COPY)
  38.             hr = (pfmtetc->tymed & TYMED_ISTREAM) ? S_OK : DV_E_TYMED;
  39.         else if ((pfmtetc->dwAspect == DVASPECT_CONTENT) || 
  40.                  (pfmtetc->dwAspect == DVASPECT_LINK))
  41.             hr = (pfmtetc->tymed & TYMED_HGLOBAL) ? S_OK : DV_E_TYMED;
  42.         else
  43.             hr = DV_E_FORMATETC;
  44.     }
  45.     else
  46.         hr = DV_E_FORMATETC;
  47.     return hr;
  48. }
  49. STDMETHODIMP Intshcut::GetCanonicalFormatEtc(FORMATETC *pfmtetcIn, FORMATETC *pfmtetcOut)
  50. {
  51.     HRESULT hr = QueryGetData(pfmtetcIn);
  52.     if (hr == S_OK)
  53.     {
  54.         *pfmtetcOut = *pfmtetcIn;
  55.         if (pfmtetcIn->ptd == NULL)
  56.             hr = DATA_S_SAMEFORMATETC;
  57.         else
  58.         {
  59.             pfmtetcIn->ptd = NULL;
  60.             ASSERT(hr == S_OK);
  61.         }
  62.     }
  63.     else
  64.         ZeroMemory(pfmtetcOut, SIZEOF(*pfmtetcOut));
  65.     return hr;
  66. }
  67. STDMETHODIMP Intshcut::SetData(FORMATETC *pfmtetc, STGMEDIUM *pstgmed, BOOL bRelease)
  68. {
  69.     return DV_E_FORMATETC;
  70. }
  71. STDMETHODIMP Intshcut::EnumFormatEtc(DWORD dwDirFlags, IEnumFORMATETC **ppiefe)
  72. {
  73.     if (dwDirFlags == DATADIR_GET)
  74.     {
  75.         FORMATETC rgfmtetc[] =
  76.         {
  77.             // the order here defines the accuarcy of rendering
  78.             { g_cfFileContents, NULL, DVASPECT_LINK,  0, TYMED_HGLOBAL },
  79.             { g_cfFileDescW,    NULL, DVASPECT_LINK, -1, TYMED_HGLOBAL },
  80.             { g_cfFileDescA,    NULL, DVASPECT_LINK, -1, TYMED_HGLOBAL },
  81.             { g_cfFileContents, NULL, DVASPECT_COPY,  0, TYMED_ISTREAM },
  82.             { g_cfFileDescW,    NULL, DVASPECT_COPY, -1, TYMED_HGLOBAL },
  83.             { g_cfFileDescA,    NULL, DVASPECT_COPY, -1, TYMED_HGLOBAL },
  84.             { g_cfFileContents, NULL, DVASPECT_CONTENT,  0, TYMED_HGLOBAL },
  85.             { g_cfFileDescW,    NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL },
  86.             { g_cfFileDescA,    NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL },
  87.             { g_cfURL,          NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL },
  88.             { CF_TEXT,          NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL },
  89.         };
  90.         return SHCreateStdEnumFmtEtc(ARRAYSIZE(rgfmtetc), rgfmtetc, ppiefe);
  91.     }
  92.     *ppiefe = NULL;
  93.     return E_NOTIMPL;
  94. }
  95. STDMETHODIMP Intshcut::DAdvise(FORMATETC *pfmtetc, DWORD dwAdviseFlags, IAdviseSink *piadvsink, DWORD *pdwConnection)
  96. {
  97.     *pdwConnection = 0;
  98.     return OLE_E_ADVISENOTSUPPORTED;
  99. }
  100. STDMETHODIMP Intshcut::DUnadvise( DWORD dwConnection)
  101. {
  102.     return OLE_E_ADVISENOTSUPPORTED;
  103. }
  104. STDMETHODIMP Intshcut::EnumDAdvise(IEnumSTATDATA **ppiesd)
  105. {
  106.     *ppiesd = NULL;
  107.     return OLE_E_ADVISENOTSUPPORTED;
  108. }