进行试用
为了进行快速测试,请在 SetSite 中设置一个断点,然后按 F5 启动调试程序。当出现“调试会话的可执行文件”对话框时,选择“默认的 Web 浏览器”,然后单击“确定”。如果 Internet Explorer 不是您的默认浏览器,则可以浏览查找可执行文件。
注意 在 Windows Vista 上,Internet Explorer 的“保护模式”功能将启动另一个进程,然后退出,这样会给调试带来一点难度。您可以通过以下两种方式轻松关闭当前会话的“保护模式”:从管理进程(例如 Visual Studio)启动浏览器,或者创建一个本地 HTML 文件并将其指定为 Internet Explorer 的命令行参数。
浏览器启动时,将加载 BHO 的 DLL。命中断点时,请注意是否设置了 pUnkSite 参数。再次按 F5 以继续加载主页。
关闭浏览器以验证是否通过 NULL 再次调用了 SetSite。
对事件做出响应
既然已经确认了 Internet Explorer 可以加载和运行 BHO,那就让我们在所举示例的基础上再深入一些,将 BHO 扩展到响应浏览器事件。在本部分中,我们介绍如何使用 ATL 为 DocumentComplete(在页面加载后显示一个消息框)实现一个事件处理程序。
为接到事件通知,BHO 建立一个与浏览器之间的连接点;为响应这些事件,它将实现 IDispatch。根据 DocumentComplete 的文档,该事件有两个参数:pDisp(IDispatch 的指针)和 pUrl。这些参数将作为事件的一部分传递给 IDispatch::Invoke;但手动析取这些事件参数并非一项简单的任务,并且易于出错。幸好 ATL 提供了一个默认实现,可以帮助简化这个事件处理逻辑。
HelloWorldBHO.h
首先通过包含 exdispid.h(为浏览器事件定义调度 ID)处理 HelloWorldBHO.h。
#include // DISPID_DOCUMENTCOMPLETE 等。
接下来,从 IDispEventImpl 基类进行派生,该基类为处理事件提供了除 Invoke 之外的另一个简单安全的替代方法。IDispEventImpl 与事件汇映射配合工作,以将事件路由到相应的处理程序函数。我们明确说明,想要使用以下类定义(突出显示)处理由 DWebBrowserEvents2 接口定义的事件。
class ATL_NO_VTABLE CHelloWorldBHO : |
接下来,添加将事件路由到新的 OnDocumentComplete 事件处理程序方法的 ATL 宏,该事件处理程序方法采用的是 DocumentComplete 事件所定义的相同参数和顺序。将以下代码放置到该类的公共部分。
BEGIN_SINK_MAP(CHelloWorldBHO) |
提供给 SINK_ENTRY_EX 宏 (1) 的数字指的是 IDispEventImpl 类定义的第一个参数,在必要时用于区分来自不同接口的事件。另请注意,不能从该事件处理程序返回值;这是因为 Internet Explorer 无论怎样都会忽略从 Invoke 返回的值。
最后,添加一个专用成员变量,以跟踪各对象是否已建立了与浏览器的连接。
private:
BOOL m_fAdvised;
HelloWorldBHO.cpp
要通过事件映射将事件处理程序连接到浏览器,可在处理 SetSite 期间调用 DispEventAdvise。同样,使用 DispEventUnadvise 断开连接。
以下是 SetSite 的新实现:
|
最后,添加一个简单的 OnDocumentComplete 事件处理程序。
|
请注意,消息框会将站点的顶层窗口用作其父窗口,而不仅仅是通过该参数传递 NULL。在 Internet Explorer 6 中,NULL 父窗口并不阻止应用程序,也就是说,在消息框等待用户输入时用户可以继续与浏览器交互。在某些情况下,这会导致浏览器挂起或崩溃。在 BHO 需要显示 UI 的这种少见情况下,应始终通过指定指向父窗口的句柄来确保该对话框为应用程序模态。
| 共5页: 上一页 [1] [2] 3 [4] [5] 下一页 | |||||||
|
|
|||
| · Windows Server 2008 .. · DDoS攻击防御与分析 · 网络钓鱼 · 华为七千人主动辞职规.. · CISSP认证成长之路 · Windows远程桌面应用 · WiMAX、3G、McWill博弈 · 十大正在慢慢死去的IT.. |
· 未来五年可能必备的10.. · VLAN技术 · 802.11n:下一代的无线.. · 龙芯要做中国的“奔腾” · 如何优化IT 控制能耗 · 三层交换技术专题 · 英特尔45纳米Penryn处.. · 拒绝服务攻击DoS专题 |
||
|
|||
| · SQL Server 2005全解 · RAID——磁盘阵列基础 · 三层交换技术专题 · SQL Server入门到精通 · 刀片服务器基础 · Windows远程桌面应用 · C#技术开发指南 · C#技术开发指南 |
· Solaris 10 配置管理 · Cisco IOS · 路由器设置与口令恢复 · Linux集群技术 · Exchange Server专题 · 木马原理与防范 · FreeBSD使用教程 · 多核服务器技术 |
||
|
|||
| · SQL Server入门到精通 · SQL Server 2005全解 · C#技术开发指南 · 刀片服务器基础 · 三层交换技术专题 · C#技术开发指南 · Windows远程桌面应用 · RAID——磁盘阵列基础 |
· 邮件服务器专题 · Sniffer安全技术从入门.. · 常用交换机典型配置 · Linux集群技术 · 路由器设置与口令恢复 · 多核服务器技术 · 网络钓鱼 · Exchange Server专题 |
||
| ·DB2 Viper快速入门 ·DB2 9数据库的镜像分割与.. |
·将XML应用程序从DB2 8.x.. ·DB2 9中的pureXML:如何.. |
| ·服务器中的“傻瓜机”在.. ·盖茨也喜欢登录Youtube看.. |
· · |
| ·VMware ACE 2客户端Licen.. ·为OCS2007配置边缘服务器 |
·Microsoft Office Commun.. ·使用ISA Server 2006发布.. |
| ·秋之银杏林 ·感谢宝贝: 带给我别样人生 |
·我只是你的过客 ·职场冲浪(之十):如果,我.. |
| · 华为七千人主动辞职规避.. · 华为、贝恩资本22亿美元.. · 热门 IT 培训认证官方资.. |
· 网络嗅探教程:为什么要.. · 网络嗅探教程:使用Snif.. · Windows平台的安全问题.. |
| · 测试开发人员参考手册 · BEA会被甲骨文成功收购.. · 程序员如何成长? |
· 解析Ajax开发框架 走进A.. · 基于Google Maps与Ajax.. · 基于Google Maps与Ajax.. |
| · 微软在欧盟反垄断中输掉.. · 热门 IT 培训认证官方资.. · Ubuntu 中文开源频道 |
· IBM虚拟化之路 · 英特尔45纳米处理器被指.. · 铪元素引发CPU革命 英特.. |
| · 甲骨文Oracle 11g正式发.. · Oracle数据库开发之PL/S.. · Oracle数据库开发基础教.. |
· 希捷承认部分硬盘暗藏病.. · 硬盘之父获得诺贝尔物理.. · 存储2006,一个并购的大.. |