case DISPID_BEFORENAVIGATE2:
{
LPOLESTR lpURL = NULL;
mWebBrowser2->get_LocationURL(&lpURL);
char * strurl;
if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
varURL.ChangeType(VT_BSTR);
strurl = OLE2A(varURL.bstrVal);
}
if (strstr(strurl, "163.com") || strstr(strurl, "sohu.com")) 
{
 
*pDispParams->rgvarg[0].pboolVal = TRUE;
        MessageBox(NULL,"当前系统禁止浏览该页","警告",MB_ICONSTOP);
return S_OK;
}
break;
}
这个源码,是网上c++ bho最常见的屏蔽特定网站文章的源码,如何做成 打开 163.com 或者 sohu.com url就跳转到 http://www.csdn.net 呢?

解决方案 »

  1.   


    STDMETHODIMP CBhoApp::Invoke(DISPID dispidMember,REFIID riid,
    LCID lcid,WORD wFlags,
    DISPPARAMS *pDispParams,VARIANT
    *pvarResult, EXCEPINFO *pExcepInfo,
    UINT *puArgErr)
    {
     //在使用ATL字符串转换宏(此处用的是OLE2T)防止编译错误时,必须先调用这个宏
     USES_CONVERSION; if(dispidMember == DISPID_BEFORENAVIGATE2)
     {
      BSTR bstrUrlName;
      HRESULT hr = m_spWebBrowser2->get_LocationURL(&bstrUrlName);
      if(FAILED(hr))
       return hr;  LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
      lstrcpy(psz, OLE2T(bstrUrlName));  //此处,直接比较www.xyz.com,也可从一个要屏蔽的网站列表中进行比较。
      if(stricmp("http://www.xyz.com/",psz) == 0)
      {
       VARIANT vFlags = ,vTargetFrameName = ;   //如果不想显示"空白页",也可重定向至某个表明此网站已被屏蔽的页面。
       m_spWebBrowser2->Navigate(SysAllocString(L"www.csdn.net"),&vFlags,&vTargetFrameName,
    NULL,NULL); //这个设置要跳转的网址
       m_spWebBrowser2->put_Visible(VARIANT_TRUE);
       return S_FALSE;
      }
      return S_OK;
     }
     else if(dispidMember == DISPID_NAVIGATECOMPLETE2)
     //检查以防止页面的post导航加载(post-navigation loading)
     {
      BSTR bstrUrlName;
      HRESULT hr = m_spWebBrowser2->get_LocationURL(&bstrUrlName);
      if(FAILED(hr))
       return hr;  //把文本从Unicode转换为ANSI
      LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
      lstrcpy(psz, OLE2T(bstrUrlName));
      ::OutputDebugString("In Navigate Complete");
      ::OutputDebugString(psz);
      if(stricmp("http://www.xyz.com/",psz) == 0)
      {
       VARIANT vFlags = ,vTargetFrameName = ;
       m_spWebBrowser2->Navigate(SysAllocString(L"www.csdn.net"),
         &vFlags,&vTargetFrameName,
        NULL,NULL); //这里设置要跳转的网址
       m_spWebBrowser2->put_Visible(VARIANT_TRUE);
      }
      return S_OK;
     }
     return S_FALSE;
    }
      

  2.   

    搜索VC COM事件,可以找到不用lnvoke的方法,还有用VB做更方便
      

  3.   

    回:tttydIE卡死了,好像是死循环了,不停的跳一样。
      

  4.   


    你只需要跳转一次就可以了,以下代码就不会死循环
    将DISPID_BEFORENAVIGATE2中的代码注释掉或将DISPID_NAVIGATECOMPLETE2中的代码注释掉STDMETHODIMP CWebFilter::Invoke(DISPID dispidMember,REFIID riid,
    LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT*pvarResult, 
    EXCEPINFO *pExcepInfo,UINT *puArgErr)
    {
    //在使用ATL字符串转换宏(此处用的是OLE2T)防止编译错误时,必须先调用这个宏
    USES_CONVERSION;
    if(dispidMember == DISPID_BEFORENAVIGATE2)
    {
    BSTR bstrUrlName;
    HRESULT hr = m_spWebBrowser2->get_LocationURL(&bstrUrlName);
    if(FAILED(hr))
    return hr;
    LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
    lstrcpy(psz, OLE2T(bstrUrlName));
    //此处,直接比较www.xyz.com,也可从一个要屏蔽的网站列表中进行比较。
    if(stricmp("http://www.baidu.com/",psz) == 0)
    {
    VARIANT vFlags,vTargetFrameName;
    //这里的代码注释掉就不会死循环了。当然也可以注释掉  
                            //DISPID_NAVIGATECOMPLETE2消息中的代码
    // m_spWebBrowser2->Navigate(SysAllocString(L"http://www.csdn.com/"),&vFlags,&vTargetFrameName,
    // NULL,NULL);
    // m_spWebBrowser2->put_Visible(VARIANT_TRUE); return S_FALSE;
    }
    return S_OK;
    }
    else if(dispidMember == DISPID_NAVIGATECOMPLETE2)
    //检查以防止页面的post导航加载(post-navigation loading)
    {
    BSTR bstrUrlName;
    HRESULT hr = m_spWebBrowser2->get_LocationURL(&bstrUrlName);
    if(FAILED(hr))
    return hr;
    //把文本从Unicode转换为ANSI
    LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
    lstrcpy(psz, OLE2T(bstrUrlName));
    ::OutputDebugString("In Navigate Complete");
    ::OutputDebugString(psz);
    if(stricmp("http://www.baidu.com/",psz) == 0)
    {
    VARIANT vFlags,vTargetFrameName;
    m_spWebBrowser2->Navigate(SysAllocString(L"http://www.csdn.com/"),&vFlags,&vTargetFrameName,NULL,NULL);
    m_spWebBrowser2->put_Visible(VARIANT_TRUE);
    }
    return S_OK;
    }
    return S_FALSE;
    }
      

  5.   


    呵呵  搞笑了.不过你没直接问他 也给其他人造福了 MARK