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 once class 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() // IXmnWrapperUIHandler public: // 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<CExternalDisp> *obj; CComObject<CExternalDisp>::CreateInstance(&obj); obj->QueryInterface(IID_IDispatch, (void**)&m_spExtDispatch); } // Do not show the context menu HRESULT 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; }