想通过bho把一些特定的访问重定向一下
比如把http://host/xx.jpg换成http://myserver/?url=http://host/xx.jpg 这样的
看了一下bho 里好像截获的都是页面的访问、下载事件 

解决方案 »

  1.   

    接收器实现BeforeNavigate2事件,然后把接收器advise到webbrowser的DWebBrowserEvents2连接点中。
    BeforeNavigate2中可实现相关替换。
      

  2.   

    这个BeforeNavigate2不是页面跳转的时候才触发吗?
    我希望load页面中的元素的时候(img, css,js,ajax request )也触发bho好像没法得到页面元素下载 的通知吧
      

  3.   

      HRESULT STDMETHODCALLTYPE SetSite(IUnknown* iunk)
      { // This is called by IE to plug us into the current web window
        release();
        iunk->QueryInterface(IID_IWebBrowser2, (void**)&webBrowser);
        IConnectionPointContainer *cpc=0; iunk->QueryInterface(IID_IConnectionPointContainer, (void**)&cpc);
        IConnectionPoint* cp=0; if (cpc) cpc->FindConnectionPoint(DIID_DWebBrowserEvents2, &cp);
        DWORD cookie; HRESULT hr; if (cp) hr=cp->Advise(static_cast<IDispatch*>(this), &cookie);
        if (!webBrowser || !cpc || !cp || hr!=S_OK) {if (cp) cp->Release(); if (cpc) cpc->Release(); release(); return E_FAIL;}
        return S_OK;
      }
    BHO对象实现IDispatch接口
      HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr)
    {     if (dispIdMember==BeforeNavigate2){
             //实现url替换
         }
    }
    并不是实现了BHO,就不能实现相关事件的接收器。你完全可以在一个对象中既实现BHO的IObjectWithSite接口,也实现相关事件的接收器。页面内部获取img, css,js时,都会触发BeforeNavigate2事件的。
      

  4.   

    奇怪。我的bho在访问google.cn时只有两次beforenavigate2
    STDMETHODIMP CTester::Invoke(DISPID dispidMember,REFIID riid, LCID lcid, 
      WORD wFlags, DISPPARAMS * pDispParams, 
      VARIANT * pvarResult,EXCEPINFO * pexcepinfo, 
      UINT * puArgErr)

    USES_CONVERSION;

    if (!pDispParams)
    return E_INVALIDARG;

    switch (dispidMember)
    { case DISPID_BEFORENAVIGATE2:
    {
    LPOLESTR lpURL = NULL;
    mWebBrowser2->get_LocationURL(&lpURL);
    char * strurl;
    ATLTRACE("visit: %d\n", pDispParams->cArgs);
    if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
    {
    //*pDispParams->rgvarg[1].pvarVal = CComVariant("http://www.baidu.com");
    CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
    varURL.ChangeType(VT_BSTR);
    strurl = OLE2A(varURL.bstrVal);
    ATLTRACE("visit: %s\n", strurl);
    }
    break;
    }

    case DISPID_NEWWINDOW2:
    break;
    case DISPID_QUIT:
    RegisterEventHandler(FALSE);
    break;
    default:
    break;
    }

    return S_OK;
    }visit: 7
    visit: http://www.google.com.hk/
    visit: 7
    visit: http://www.google.com.hk/compressiontest/gzip.html
      

  5.   

    http://hi.baidu.com/adoblog/blog/item/1e61c4120143f7cdc2fd7850.html
    参考这个吧
      

  6.   

    还有这个
    http://www.cppblog.com/phenix-burn/archive/2006/08/29/11824.html