Web Browser 的扩展

来源:互联网 发布:立体画图软件 编辑:程序博客网 时间:2024/06/04 19:00



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;}