2010-05-24 85 views
5

我运行一个BHO,我试图用HTMLDocumentEvents2 的onclick事件捉捉使用HTMLDocumentEvents2 OnClick事件然而,事件似乎从未到达处理器问题在BHO

这是我在做什么:

class ATL_NO_VTABLE CBlastBhoBHO : 
    public CComObjectRootEx<CComSingleThreadModel>, 
    public CComCoClass<CBlastBhoBHO, &CLSID_BlastBhoBHO>, 
    public IObjectWithSiteImpl<CBlastBhoBHO>, 
    public IDispatchImpl<IBlastBhoBHO, &IID_IBlastBhoBHO, &LIBID_BlastBhoLib, /*wMajor  =*/ 1, /*wMinor =*/ 0>, 
    public IDispEventImpl<0, CBlastBhoBHO, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 1, 0>, 
    public IDispEventImpl<1, CBlastBhoBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1> 



BEGIN_SINK_MAP(CBlastBhoBHO) 
SINK_ENTRY_EX(0, DIID_HTMLDocumentEvents2, DISPID_HTMLDOCUMENTEVENTS2_ONCLICK, OnClickTrigger) 
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE,  OnDocumentComplete) 
END_SINK_MAP() 


// Handlers 
void STDMETHODCALLTYPE CBlastBhoBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *url) { // works fine } 
void STDMETHODCALLTYPE CBlastBhoBHO::OnClickTrigger(IHTMLEventObj *pEvtObj) { // Never called } 

// From SetSite() 
    ATL::IDispEventSimpleImpl<1,CBlastBhoBHO,&DIID_DWebBrowserEvents2>::DispEventAdvise(m_spWebBrowser); 


// From OnDocumentComplete 
CComQIPtr<IHTMLDocument3> doc_; 
m_spWebBrowser->get_Document((IDispatch**) &doc_); 
ATL::IDispEventSimpleImpl<0,CBlastBhoBHO,&DIID_HTMLDocumentEvents2>::DispEventAdvise(doc_); 

我已经尝试了几个变体(使用HTMLElementEvents2等)或就不同的对象提供建议或对SetSite文档提供建议。我的处理程序从未被调用。

任何帮助将不胜感激。我需要的只是onClick事件。

回答

1

大概是因为LIBID_MSHTML的版本不匹配的, 尝试将其更改为4.0版本,即更改所有

IDispEventImpl<0, CBlastBhoBHO, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 1, 0>

IDispEventImpl<0, CBlastBhoBHO, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 4, 0>

0

试试这个功能 -

VARIANT_BOOL attachEvent(_bstr_t event, IDispatch *pdisp) 

例如: -

MSHTML::IHTMLDocument3Ptr pDoc3 = 0; 
pDoc.QueryInterface(IID_IHTMLDocument3,&pDoc3); 
IDispatchEx evtClick; 

pDoc3->attachEvent(_bstr_t(L"onclick"),&evtClick);