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