SMHOLE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  *  S M H O L E . C
  3.  *
  4.  *  Sample mail handling hook OLE storage support for RICHEDIT
  5.  *  Copyright 1992-95 Microsoft Corporation.  All Rights Reserved.
  6.  */
  7. #include "_pch.h"
  8. DEFINE_OLEGUID(IID_IRichEditOleCallback, 0x00020D03, 0, 0);
  9. const REOC_Vtbl vtblREOC =
  10. {
  11.     REOC_QueryInterface,
  12.     REOC_AddRef,
  13.     REOC_Release,
  14.     REOC_GetNewStorage,
  15.     REOC_GetInPlaceContext,
  16.     REOC_ShowContainerUI,
  17.     REOC_QueryInsertObject,
  18.     REOC_DeleteObject,
  19.     REOC_QueryAcceptData,
  20.     REOC_ContextSensitiveHelp,
  21.     REOC_GetClipboardData,
  22.     REOC_GetDragDropEffect,
  23.     REOC_GetContextMenu
  24. };
  25. /*
  26.  *  SMH Object Methods
  27.  *
  28.  *  SMH_QueryInterface      (See OLE IUnknown object methods)
  29.  *  SMH_AddRef              (See OLE IUnknown object methods)
  30.  *  SMH_Release             (See OLE IUnknown object methods)
  31.  *  SMH_InboundMsgHook      Filters inbound messages
  32.  *  SMH_OutboundMsgHook     Filters sent mail messages
  33.  *
  34.  */
  35. STDMETHODIMP
  36. REOC_QueryInterface (LPREOC lpreoc, REFIID lpiid, LPVOID FAR * lppv)
  37. {
  38.     if (!memcmp (lpiid, &IID_IRichEditOleCallback, sizeof(IID)) ||
  39.         !memcmp (lpiid, &IID_IUnknown, sizeof(IID)))
  40.     {
  41.         *lppv = (LPVOID)lpreoc;
  42.         lpreoc->lcInit++;
  43.         return hrSuccess;
  44.     }
  45.     DebugTraceSc (SMH_QueryInterface(), MAPI_E_INTERFACE_NOT_SUPPORTED);
  46.     return ResultFromScode (MAPI_E_INTERFACE_NOT_SUPPORTED);
  47. }
  48. STDMETHODIMP_(ULONG)
  49. REOC_AddRef (LPREOC lpreoc)
  50. {
  51.     return ++lpreoc->lcInit;
  52. }
  53. STDMETHODIMP_(ULONG)
  54. REOC_Release (LPREOC lpreoc)
  55. {
  56.     if (--lpreoc->lcInit)
  57.         return lpreoc->lcInit;
  58.     UlRelease (lpreoc->lpstg);
  59.     (*lpreoc->lpfnFree) (lpreoc);
  60.     return 0;
  61. }
  62. STDMETHODIMP
  63. REOC_GetNewStorage (LPREOC lpreoc, LPSTORAGE FAR * lppstg)
  64. {
  65.     HRESULT hr = hrSuccess;
  66.     LPSTORAGE lpstg = lpreoc->lpstg;
  67. #ifdef  _WIN32
  68.     WCHAR rgch[MAX_PATH];
  69.     wsprintfW (rgch, L"SMHOBJ%08ld", lpreoc->cSub++);
  70. #else
  71.     CHAR rgch[MAX_PATH];
  72.     wsprintf (rgch, "SMHOBJ%08ld", lpreoc->cSub++);
  73. #endif  // WIN16
  74.     if (lpstg)
  75.     {
  76.         lpstg->lpVtbl->CreateStorage (lpstg,
  77.                             rgch,
  78.                             STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_EXCLUSIVE,
  79.                             0,
  80.                             0,
  81.                             lppstg);
  82.         if (HR_FAILED (hr))
  83.             *lppstg = NULL;
  84.     }
  85.     DebugTraceResult (REOC_GetNewStorage(), hr);
  86.     return hr;
  87. }
  88. STDMETHODIMP
  89. REOC_GetInPlaceContext (LPREOC lpreoc,
  90.    LPOLEINPLACEFRAME FAR * lppipframe,
  91.    LPOLEINPLACEUIWINDOW FAR * lppipuiDoc,
  92.    LPOLEINPLACEFRAMEINFO lpipfinfo)
  93. {
  94.     return ResultFromScode (E_NOTIMPL);
  95. }
  96. STDMETHODIMP
  97. REOC_ShowContainerUI (LPREOC lpreoc, BOOL fShow)
  98. {
  99.     return ResultFromScode (E_NOTIMPL);
  100. }
  101. STDMETHODIMP
  102. REOC_QueryInsertObject (LPREOC lpreoc, LPCLSID pclsid, LPSTORAGE pstg, LONG cp)
  103. {
  104.     return hrSuccess;
  105. }
  106. STDMETHODIMP
  107. REOC_DeleteObject (LPREOC lpreoc, LPOLEOBJECT lpoleobj)
  108. {
  109.     return hrSuccess;
  110. }
  111. STDMETHODIMP
  112. REOC_QueryAcceptData (LPREOC lpreoc,
  113.     LPDATAOBJECT lpdataobj,
  114.     CLIPFORMAT FAR * lpcfFormat,
  115.     DWORD reco,
  116.     BOOL fReally,
  117.     HGLOBAL hMetaPict)
  118. {
  119.     return hrSuccess;
  120. }
  121. STDMETHODIMP
  122. REOC_ContextSensitiveHelp (LPREOC lpreoc, BOOL fEnterMode)
  123. {
  124.     return hrSuccess;
  125. }
  126. STDMETHODIMP
  127. REOC_GetClipboardData (LPREOC lpreoc,
  128.     CHARRANGE FAR * lpchrg,
  129.     DWORD reco,
  130.     LPDATAOBJECT FAR * lppdataobj)
  131. {
  132.     return ResultFromScode (E_NOTIMPL);
  133. }
  134. STDMETHODIMP
  135. REOC_GetDragDropEffect (LPREOC lpreoc,
  136.     BOOL fDrag,
  137.     DWORD grfKeyState,
  138.     LPDWORD lpdwEffect)
  139. {
  140.     return ResultFromScode (E_NOTIMPL);
  141. }
  142. STDMETHODIMP
  143. REOC_GetContextMenu (LPREOC lpreoc,
  144.     WORD seltype,
  145.     LPOLEOBJECT lpoleobj,
  146.     CHARRANGE FAR * lpchrg,
  147.     HMENU FAR * lphmenu)
  148. {
  149.     if (lpreoc->lpfb && (*lphmenu = CreatePopupMenu()))
  150.     {
  151.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Bullet, "Bullet Paragraph");
  152.         AppendMenu (*lphmenu, MF_SEPARATOR, 0, NULL);
  153.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Indent, "Increase Indent");
  154.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Collapse, "Decrease Indent");
  155.         AppendMenu (*lphmenu, MF_SEPARATOR, 0, NULL);
  156.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Left, "Align Left");
  157.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Center, "Align Center");
  158.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Right, "Align Right");
  159.         if (lpreoc->lpfb->pf.wNumbering == PFN_BULLET)
  160.             CheckMenuItem (*lphmenu, ID_Bullet, MF_BYCOMMAND | MF_CHECKED);
  161.         if (lpreoc->lpfb->pf.dxStartIndent > 1440)
  162.             EnableMenuItem (*lphmenu, ID_Indent, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
  163.         if (!lpreoc->lpfb->pf.dxStartIndent)
  164.             EnableMenuItem (*lphmenu, ID_Collapse, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
  165.         return hrSuccess;
  166.     }
  167.     return ResultFromScode (E_NOTIMPL);
  168. }
  169. STDMETHODIMP_(SCODE)
  170. ScNewRicheditCallback (LPFORMATBAR lpfb,
  171.     LPALLOCATEBUFFER lpfnAlloc,
  172.     LPALLOCATEMORE lpfnAllocMore,
  173.     LPFREEBUFFER lpfnFree,
  174.     LPREOC FAR * lppreoc)
  175. {
  176.     SCODE sc;
  177.     LPREOC lpreoc = NULL;
  178.     if (!FAILED (sc = (*lpfnAlloc) (sizeof(REOC), &lpreoc)))
  179.     {
  180.         memset (lpreoc, 0, sizeof (REOC));
  181.         lpreoc->lpVtbl = (REOC_Vtbl FAR *)&vtblREOC;
  182.         lpreoc->lcInit = 1;
  183.         lpreoc->cSub = 0;
  184.         lpreoc->lpfnAlloc = lpfnAlloc;
  185.         lpreoc->lpfnAllocMore = lpfnAllocMore;
  186.         lpreoc->lpfnFree = lpfnFree;
  187.         lpreoc->lpfb = lpfb;
  188.         sc = GetScode (StgCreateDocfile (NULL,
  189.                                 STGM_READWRITE           |
  190.                                     STGM_TRANSACTED      |
  191.                                     STGM_DELETEONRELEASE |
  192.                                     STGM_SHARE_EXCLUSIVE,
  193.                                 0,
  194.                                 &lpreoc->lpstg));
  195.         if (FAILED (sc))
  196.         {
  197.             (*lpfnFree) (lpreoc);
  198.             lpreoc = NULL;
  199.         }
  200.     }
  201.     *lppreoc = lpreoc;
  202.     DebugTraceSc (ScNewRicheditCallback(), sc);
  203.     return sc;
  204. }