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 lcid, /* [out] */ ITypeInfo **ppTInfo){return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE CExternalDisp::GetIDsOfNames( /* [in] */ REFIID riid,/* [size_is][in] */ LPOLESTR *rgszNames,/* [in] */ UINT cNames,/* [in] */ LCID 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 lcid,/* [in] */ WORD wFlags,/* [out][in] */ DISPPARAMS *pDispParams,/* [out] */ VARIANT *pVarResult,/* [out] */ EXCEPINFO *pExcepInfo,/* [out] */ UINT *puArgErr) {//参数顺序为从右向左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 STDMETHODCALLTYPE CExternalUIHandler::HideUI(void){return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE CExternalUIHandler::UpdateUI(void){return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE CExternalUIHandler::EnableModeless( /* [in] */ VARIANT_BOOL fEnable){return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE CExternalUIHandler::OnDocWindowActivate( /* [in] */ VARIANT_BOOL fActivate){return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE CExternalUIHandler::OnFrameWindowActivate( /* [in] */ VARIANT_BOOL fActivate){return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE 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 bstrGuidCmdGroup, /* [in] */ DWORD nCmdID, /* [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;}