代码如下所示.在DocumentComplete事件里面,对IHTMLDocument2里面的每一个元素都执行了Advise操作,但是,打开网页(如 www.sina.com.cn )之后,点击一个超链接之后,却得到多次OnClick事件.我百思不得其解,请问一下各位高手,这可能是什么方面的问题,应该如何解决?谢谢.STDMETHODIMP BHO::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS* pDispParams, VARIANT* pvarResult,
EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
switch( dispidMember )
{
case DISPID_HTMLELEMENTEVENTS2_ONCLICK:
break; case DISPID_DOCUMENTCOMPLETE:
CComPtr<IDispatch> spDisp;
hResult = m_pWebBrowser2->get_Document(&spDisp);
if (SUCCEEDED( hResult ) && spDisp)
{
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML(spDisp);
if ( spHTML )
{
IHTMLElementCollection* pElemColl = NULL;
if ( SUCCEEDED( spHTML->get_all( &pElemColl ) ) )
{
LONG lItem;
pElemColl->get_length( &lItem );
for( INT iCount = 0; iCount < lItem; iCount ++ )
{
_variant_t index = iCount;
IDispatch * pItemDisp; if ( SUCCEEDED( pElemColl->item(index, index, &pItemDisp) ) )
{
CComPtr<IConnectionPointContainer> pConnPtContainer;
hResult = pItemDisp->QueryInterface(IID_IConnectionPointContainer, (void**)&pConnPtContainer);
if ( SUCCEEDED(hResult) )
{
CComPtr<IConnectionPoint> spConnPt;
hResult = pConnPtContainer->FindConnectionPoint(DIID_HTMLElementEvents2, &spConnPt);
if (SUCCEEDED(hResult) )
{
DWORD newSess;
hResult = spConnPt->Advise((IDispatch*)this, &newSess);
if ( SUCCEEDED(hResult) )
{
}
}
}
pItemDisp->Release();
}
}
}
pElemColl->Release();
}
}
default:
break;
}}
DISPPARAMS* pDispParams, VARIANT* pvarResult,
EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
switch( dispidMember )
{
case DISPID_HTMLELEMENTEVENTS2_ONCLICK:
break; case DISPID_DOCUMENTCOMPLETE:
CComPtr<IDispatch> spDisp;
hResult = m_pWebBrowser2->get_Document(&spDisp);
if (SUCCEEDED( hResult ) && spDisp)
{
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML(spDisp);
if ( spHTML )
{
IHTMLElementCollection* pElemColl = NULL;
if ( SUCCEEDED( spHTML->get_all( &pElemColl ) ) )
{
LONG lItem;
pElemColl->get_length( &lItem );
for( INT iCount = 0; iCount < lItem; iCount ++ )
{
_variant_t index = iCount;
IDispatch * pItemDisp; if ( SUCCEEDED( pElemColl->item(index, index, &pItemDisp) ) )
{
CComPtr<IConnectionPointContainer> pConnPtContainer;
hResult = pItemDisp->QueryInterface(IID_IConnectionPointContainer, (void**)&pConnPtContainer);
if ( SUCCEEDED(hResult) )
{
CComPtr<IConnectionPoint> spConnPt;
hResult = pConnPtContainer->FindConnectionPoint(DIID_HTMLElementEvents2, &spConnPt);
if (SUCCEEDED(hResult) )
{
DWORD newSess;
hResult = spConnPt->Advise((IDispatch*)this, &newSess);
if ( SUCCEEDED(hResult) )
{
}
}
}
pItemDisp->Release();
}
}
}
pElemColl->Release();
}
}
default:
break;
}}
window.event.cancelBubble = true