通过Visual Studio 2005生成浏览器帮助程序对象
http://tech.ddvip.com 2008年01月22日 社区交流
内容摘要:本文说明如何使用Visual Studio 2005创建一个简单的“浏览器帮助程序对象”(BHO),即实现IObjectWithSite接口并将其自身附加到Internet Explorer的一种“组件对象模型”(COM)对象。本文逐步说明了如何创建入门级BHO。
操作 DOM
以下 JavaScript 代码演示了 DOM 的基本操作。它通过将图像的样式对象的 display 属性设置为“none”在网页上隐藏图像。
function RemoveImages(doc)
{
var images = doc.images;
if (images != null)
{
for (var i = 0; i < images.length; i++)
{
var img = images.item(i);
img.style.display = "none";
}
}
}
在最后这部分中,我们将说明如何以 C++ 实现这个基本逻辑。
HelloWorldBHO.h
首先打开 HelloWorldBHO.h 并将 mshtml.h 包含在内。该头文件定义了使用 DOM 时所需的接口。
#include // DOM 接口
接下来,定义专用成员方法以包含上述 JavaScript 的 C++ 实现。
private:
void RemoveImages(IHTMLDocument2 *pDocument);
HelloWorldBHO.cpp
现在,OnDocumentComplete 事件处理程序要完成两个新任务。首先,它将缓存处理后的 WebBrowser 指针与激发事件的对象进行比较;如果两者相等,则该事件用于顶层窗口,并且文档也完全加载。其次,它检索一个指向 document 对象的指针并将其传递给 RemoveImages。
void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
{
HRESULT hr = S_OK;
// 查询 IWebBrowser2 接口。
CComQIPtr spTempWebBrowser = pDisp;
// 此事件是否与顶级浏览器相关联?
if (spTempWebBrowser && m_spWebBrowser &&
m_spWebBrowser.IsEqualObject(spTempWebBrowser))
{
// 从浏览器中获取当前文档对象……
CComPtr spDispDoc;
hr = m_spWebBrowser->get_Document(&spDispDoc);
if (SUCCEEDED(hr))
{
// ……并查询 HTML 文档。
CComQIPtr spHTMLDoc = spDispDoc;
if (spHTMLDoc != NULL)
{
// 最后,删除这些图像。
RemoveImages(spHTMLDoc);
}
}
}
}
pDisp 中的 IDispatch 指针包含了已在其中加载文档的窗口或框架的 IWebBrowser2 接口。我们将该值存储在 CComQIPtr 类变量中,该变量将自动执行一个 QueryInterface。接下来,为确定该页面是否已完全加载,我们将该接口指针与顶层浏览器在 SetSite 中进行缓存处理的接口指针进行比较。本测试的结果是,我们仅从顶层浏览器框架的文档中删除了图像;未加载到顶层框架中的文档没有通过本测试。(有关详细信息,请参阅如何确定页面何时在 WebBrowser 控件中完成加载和如何获取 HTML 框架的 WebBrowser 对象模型。)
来源:51CTO 作者:John Sudds 责编:豆豆技术应用