通过Visual Studio 2005生成浏览器帮助程序对象

http://tech.ddvip.com   2008年01月22日    社区交流

内容摘要:本文说明如何使用Visual Studio 2005创建一个简单的“浏览器帮助程序对象”(BHO),即实现IObjectWithSite接口并将其自身附加到Internet Explorer的一种“组件对象模型”(COM)对象。本文逐步说明了如何创建入门级BHO。

class ATL_NO_VTABLE CHelloWorldBHO :
public CComObjectRootEx,
public CComCoClass,
public IObjectWithSiteImpl,
public IDispatchImpl,
public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>

  接下来,添加将事件路由到新的 OnDocumentComplete 事件处理程序方法的 ATL 宏,该事件处理程序方法采用的是 DocumentComplete 事件所定义的相同参数和顺序。将以下代码放置到该类的公共部分。

BEGIN_SINK_MAP(CHelloWorldBHO)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()
// DWebBrowserEvents2
void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL);

  提供给 SINK_ENTRY_EX 宏 (1) 的数字指的是 IDispEventImpl 类定义的第一个参数,在必要时用于区分来自不同接口的事件。另请注意,不能从该事件处理程序返回值;这是因为 Internet Explorer 无论怎样都会忽略从 Invoke 返回的值。

  最后,添加一个专用成员变量,以跟踪各对象是否已建立了与浏览器的连接。

  private:

  BOOL m_fAdvised;

  HelloWorldBHO.cpp

  要通过事件映射将事件处理程序连接到浏览器,可在处理 SetSite 期间调用 DispEventAdvise。同样,使用 DispEventUnadvise 断开连接。

  以下是 SetSite 的新实现:

STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite)
{
if (pUnkSite != NULL)
{
// 缓存指向 IWebBrowser2 的指针。
HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser);
if (SUCCEEDED(hr))
{
// 注册以从 DWebBrowserEvents2 中汇集事件。
hr = DispEventAdvise(m_spWebBrowser);
if (SUCCEEDED(hr))
{
m_fAdvised = TRUE;
}
}
}
else
{
// 取消注册事件汇。
if (m_fAdvised)
{
DispEventUnadvise(m_spWebBrowser);
m_fAdvised = FALSE;
}
// 在此释放缓存的指针和其他资源。
m_spWebBrowser.Release();
}
// 调用基类实现。
return IObjectWithSiteImpl::SetSite(pUnkSite);
}

  最后,添加一个简单的 OnDocumentComplete 事件处理程序。

来源:51CTO    作者:John Sudds    责编:豆豆技术应用

正在加载评论...