2010-05-24 17 views
5

मैं एक BHO ​​चला रहा हूँ और मैं HTMLDocumentEvents2 का उपयोग कर OnClick घटनाओं को पकड़ने के लिए कोशिश कर रहा हूँ में HTMLDocumentEvents2 का उपयोग कर ऑनक्लिक ईवेंट पकड़ने हालांकि, घटनाओं कभी नहीं हैंडलरसमस्या एक 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 आदि का उपयोग करके) या सेटसाइट से दस्तावेज़ पर सलाह देने या विभिन्न वस्तुओं पर सलाह देने की कोशिश की है। मेरा हैंडलर कभी नहीं बुलाया जाता है।

किसी भी मदद की बहुत सराहना की जाएगी। मुझे बस ऑनक्लिक घटना की ज़रूरत है।

उत्तर

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