读书人

为什么设置了SetExternalUIHandler然

发布时间: 2013-01-25 15:55:29 作者: rapoo

为什么设置了SetExternalUIHandler,然后SetAmbientDispatch设置的接口的invoke就进不去了。。。也就是说过虑图片过虑不了了
class CDownloadCtrl : public IDispatch
{
public:

。。。。。

STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT *pVarResult, EXCEPINFO * pExcepInfo, UINT * puArgErr)
{
CComVariant varRet;
if (pVarResult)
{
VariantClear(pVarResult);
varRet.Attach(pVarResult);
}
switch (dispIdMember)
{
case DISPID_AMBIENT_DLCONTROL:
varRet = (long)_dwFlags;
pVarResult->vt = VT_I4;
pVarResult->lVal = (long)_dwFlags;
break;
case DISPID_AMBIENT_USERMODE:
// put MSHTML into design mode
varRet = false;
break;
default:
return DISP_E_MEMBERNOTFOUND;
}
if (pVarResult)
varRet.Detach(pVarResult);
return S_OK;
}
};

class CHostUIHandler : public IDocHostUIHandlerDispatch
{
public:
CBrowserView* _view;

CHostUIHandler(CBrowserView* view) : _view(view) {}

// IUnknown methods
STDMETHOD_(ULONG, AddRef)() { return 1; }
STDMETHOD_(ULONG, Release)() { return 1; }
STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppvObj)
{
if (!ppvObj)
return E_POINTER;

*ppvObj = NULL;
if (IsEqualIID(iid, __uuidof(IUnknown)) ||
IsEqualIID(iid, __uuidof(IDispatch)) ||
IsEqualIID(iid, __uuidof(IDocHostUIHandlerDispatch)))
{
*ppvObj = this;
return S_OK;
}
return E_NOINTERFACE;
}

// IDispatch methods
STDMETHOD(GetTypeInfoCount)(UINT * /*pctinfo*/)
{
ATLTRACENOTIMPL(_T("CHostUIHandler::GetTypeInfoCount"));
}
STDMETHOD(GetTypeInfo)(UINT /*iTInfo*/, LCID /*lcid*/, ITypeInfo **ppTInfo)
{
*ppTInfo = NULL;
ATLTRACENOTIMPL(_T("CHostUIHandler::GetTypeInfo"));
}
STDMETHOD(GetIDsOfNames)(REFIID /*riid*/, OLECHAR ** /*rgszNames*/, UINT /*cNames*/, LCID /*lcid*/, DISPID * /*rgDispId*/)
{
ATLTRACENOTIMPL(_T("CHostUIHandler::GetIDsOfNames"));
}
STDMETHOD(Invoke)(DISPID /*dispIdMember*/, REFIID /*riid*/, LCID /*lcid*/, WORD /*wFlags*/,
DISPPARAMS * /*pdispparams*/, VARIANT * /*pVarResult*/, EXCEPINFO * /*pExcepInfo*/, UINT * /*puArgErr*/)
{
ATLTRACENOTIMPL(_T("CHostUIHandler::Invoke"));
}

// IDocHostUIHandlerDispatch methods
STDMETHOD(ShowContextMenu)(DWORD /*dwID*/, DWORD /*x*/, DWORD /*y*/, IUnknown * /*pcmdtReserved*/, IDispatch * /*pdispReserved*/, HRESULT *dwRetVal)
{
*dwRetVal = S_FALSE;
return S_OK;
}
STDMETHOD(GetHostInfo)(DWORD *pdwFlags, DWORD * /*pdwDoubleClick*/)
{
//*pdwFlags = DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME | DOCHOSTUIFLAG_NO3DOUTERBORDER;
const DWORD _DOCHOSTUIFLAG_THEME = 0x40000;
*pdwFlags = DOCHOSTUIFLAG_NO3DBORDER | _DOCHOSTUIFLAG_THEME;
return S_OK;
}
STDMETHOD(ShowUI)(DWORD /*dwID*/, IUnknown * /*pActiveObject*/, IUnknown * /*pCommandTarget*/, IUnknown * /*pFrame*/, IUnknown * /*pDoc*/, HRESULT *dwRetVal)


