本文详细介绍用VisualStudio2005生成浏览器帮助对象(BHO)
以下是引用片段:
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 事件处理程序。
来源:微软 作者: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++专题……