WEB开发网
开发学院软件开发VC 用VisualStudio2005生成浏览器帮助对象(BHO) 阅读

用VisualStudio2005生成浏览器帮助对象(BHO)

 2007-03-15 21:46:38 来源:WEB开发网   
核心提示: 实现基本要素“ATL 项目向导”提供了 SetSite 的默认实现,尽管 IObjectWithSite 的接口合约暗示了此方法可以在必要时被反复调用,用VisualStudio2005生成浏览器帮助对象(BHO)(4),但确切来说,Internet Explore

实现基本要素

“ATL 项目向导”提供了 SetSite 的默认实现。尽管 IObjectWithSite 的接口合约暗示了此方法可以在必要时被反复调用,但确切来说,Internet Explorer 只调用此方法两次;一次用于建立连接,另一次则是在浏览器退出时。特别要提的是,我们 BHO 中的 SetSite 实现将执行以下操作:

•存储对站点的引用。在初始化期间,浏览器将 IUnknown 指针传递给顶层 WebBrowser 控件,然后 BHO 将对它的引用存储在一个专用成员变量中。

•释放目前被占用的站点指针。Internet Explorer 传递 NULL 时,BHO 必须释放所有接口引用并且断开与浏览器的连接。

在处理 SetSite 的过程中,BHO 将根据需要执行其他初始化和非初始化。例如,您可以建立与浏览器的连接点以便接收浏览器事件。

HelloWorldBHO.h

在 Visual Studio 的“解决方案资源管理器”中双击打开 HelloWorldBHO.h。

首先,包含 shlguid.h。此文件定义了 IWebBrowser2 的接口标识符和稍后在项目中使用的事件。

#include // IID_IWebBrowser2、DIID_DWebBrowserEvents2 等。

接下来,在 CHelloWorldBHO 类的公共部分声明 SetSite。

STDMETHOD(SetSite)(IUnknown *pUnkSite);

STDMETHOD 宏是一个将方法标记为虚拟方法并且确保其具有适用于公共 COM 接口的调用约定的 ATL 约定。它有助于区分 COM 接口和该类中可能存在的其他公共方法。实现成员方法时同样也会使用 STDMETHODIMP 宏。

最后,在类声明的专用部分中声明某成员变量以存储浏览器站点。

以下是引用片段:
  private:
  CComPtrm_spWebBrowser;
  HelloWorldBHO.cpp
  现在,切换到HelloWorldBHO.cpp并为SetSite插入以下代码。
  STDMETHODIMPCHelloWorldBHO::SetSite(IUnknown*pUnkSite)
  {
  if(pUnkSite!=NULL)
  {
  //缓存指向IWebBrowser2的指针。
  pUnkSite->QueryInterface(IID_IWebBrowser2,(void**)&m_spWebBrowser);
  }
  else
  {
  //在此释放缓存的指针和其他资源。
  m_spWebBrowser.Release();
  }
  //返回基类实现
  returnIObjectWithSiteImpl::SetSite(pUnkSite);
  }

初始化期间,浏览器将传递一个对其顶层 IWebBrowser2 接口(我们对其进行缓存处理)的引用。非初始化期间,浏览器将传递 NULL。为避免内存泄漏和循环引用计数,此时释放所有指针和资源非常重要。最后,我们调用基类实现以便它可以履行接口合约的其余部分。

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:VisualStudio 生成 浏览器

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接