{
*dwRetVal = S_FALSE;
return S_OK;
}
STDMETHOD(HideUI)(void)
{
return S_OK;
}
STDMETHOD(UpdateUI)(void)
{
return S_OK;
}
STDMETHOD(EnableModeless)(VARIANT_BOOL /*fEnable*/)
{
return S_OK;
}
STDMETHOD(OnDocWindowActivate)(VARIANT_BOOL /*fActivate*/)
{
return S_OK;
}
STDMETHOD(OnFrameWindowActivate)(VARIANT_BOOL /*fActivate*/)
{
return S_OK;
}
STDMETHOD(ResizeBorder)(long /*left*/, long /*top*/, long /*right*/, long /*bottom*/, IUnknown * /*pUIWindow*/, VARIANT_BOOL /*fFrameWindow*/)
{
return S_OK;
}
//#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
//#define CTRL_DOWN() KEY_DOWN(VK_CONTROL)
//#define ALT_DOWN() KEY_DOWN(VK_MENU)
//#define SHIFT_DOWN() KEY_DOWN(VK_SHIFT)
STDMETHOD(TranslateAccelerator)(DWORD_PTR /*hWnd*/, DWORD nMessage, DWORD_PTR wParam, DWORD_PTR /*lParam*/, BSTR /*bstrGuidCmdGroup*/, DWORD /*nCmdID*/, HRESULT *dwRetVal)
{
*dwRetVal = S_FALSE;
return S_OK;
}
STDMETHOD(GetOptionKeyPath)(BSTR *pbstrKey, DWORD /*dw*/)
{
*pbstrKey = NULL;
return E_NOTIMPL;
}
STDMETHOD(GetDropTarget)(IUnknown * /*pDropTarget*/, IUnknown **ppDropTarget)
{
*ppDropTarget = NULL;
return E_NOTIMPL;
}
inline STDMETHOD(GetExternal)(IDispatch **ppDispatch);
STDMETHOD(TranslateUrl)(DWORD /*dwTranslate*/, BSTR /*bstrURLIn*/, BSTR *pbstrURLOut)
{
if(pbstrURLOut == NULL)
return E_POINTER;
*pbstrURLOut = NULL;
return S_FALSE;
}
STDMETHOD(FilterDataObject)(IUnknown * /*pDO*/, IUnknown **ppDORet)
{
if(ppDORet == NULL)
return E_POINTER;
*ppDORet = NULL;
return S_FALSE;
}

};

class CBrowserView : public CWindowImpl<CBrowserView, CAxWindow>,
public IDispEventSimpleImpl<_nDispatchID, CBrowserView, &DIID_DWebBrowserEvents2>
{
public:
。。。

BOOL PreTranslateMessage(MSG* pMsg)
{
if((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) &&
(pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST))
return FALSE;

BOOL bRet = FALSE;
// give HTML page a chance to translate this message
if(pMsg->hwnd == m_hWnd || IsChild(pMsg->hwnd))
bRet = (BOOL)SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);

return bRet;
}

virtual void OnFinalMessage(HWND /*hWnd*/)
{
delete this;
}

。。。。

// Event map and handlers
#ifdef _VC80X
#pragma warning(disable:4867)
#endif
BEGIN_SINK_MAP(CBrowserView)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnEventDocumentComplete, &DocumentComplete2_Info)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_TITLECHANGE, OnEventTitleChange, &TitleChange_Info)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_STATUSTEXTCHANGE, OnEventStatusTextChange, &StatusTextChange_Info)


SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_COMMANDSTATECHANGE, OnEventCommandStateChange, &CommandStateChange_Info)
// add by wfs
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW3, OnEventNewWindow3, &CommandEventNewWindow3_Info)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW2, OnEventNewWindow2, &CommandEventNewWindow2_Info)
SINK_ENTRY_INFO(_nDispatchID, DIID_DWebBrowserEvents2, DISPID_NAVIGATEERROR, OnEventNavigateError, &NavigateError_Info)
END_SINK_MAP()
#ifdef _VC80X
#pragma warning(default:4867)
#endif

。。。

// Message map and handlers
BEGIN_MSG_MAP(CBrowserView)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
END_MSG_MAP()

LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
HRESULT hRet;

// Connect events
CComPtr<IWebBrowser2> spWebBrowser2;
hRet = QueryControl(IID_IWebBrowser2, (void**)&spWebBrowser2);
if(SUCCEEDED(hRet))
{
if(FAILED(DispEventAdvise(spWebBrowser2, &DIID_DWebBrowserEvents2)))
ATLASSERT(FALSE);
}

// add by wfs
CComPtr<IAxWinAmbientDispatchEx> host;
/*HRESULT */hRet = QueryHost(IID_IAxWinAmbientDispatchEx, (void**)&host);
if(SUCCEEDED(hRet))
{
hRet = host->SetAmbientDispatch(&_dlCtrl);
ATLASSERT(SUCCEEDED(hRet));
}

// Set host flag to indicate that we handle themes
//CComPtr<IAxWinAmbientDispatch> spHost;
//hRet = QueryHost(IID_IAxWinAmbientDispatch, (void**)&spHost);
//if(SUCCEEDED(hRet))
//{
//const DWORD _DOCHOSTUIFLAG_THEME = 0x40000;
//hRet = spHost->put_DocHostFlags(DOCHOSTUIFLAG_NO3DBORDER | _DOCHOSTUIFLAG_THEME);
//ATLASSERT(SUCCEEDED(hRet));
//}

hRet = SetExternalUIHandler(&_hostuihandler);////用上面的可以。。。换这个过虑不了图片了
ATLASSERT(SUCCEEDED(hRet));


return lRet;
}



[解决办法]
应该把上面注释的去掉就OK

读书人网 >VC/MFC

热点推荐