this is so called event sink.
void CXXX::InstallScrollEventSink(bool binstall)
{ //true: install scroll event sink to the HTMLWindow2 in the browser control
//false:uninstall scroll event sink
HRESULT hr=-1;
m_hrScrollSink=-1;
if(m_spBrowser!=NULL)
{
hr=m_spBrowser->get_Document((IDispatch**)&m_spDocument);
}
if(SUCCEEDED(hr)&&m_spDocument!=NULL)
{
IHTMLWindow2* phtmlwnd2=NULL;
LPCONNECTIONPOINTCONTAINER pCPC = NULL;
hr=m_spDocument->get_parentWindow(&phtmlwnd2);
if(SUCCEEDED(hr)&&phtmlwnd2!=NULL)
{
hr = phtmlwnd2->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&pCPC);
}
if(SUCCEEDED(hr)&&pCPC!=NULL)
{
hr= pCPC->FindConnectionPoint(DIID_HTMLWindowEvents,&m_pScrollConnPoint);
}
if(SUCCEEDED(hr))
{
if(binstall)
m_hrScrollSink=m_pScrollConnPoint->Advise(this->GetUnknown(),&m_dwScrollSinkCookie);
else
{
m_hrScrollSink = -1;
m_pScrollConnPoint->Unadvise(m_dwScrollSinkCookie);
m_pScrollConnPoint->Release();
}
}
if(pCPC)
pCPC->Release();
if(phtmlwnd2!=NULL)
phtmlwnd2->Release();
}
}
void CXXX::InstallScrollEventSink(bool binstall)
{ //true: install scroll event sink to the HTMLWindow2 in the browser control
//false:uninstall scroll event sink
HRESULT hr=-1;
m_hrScrollSink=-1;
if(m_spBrowser!=NULL)
{
hr=m_spBrowser->get_Document((IDispatch**)&m_spDocument);
}
if(SUCCEEDED(hr)&&m_spDocument!=NULL)
{
IHTMLWindow2* phtmlwnd2=NULL;
LPCONNECTIONPOINTCONTAINER pCPC = NULL;
hr=m_spDocument->get_parentWindow(&phtmlwnd2);
if(SUCCEEDED(hr)&&phtmlwnd2!=NULL)
{
hr = phtmlwnd2->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&pCPC);
}
if(SUCCEEDED(hr)&&pCPC!=NULL)
{
hr= pCPC->FindConnectionPoint(DIID_HTMLWindowEvents,&m_pScrollConnPoint);
}
if(SUCCEEDED(hr))
{
if(binstall)
m_hrScrollSink=m_pScrollConnPoint->Advise(this->GetUnknown(),&m_dwScrollSinkCookie);
else
{
m_hrScrollSink = -1;
m_pScrollConnPoint->Unadvise(m_dwScrollSinkCookie);
m_pScrollConnPoint->Release();
}
}
if(pCPC)
pCPC->Release();
if(phtmlwnd2!=NULL)
phtmlwnd2->Release();
}
}
STDMETHODIMP Invoke(DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS* pDispParams,
VARIANT* pvarResult,
EXCEPINFO* pExcepInfo,
UINT* puArgErr)
{
if (!pDispParams)
return E_INVALIDARG;
switch (dispidMember)
{
case 0x3f6:
OnScrollEvent(); //add a function to handler scroll event.
break;
default:
IDispatchImpl<IRPT2, &IID_IRPT2, &LIBID_ROGRPTVWLib>::Invoke(dispidMember,riid,lcid,wFlags,pDispParams,pvarResult,pExcepInfo,puArgErr);
IDispatchImpl<IRPT2UI, &IID_IRPT2UI, &LIBID_ROGRPTVWLib>::Invoke(dispidMember,riid,lcid,wFlags,pDispParams,pvarResult,pExcepInfo,puArgErr);
IDispEventSimpleImpl<2,CRPT2,&DIID_DWebBrowserEvents>::Invoke(dispidMember,riid,lcid,wFlags,pDispParams,pvarResult,pExcepInfo,puArgErr);
break;
} return S_OK;
}