想通过bho把一些特定的访问重定向一下
比如把http://host/xx.jpg换成http://myserver/?url=http://host/xx.jpg 这样的
看了一下bho 里好像截获的都是页面的访问、下载事件
比如把http://host/xx.jpg换成http://myserver/?url=http://host/xx.jpg 这样的
看了一下bho 里好像截获的都是页面的访问、下载事件
BeforeNavigate2中可实现相关替换。
我希望load页面中的元素的时候(img, css,js,ajax request )也触发bho好像没法得到页面元素下载 的通知吧
{ // 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事件的。
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
参考这个吧
http://www.cppblog.com/phenix-burn/archive/2006/08/29/11824.html