您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:159 来源:vckbase.com

本文章共11714字,分8页,当前第6页,快速翻页:
 

HRESULT CViewSource::Connect(void)

{

  HRESULT hr;

  CComPtr<IConnectionPoint> spCP;

  //为Web浏览器事件而接收(receive)连接点 

  hr = m_spCPC->FindConnectionPoint(DIID_DWebBrowserEvent2, &spCP);

  if (FAILED(hr))

   return hr;

  // 把事件处理器传递到容器。每次事件发生容器都将激活我们实现的IDispatch接口上的相应的函数。

  hr = spCP->Advise( reinterpret_cast<IDispatch*>(this), &m_dwCookie);

  return hr; 

}

  通过调用接口IConnectionPoint的Advise() 方法, BHO告诉浏览器它对它产生的事件很感兴趣。 由于COM事件处理机制,所有这些意味着BHO把IDispatch接口指针提供给浏览器。浏览器将回调IDispatch接口的Invoke() 方法,以事件的ID值作为第一参数:
逆风编程精品
HRESULT CViewSource::Invoke(DISPID dispidMember, REFIID riid, 

   LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, 

   VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)

{

  if (dispidMember == DISPID_DOCUMENTCOMPLETE) {

      OnDocumentComplete();

      m_bDocumentCompleted = true;

  }

  :

}

  切记,当事件不再需要时,应该使之与浏览器分离。如果你忘记了做这件事情,BHO对象将被锁定,即使在你关闭浏览器窗口之后。很明显,实现分离的最佳时机是收到事件OnQuit时。

十、存取文档对象
  此时,该BHO已经有一个参照指向Internet Explorer的Web浏览器控件并被连接到浏览器控件以接收所有它产生的事件。当网页被全部下载并正确初始化后,我们就可以通过DHTML文档模型存取它。Web浏览器的文档属性返回一个指向文档对象的IDispatch接口的指针:
CComPtr<IDispatch> pDisp;

HRESULT hr = m_spWebBrowser2->get_Document(&pDisp);

  get_Document() 方法取得的仅仅是一个接口指针。我们要进一步确定在IDispatch 指针背后存在一个HTML文档对象。用VB实现的话,可以用下面代码:
Dim doc As Object

Set doc = WebBrowser1.Document

If TypeName(doc)="HTMLDocument" Then

   '' 获取文档内容并予以显示

Else

   '' Disable the display dialog

End If

  现在要了解一下get_Document()返回的IDispatch指针 。Internet Explorer不仅仅是一个HTML浏览器,而且还是一个ActiveX文档容器。 这样一来,难以保证当前浏览对象就是一个HTML文档。不过办法还是有的――你想,如果IDispatch指针真正指向一个HTML文档,查询IHTMLDocument2 接口一定成功。
IHTMLDocument2接口包装了DHTML对象模型用来展现HTML页面的所有功能。下面代码实现这些功能:
CComPtr<IDispatch> pDisp;

HRESULT hr = m_spWebBrowser2->get_Document(&pDisp);

CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML;

spHTML = pDisp;

if (spHTML) {

   // 获取文档内容并予以显示

} 

else {

   // disable the Code Window controls

}

如果IHTMLDocument2接口查询失败,spHTML指针将是NULL。
   现在考虑如何获得当前显示窗口的源代码。正如一个HTML页把它所有的内容封装在标签<BODY>中,DHTML对象模型要求你取得一个指向Body对象的指针:
CComPtr<IHTMLElement> m_pBody;

hr = spHTML->get_body(&m_pBody);

   奇怪的是,DHTML对象模型不让你取得标签<BODY>之前的原始内容,如<HEAD>。其内容被处理并存于一些属性中,但你还是不能从HTML原始文件中提取这部分的RAW文本。这过,仅从BODY部分取得的内容足够了。为了取得包含在<BODY>…</BODY>间的HTML代码部分,可以把outerHTML属性内容读取到一个BSTR变量中:
 
本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 下一页>>
相关文章

使用socket套接字时的两点经验
Visual Basic .NET 中多 Windows 窗体的同步
可以替代系统记事本的程序
论程序设计方法
图形显示特技算法
SQL Server 索引结构及其使用(三)
简单实用的Xml解析类
一个实用的CToolBar扩展类CToolBarEx
定时显示远程计算机的桌面
《系统飞狐》系列软件中的“系统监视器”开
DLL初学者指南(非MFC)
VC中基于 Windows 的精确定时
模拟 Windows 下 CPU 占用率的控件及其实现
自动隐藏停泊窗体实现
Buffer Overruns,portability和其它...
在你的程序中如何使用CButtonST类
QQ2006 界面编程之鸡蛋里挑骨头
用 Web 服务进行二进制序列化和 BinaryForm
DLL头文件的格式和应用
如何在 C# 中加载自己编写的动态链接库

相关评论


本文章所属分类:首页 VC++

  热门关键字: