描述:
从Idispatch继承的一个类,实现了invoke,但截取部分事件后IE就被锁住了,不能继续。测试只捕获了5个事件,到beginnagtive就不行了。。
下面是程序:
//ieevent.cpp
#include ".\ieevent.h"
#include "stdio.h"
#include <atlbase.h>
CIEEvent::CIEEvent(/*IWebBrowser2 *pInternetExplorer*/)
: m_pConnectionPoint(NULL)
, m_dwCookie(0)
{
/*IConnectionPointContainer *pCPContainer;
HRESULT hr=pInternetExplorer ->QueryInterface(IID_IConnectionPointContainer,(void **)&pCPContainer);
if (SUCCEEDED(hr))
{
hr=pCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2,&m_pConnectionPoint);
if(SUCCEEDED(hr))
{
hr=m_pConnectionPoint->Advise(this,&m_dwCookie);
if(FAILED(hr))
OutputDebugString("\n连接事件失败!\n");
}
else
OutputDebugString("\n连接事件失败!\n");
}*/
}
CIEEvent::~CIEEvent(void)
{
/*if( m_pConnectionPoint )
{
HRESULT hr= m_pConnectionPoint->Unadvise(m_dwCookie);
if(FAILED(hr))
{
OutputDebugString("\n断开连接失败!\n");
}
}*/
}
HRESULT STDMETHODCALLTYPE CIEEvent::QueryInterface(
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
{
if (!ppvObject)
return E_POINTER;
*ppvObject=NULL;
if(riid == IID_IUnknown)
*ppvObject = static_cast<IUnknown *>(this);
else
if(riid == IID_IDispatch)
*ppvObject = static_cast<IDispatch *>(this);
else
return E_NOINTERFACE;
return S_OK;
}
ULONG STDMETHODCALLTYPE CIEEvent::AddRef( void)
{
return 1;
}
ULONG STDMETHODCALLTYPE CIEEvent::Release( void)
{
return 1;
}
HRESULT STDMETHODCALLTYPE CIEEvent::GetTypeInfoCount(
/* [out] */ UINT *pctinfo)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE CIEEvent::GetTypeInfo(
/* [in] */ UINT iTInfo,
/* [in] */ LCID lcid,
/* [out] */ ITypeInfo **ppTInfo)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE CIEEvent::GetIDsOfNames(
/* [in] */ REFIID riid,
/* [size_is][in] */ LPOLESTR *rgszNames,
/* [in] */ UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ DISPID *rgDispId)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE CIEEvent::Invoke(
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS *pDispParams,
/* [out] */ VARIANT *pVarResult,
/* [out] */ EXCEPINFO *pExcepInfo,
/* [out] */ UINT *puArgErr)
{
/*switch(dispIdMember)
{
case DISPID_NAVIGATECOMPLETE2:
{
IWebBrowser2 *pInternetExplorer;
HRESULT hr=((IDispatch *)(pDispParams->rgvarg[1].lVal))->QueryInterface(IID_IWebBrowser2,(LPVOID *)&pInternetExplorer);
if(SUCCEEDED(hr))
OutputDebugString("ok");
pInternetExplorer->Release();
OutputDebugString("完成");
}
break;
default:
break;
}*/
//if (!dispIdMember)
//return E_INVALIDARG;
ATLTRACE(_T("(%d) DISPID\n"), dispIdMember);
if(dispIdMember==112)
ExitThread(3) ;
return S_OK;
}
int CIEEvent::ConnectEvent(void)
{
return AtlAdvise(m_pInternetExplorer,this,DIID_DWebBrowserEvents2,&m_dwCookie);
}
int CIEEvent::Exit(void)
{
AtlUnadvise(m_pInternetExplorer,DIID_DWebBrowserEvents2,m_dwCookie);
return 0;
}