CComPtr spUnk; HRESULT hr = CExternalUIHandler::_CreatorClass::CreateInstance(NULL, IID_IUnknown, (void**)&spUnk); ATLASSERT(SUCCEEDED(hr)); CComQIPtr 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 , public CComCoClass , public IDispatchImpl {public: CComQIPtr 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 menu STDMETHOD (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 implemented STDMETHOD (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].bstrVal return S_OK; } return E_NOTIMPL;}//CExternalUIHandler::CExternalUIHandler(){ CComObject *obj; CComObject ::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;}