IE里的探索之定制浏览器好助手(下)

作者:简简单单 2008-01-18
IE里的探索之定制浏览器好助手(下)
(作者:青苹果工作室编译 2001年02月08日 14:00)
访问文档对象
  现在 BHO 引用了 Internet Explorer 的 WebBrowser 控件并已经连接到浏览器 以接收它产生的事件。在 Web 页面被完全下载并被正确地初始化之后,现在终于可以通过 DHTML 文档对象模型访问它了。WebBrowser 的 Document 属性返回一个指向文档对象的 IDispatch 接口的指针:
  CComPtr pDisp;
  HRESULT hr = m_spWebBrowser2->get_Document(&pDisp);
  get_Document() 方法提供的只是一个指向接口的指针。我们需要确定在 IDispatch 指针后面确实是一个 HTML 文档对象。如果使用 Visual Basic,以下是等价的代码:
  Dim doc As Object
  Set doc = WebBrowser1.Document
  If TypeName(doc)="HTMLDocument" Then
   ' Get the document content and display
  Else
   ' Disable the display dialog
  End If
  现在我们需要判断 get_Document() 返回的 IDispatch 指针的实质。Internet Explorer 不仅是一个 HTML 浏览器,还能处理任何 ActiveX 文档 ;即任何有作为 ActiveX 文档服务程序的应用程序支持的文档。这样一来,就不能保证查看的文档的确是一个 HTML 页面。
  有一个解决办法就是查看 URL 并检查 URL 的扩展名。但该如何处理 Active Server Pages (ASP) 或一个暗含指向 HTML 页面的 URL?如果你使用了像 about 或 res 这样的定制协议又该如何?
  我们决定采取另一种方式,它和上面的 Visual Basic 代码性质相同。这种想法就是,如果 IDispatch 指针确实指向一个 HTML 文档,对 IHTMLDocument2 接口的访问就能成功地返回。IHTMLDocument2 是综合了 DHTML 对象模型为 HTML 页面实现的所用功能的接口。以下代码片断说明如何进行这样的判断:
  CComPtr pDisp;
  HRESULT hr = m_spWebBrowser2->get_Document(&pDisp);
  CComQIPtr spHTML;
  spHTML = pDisp;
  if (spHTML) {
   // 取得文档的内容并显示它
  }
  else {
   // 禁止代码窗口控件
  }
  如果访问 IHTMLDocument2 接口失败,spHTML 指针为 NULL。否则,我们就可以正常访问 DHTML 对象模型的方法和属性了。

相关文章

精彩推荐