用VisualStudio2005生成浏览器帮助对象(BHO)
2007-03-15 21:46:38 来源:WEB开发网核心提示: 以下是引用片段:classATL_NO_VTABLECHelloWorldBHO:publicCComObjectRootEx,publicCComCoClass,publicIObjectWithSiteImpl,publicIDispatchImpl,publicIDispEventI
以下是引用片段:
classATL_NO_VTABLECHelloWorldBHO:
publicCComObjectRootEx,
publicCComCoClass,
publicIObjectWithSiteImpl,
publicIDispatchImpl,
publicIDispEventImpl<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
voidSTDMETHODCALLTYPEOnDocumentComplete(IDispatch*pDisp,VARIANT*pvarURL);
提供给 SINK_ENTRY_EX 宏 (1) 的数字指的是 IDispEventImpl 类定义的第一个参数,在必要时用于区分来自不同接口的事件。另请注意,不能从该事件处理程序返回值;这是因为 Internet Explorer 无论怎样都会忽略从 Invoke 返回的值。
最后,添加一个专用成员变量,以跟踪各对象是否已建立了与浏览器的连接。
以下是引用片段:
private:
BOOLm_fAdvised;
HelloWorldBHO.cpp
要通过事件映射将事件处理程序连接到浏览器,可在处理 SetSite 期间调用 DispEventAdvise。同样,使用 DispEventUnadvise 断开连接。
以下是 SetSite 的新实现:
以下是引用片段:
STDMETHODIMPCHelloWorldBHO::SetSite(IUnknown*pUnkSite)
{
if(pUnkSite!=NULL)
{
//缓存指向IWebBrowser2的指针。
HRESULThr=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();
}
//调用基类实现。
returnIObjectWithSiteImpl::SetSite(pUnkSite);
}
最后,添加一个简单的 OnDocumentComplete 事件处理程序。
Tags:VisualStudio 生成 浏览器
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接