本文详细介绍用VisualStudio2005生成浏览器帮助对象(BHO)
检索 HTML document 对象需要两个步骤。即使浏览器已经承载了另一种类型的文档对象(例如 Microsoft Word 文档),get_Document 也要为活动文档检索一个指针,因此,必须查询该活动文档是否有 IHTMLDocument2 接口,以确定它是否确实是 HTML 页面。通过 IHTMLDocument2 接口可以访问 DHTML DOM 的内容。
确认某 HTML 文档已加载后,将该值传递给 RemoveImages。请注意,该参数作为指针(而不是作为 CComPtr)传递给 IHTMLDocument2。
以下是引用片段:
voidCHelloWorldBHO::RemoveImages(IHTMLDocument2*pDocument)
{
CComPtrspImages;
//从DOM中获取图像集。
HRESULThr=pDocument->get_images(&spImages);
if(hr==S_OK&&spImages!=NULL)
{
//获取集合中的图像数。
longcImages=0;
hr=spImages->get_length(&cImages);
if(hr==S_OK&&cImages>0)
{
for(inti=0;i<cImages;i++)
{
CComVariantsvarItemIndex(i);
CComVariantsvarEmpty;
CComPtrspdispImage;
//按索引从集合中获取图像。
hr=spImages->item(svarItemIndex,svarEmpty,&spdispImage);
if(hr==S_OK&&spdispImage!=NULL)
{
//首先,查询通用HTML元素接口……
CComQIPtrspElement=spdispImage;
if(spElement)
{
//……然后请求样式接口。
CComPtrspStyle;
hr=spElement->get_style(&spStyle);
//设置display="none"以隐藏图像。
if(hr==S_OK&&spStyle!=NULL)
{
staticconstCComBSTRsbstrNone(L"none");
spStyle->put_display(sbstrNone);
}
}
}
}
}
}
}使用 C++ 与 DOM 交互要比使用 JavaScript 更繁琐,但代码流在本质上相同。
上述代码将循环访问图像集合中的每个项。在脚本中,很明显就可以看出是按序数还是按名称访问集合元素;但在 C++ 中,则必须通过传递一个空变量来手动区分这些参数。我们要再次依靠 ATL 帮助程序类(这次是 CComVariant)来将我们必须编写的代码量最小化。
最后的注意事项
为便于编写脚本,DOM 中的所有对象都使用 IDispatch 来提供从多个接口派生的属性和方法。但在 C++ 中,则必须要显式查询支持要使用的属性或方法的接口。例如,图像对象同时支持 IHTMLElement 接口和 IHTMLImgElement 接口。因此,要检索图像的 style 对象,首先必须查询 IHTMLElement 接口,该接口可提供 get_style 方法。
另请注意,COM 规则不能保证发生故障时指针的有效性;因此在每次 COM 调用后都需要检查 HRESULT。此外,对于许多 DOM 方法来说,返回 NULL 值并不是错误;因此需要对返回值和指针值都进行仔细检查。为使该检查更安全,应始终预先将指针初始化为 NULL。采用防御性的详细容错编码样式将有助于防止以后发生无法预测的程序错误。
总结
虽然有各种类型的 BHO 用于多种用途,但所有 BHO 都有一个共同特点:与浏览器连接。由于 BHO 可以与 Internet Explorer 紧密集成,因此受到需要扩展浏览器功能的大量开发人员的重视。本文说明了如何创建一个简单 BHO 以用于在加载文档中修改 IMG 元素的样式属性。我们鼓励您根据自己需要将本文中的入门级示例继续延伸。可通过访问以下链接进一步探究这些可能性。
来源:微软 作者:Tony Schreiner,John Sudds 责编:豆豆技术应用
- VC/VC++按钮设计专题
- VC/VC++ 菜单专题
- VC/VC++ 工具条专题
- VC/VC++ 对话框教程
- VC/VC++ 报表教程
- VC/VC++ 控件
- VC/VC++ GDI
- Visual Studio 2008
- VC/VC++ MFC教程
- VC/VC++ QQ
- VC/VC++ Socket编程
- VC/VC++ 钩子编程
- TangramMini组件应用教程
- VC/VC++ 窗体
- VC/VC++ ADO 教程
- Windows CE 教程
- VC/VC++ DLL(动态链接库)编程
- VC/VC++ PDFlib
- VC与MATLAB编程
- VC/VC++ DirectShow 教程
- VC++入门视频教程
- VC/VC++ COM组件设计与应用
- VC/VC++ ATL
- VC/VC++ WTL
- VC/VC++ 定制调试诊断工具和程序
- VC/VC++ 进程
- VC/VC++ Win32
- VC/VC++ WMI
- VC/VC++ 消息
- 更多VC/VC++专题……