让你的浏览器更强!过滤FLASH、控件等等

类别:VC语言 点击:0 评论:0 推荐:

(本文涉及IE\Internet Explorer\WebBrowser2\CHtmlView\name space)

商业网站的广告越做越大。新浪网的巨幅FLASH广告居然充满了整个屏幕!

广大网民上网可受不了这个.....小猫怎么会受得了FLASH的蹂躏~

怎么办呢?一般来说,IE控件可以禁用图片、视频、声音和控件

禁止控件自然就禁止了FLASH,但这样将使浏览器失去大不分功能,不于考虑。

那么过滤整个机器的URL可不可以呢?

可以,但那样底层的操作不是一步两步能实现的,另外....对整个系统以及浏览器的稳定性有较大影响。

也许你会说,做一个127.0.0.1的代理服务器过滤FLASH,再让给自己的浏览器使用该代理。结果会和上面一样,稳定性不好,还可能会和浏览器自身的代理发生冲突。

到底怎么做?呵呵~正题来了!首先感谢畅游的帮助。

利用name space!

下面就说在自编浏览器里的具体实现:(如果你想了解name space的更多内容请访问MSDN网站搜索"name space"关键字)

首先,给你的自编浏览器填加一个ATL类,填加之后CLASS向导会自动给你的工程加一个modul,这些我们都不必理会。

假设所填加的类叫:IAUrl

之后你要做的就是给类填加IInternetProtocolInfo和IInternetProtocol两个接口的实现。并加一个IInternetProtocolSink* m_pProtSink;成员变量。

 

下面要做的很简单:

找到IAUrl的Start函数(实现上面两个接口后回自动出现该函数)

实现如下代码:

STDMETHODIMP IAUrl::Start(
        LPCWSTR szUrl,
        IInternetProtocolSink *pIProtSink,
        IInternetBindInfo *pIBindInfo,
        DWORD grfSTI,
        DWORD dwReserved)
{
 // 检查URL请求的最后4个字符是否为.swf,是的话,就过滤掉

 CString s(szUrl);
 if(s.Right(4)==".swf")
 {
  m_pProtSink = pIProtSink;
  m_pProtSink->AddRef();
  m_pProtSink->ReportResult(S_OK, 0, 0);
  m_pProtSink->Release();
  return S_OK;
 }
 return INET_E_USE_DEFAULT_PROTOCOLHANDLER;
}   

 

针对IAUrl类的工作结束了。下面在你的窗口类里调用IIAUrl接口

给CMainFrame增加2个成员变量:

 IInternetSession* m_pSession;
 IClassFactory* m_pFactory;

然后在程序初始阶段(比如OnCreate里面)

 //注册name space

HRESULT hr = CoGetClassObject(CLSID_IAUrl, CLSCTX_SERVER, NULL, IID_IClassFactory, (void**)&m_pFactory);
 if(hr==S_OK)
 {
  if(CoInternetGetSession(0, &m_pSession, 0)==S_OK)
   m_pSession->RegisterNameSpace(m_pFactory, CLSID_IAUrl, L"http", 0, NULL, 0);
 }

在程序结束的时候

 //注销name space

 if(m_pSession!=NULL)
 {
  m_pSession->UnregisterNameSpace(m_pFactory, L"http");
  m_pSession->Release();
 }
 if(m_pFactory!=NULL)
  m_pFactory->Release();

 }

OK,搞定了,现在你的浏览器可以过滤FLASH了,嘿!效果真不错!

下载IAUrl类原代码:(3KB)

http://263.csdn.net/FileBBS/files/2001_10/T_726_1.zip

 

    

本文地址:http://com.8s8s.com/it/it2961.htm