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

解决方案 »

  1.   

    the above code add scroll event sink to webbrowser control. you have to implement IDispatch::Invoke to let activex control call you event handler.
    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;
    }