我在BHO中拦截BeforeNavigate2事件,
修改了事件的url参数,为什么不能实现地址转向??
部分代码如下:
STDMETHODIMP CAssistMain::Invoke(DISPID dispidMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
if (!pdispparams)
return E_INVALIDARG;
HRESULT hr = S_OK;
switch(dispidMember)
{
/*
 * The parameters for this DISPID are as follows:
 * [0]: Cancel flag - VT_BYREF|VT_BOOL
 * [1]: HTTP headers - VT_BYREF|VT_VARIANT
 * [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT 
 * [3]: Target frame name - VT_BYREF|VT_VARIANT 
 * [4]: Option flags - VT_BYREF|VT_VARIANT
 * [5]: URL to navigate to - VT_BYREF|VT_VARIANT
 * [6]: An object that evaluates to the top-level or frame
 * WebBrowser object corresponding to the event. 
 */
case DISPID_BEFORENAVIGATE2:
{
CComBSTR bstrUrl((*(pdispparams->rgvarg[5].pvarVal)).bstrVal);
CComBSTR bstrNewUrl(_T("http://www.google.com/"));
bstrNewUrl += bstrUrl;
(*(pdispparams->rgvarg[5].pvarVal)).bstrVal = bstrNewUrl.Detach();
}
break; .......
}

解决方案 »

  1.   

    case DISPID_BEFORENAVIGATE2:
    char *str;
    if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
    {
    CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
    varURL.ChangeType(VT_BSTR);
    //转化要访问的网址为char *型
    str = OLE2A(varURL.bstrVal);
    }
      

  2.   

    CComBSTR newURL = L"http://www.google.com/";
    m_spWebBrowser2->Stop();
    m_spWebBrowser2->Navigate(newURL, &pDispParams->rgvarg[4],&pDispParams->rgvarg[3],
    &pDispParams->rgvarg[2],&pDispParams->rgvarg[1]);
      

  3.   

    要cancel之后触发浏览器的Navigate2方法才行