代码如下所示.在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;
} }
{
IDispatch * pDisp = pDispParams->rgvarg[0].pdispVal; IHTMLEventObj *pEventObj = NULL;
hr = pDisp->QueryInterface( IID_IHTMLEventObj, (void **)&pEventObj );
if ( SUCCEEDED(hr) && pEventObj )
{
VARIANT varValue;
varValue.vt = VT_BOOL;
varValue.boolVal = VARIANT_TRUE; //VARIANT_BOOL bVar;
//pEventObj->get_cancelBubble( &bVar ); pEventObj->put_returnValue( varValue );
pEventObj->put_cancelBubble( VARIANT_TRUE ); pEventObj->Release();
} break;
}
响应的地方有一个参数好像叫EventObj的,得到这个就可以查询的一个IHTMLElement,这个就是你要点击连接
针对IHTMLElementCollection里面的每一个元素都attachEvent