CComPtr<IUnknown> spUnk;HRESULT hr = CExternalUIHandler::_CreatorClass::CreateInstance(NULL, IID_IUnknown, (void**)&spUnk);ATLASSERT(SUCCEEDED(hr));CComQIPtr<IDocHostUIHandlerDispatch> spUI = spUnk;m_wtlBrowserView.SetExternalUIHandler(spUI);
#ifndef _EXTERNALUIHANDLER_H_#define _EXTERNALUIHANDLER_H_#pragma onceclass CExternalDisp:public CComObjectRoot,public IDispatch{public:CExternalDisp(void);~CExternalDisp(void);BEGIN_COM_MAP(CExternalDisp)COM_INTERFACE_ENTRY(IDispatch)END_COM_MAP()virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( /* [out] */ UINT *pctinfo);virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( /* [in] */ UINT iTInfo,/* [in] */ LCID lcid,/* [out] */ ITypeInfo **ppTInfo);virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( /* [in] */ REFIID riid,/* [size_is][in] */ LPOLESTR *rgszNames,/* [in] */ UINT cNames,/* [in] */ LCID lcid,/* [size_is][out] */ DISPID *rgDispId);virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke( /* [in] */ DISPID dispIdMember,/* [in] */ REFIID riid,/* [in] */ LCID lcid,/* [in] */ WORD wFlags,/* [out][in] */ DISPPARAMS *pDispParams,/* [out] */ VARIANT *pVarResult,/* [out] */ EXCEPINFO *pExcepInfo,/* [out] */ UINT *puArgErr) ;};class ATL_NO_VTABLE CExternalUIHandler : public CComObjectRootEx<CComSingleThreadModel>,public CComCoClass<CExternalUIHandler>,public IDispatchImpl<IDocHostUIHandlerDispatch, &__uuidof(IDocHostUIHandlerDispatch)>{public:CComQIPtr<IDispatch> m_spExtDispatch;public:CExternalUIHandler();DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CExternalUIHandler)COM_INTERFACE_ENTRY(IDocHostUIHandlerDispatch)COM_INTERFACE_ENTRY(IDispatch)END_COM_MAP()// IXmnWrapperUIHandlerpublic:// Do not show the context menuSTDMETHOD (ShowContextMenu) ( /* [in] */ DWORD dwID,/* [in] */ DWORD x,/* [in] */ DWORD y,/* [in] */ IUnknown *pcmdtReserved,/* [in] */ IDispatch *pdispReserved,/* [retval][out] */ HRESULT *dwRetVal);// Mark all the other methods as not implementedSTDMETHOD (GetHostInfo) ( /* [out][in] */ DWORD *pdwFlags,/* [out][in] */ DWORD *pdwDoubleClick);STDMETHOD (ShowUI) ( /* [in] */ DWORD dwID,/* [in] */ IUnknown *pActiveObject,/* [in] */ IUnknown *pCommandTarget,/* [in] */ IUnknown *pFrame,/* [in] */ IUnknown *pDoc,/* [retval][out] */ HRESULT *dwRetVal);STDMETHOD (HideUI) (void);STDMETHOD (UpdateUI) (void);STDMETHOD (EnableModeless) ( /* [in] */ VARIANT_BOOL fEnable);STDMETHOD (OnDocWindowActivate) ( /* [in] */ VARIANT_BOOL fActivate);STDMETHOD (OnFrameWindowActivate) ( /* [in] */ VARIANT_BOOL fActivate);STDMETHOD (ResizeBorder) ( /* [in] */ long left,/* [in] */ long top,/* [in] */ long right,/* [in] */ long bottom,/* [in] */ IUnknown *pUIWindow,/* [in] */ VARIANT_BOOL fFrameWindow);STDMETHOD (TranslateAccelerator) ( /* [in] */ DWORD hWnd,/* [in] */ DWORD nMessage,/* [in] */ DWORD wParam,/* [in] */ DWORD lParam,/* [in] */ BSTR bstrGuidCmdGroup,/* [in] */ DWORD nCmdID,/* [retval][out] */ HRESULT *dwRetVal);STDMETHOD (GetOptionKeyPath) ( /* [out] */ BSTR *pbstrKey,/* [in] */ DWORD dw);STDMETHOD (GetDropTarget) ( /* [in] */ IUnknown *pDropTarget,/* [out] */ IUnknown **ppDropTarget);STDMETHOD (GetExternal) ( /* [out] */ IDispatch **ppDispatch);STDMETHOD (TranslateUrl) ( /* [in] */ DWORD dwTranslate,/* [in] */ BSTR bstrURLIn,/* [out] */ BSTR *pbstrURLOut);STDMETHOD (FilterDataObject) ( /* [in] */ IUnknown *pDO,/* [out] */ IUnknown **ppDORet);};#endif //_EXTERNALUIHANDLER_H_
# Include "stdafx. H" # include "externaluihandler. H" # include "dbprivatehistory. H" cexternaldisp: cexternaldisp (void) {}; cexternaldisp ::~ Cexternaldisp (void) {}; hresult stdmethodcalltype cexternaldisp: gettypeinfocount (/* [out] */uint * pctinfo) {return e_notimpl;} hresult stdmethodcalltype cexternaldisp :: gettypeinfo (/* [in] */uint itinfo,/* [in] */lcid,/* [out] */itypeinfo ** pptinfo) {return e_notimpl ;} hresult stdmethodcalltype cexternaldisp: getidsofnames (/* [in] */refiid riid,/* [size_is] [in] */lpolestr * rgsznames ,/*[ In] */uint cnames,/* [in] */lcid,/* [size_is] [out] */dispid * rgdispid) {ccombstr bsname (* rgsznames ); if (bsname = olestr ("deleterowid") {* rgdispid = 2535; return s_ OK;} else if (bsname = olestr ("deletemsgid ")) {* rgdispid = 2537; return s_ OK;} return e_notimpl;} hresult stdmethodcalltype cexternaldisp: invoke (/* [in] */dispid dispidmember, /* [in] */refiid riid,/* [in] */lcid,/* [in] */ Word wflags,/* [out] [in] */dispparams * pdispparams,/* [out] */variant * pvarresult,/* [out] */parameter info * p1_info, /* [out] */uint * puargerr) {// The Order of parameters is from right to left if (dispidmember = 2535) {If (pdispparams-> cargs! = 1) return e_notimpl; If (pdispparams-> rgvarg [0]. VT! = Vt_i4) return e_notimpl; int nrowid = pdispparams-> rgvarg [0]. intval; return s_ OK;} else if (dispidmember = 2537) {If (pdispparams-> cargs! = 1) return e_notimpl; If (pdispparams-> rgvarg [0]. VT! = Vt_bstr) return e_notimpl; // pdispparams-> rgvarg [1]. bstrvalreturn s_ OK;} return e_notimpl ;} //////////////////////////////////////// //// // cexternaluihandler:: cexternaluihandler () {ccomobject <cexternaldisp> * OBJ; ccomobject <cexternaldisp>: createinstance (& OBJ); obj-> QueryInterface (iid_idispatch, (void **) & m_spextdispatch);} // do not show the context menuhresult stdmethodcalltype cexternaluihandler: showcontextmenu (/* [in] */DWORD dwid,/* [in] */dword x, /* [in] */DWORD y,/* [in] */iunknown * pcmdtreserved,/* [in] */idispatch * pdispreserved, /* [retval] [out] */hresult * dwretval) {* dwretval = s_ OK; return s_ OK;} hresult stdmethodcalltype cexternaluihandler :: gethostinfo (/* [out] [in] */DWORD * pdwflags,/* [out] [in] */DWORD * pdwdoubleclick) {return e_notimpl;} hresult stdmethodcalltype cexternaluihandler :: showui (/* [in] */DWORD dwid,/* [in] */iunknown * pactiveobject,/* [in] */iunknown * pcommandtarget, /* [in] */iunknown * pframe,/* [in] */iunknown * pdoc,/* [retval] [out] */hresult * dwretval) {return e_notimpl;} hresult implements cexternaluihandler: hideui (void) {return e_notimpl;} hresult completion failed: updateui (void) {return e_notimpl;} hresult implements cexternaluihandler :: enablemodeless (/* [in] */variant_bool fenable) {return e_notimpl;} hresult implements cexternaluihandler: ondocwindowactivate (/* [in] */variant_bool factivate) {return e_notimpl ;} hresult implements cexternaluihandler: onframewindowactivate (/* [in] */variant_bool factivate) {return e_notimpl;} hresult implements cexternaluihandler: resizeborder (/* [in] */long left, /* [in] */long top,/* [in] */long right,/* [in] */long bottom, /* [in] */iunknown * puiwindow,/* [in] */variant_bool fframewindow) {return e_notimpl;} hresult stdmethodcalltype cexternaluihandler :: translateaccelerator (/* [in] */DWORD hwnd,/* [in] */DWORD nmessage,/* [in] */DWORD wparam, /* [in] */DWORD lparam,/* [in] */BSTR bstrguid1_group,/* [in] */DWORD n1_id, /* [retval] [out] */hresult * dwretval) {return e_notimpl;} hresult stdmethodcalltype cexternaluihandler: getoptionkeypath (/* [out] */BSTR * pbstrkey, /* [in] */dword dw) {return e_notimpl;} hresult stdmethodcalltype cexternaluihandler: getdroptarget (/* [in] */iunknown * pdroptarget, /* [out] */iunknown ** ppdroptarget) {return e_notimpl;} hresult stdmethodcalltype cexternaluihandler: getexternal (/* [out] */idispatch ** ppdispatch) {return m_spextdispatch.copyto (ppdispatch);} hresult stdmethodcalltype cexternaluihandler: translateurl (/* [in] */DWORD dwtranslate,/* [in] */BSTR bstrurlin, /* [out] */BSTR * pbstrurlout) {return e_notimpl;} hresult stdmethodcalltype cexternaluihandler: filterdataobject (/* [in] */iunknown * PDO, /* [out] */iunknown ** ppdoret) {return e_notimpl ;}