六、构造自己的BHO对象
一个BHO对象就是一个进程中服务器DLL,选用ATL创建它是再恰当不过的了。我们选择ATL的另外一个原因是因为它已经提供了缺省的而且提供了IObjectWithSite接口的足够好的实现。另外,在ATL COM 向导本地支持的已定义好的对象类型当中,有一个,就是Internet Explorer对象,这正是一个BHO应该具有的类型。一个 ATL Internet Explorer 对象,事实上是一个简单对象――也就是说,是一个支持IUnknown和自注册,还有接口IObjectWithSite的COM 服务器。如果你在ATL工程中添加一个这样的对象,并调用相应的类CViewSource,你将从向导中得到下列代码:
class ATL_NO_VTABLE CViewSource :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CViewSource, &CLSID_ViewSource>,
public IObjectWithSiteImpl<CViewSource>,
public IDispatchImpl<IViewSource, &IID_IViewSource,
&LIBID_HTMLEDITLib>
正如你所见,向导已经使类从接口IObjectWithSiteImpl继承,这是一个ATL模板类,它提供了接口IObjectWithSite的基本实现。一般情况下,没有必要重载成员函数GetSite()。取而代之的是, SetSite() 实现代码经常需要加以定制。ATL实际上仅仅把一个IUnknown接口指针存储在成员变量m_spUnkSite中。
在文章的剩余部分,我将讨论一个 BHO 的相当复杂而丰富的例子。该BHO对象将依附于Internet Explorer,并显示一个文本框来显示当前正浏览的网页源码。 该代码窗口将 随着你改变网页而自动更新,如果浏览器显示的不是一个HTML网页时,它将变灰。你对于原始HTML代码的任何改动立即反映在浏览器中。HTML (DHTML)使得这一看似魔术般的实现成为可能。该代码窗口可被隐藏和通过按动热键重现。 在可见情况下,它与Internet Explorer共享整个桌面空间,见图三。
点击查看大图
图三 BHO对象在使用中。它依附于Internet Explorer,并显示一个窗口来显示当前正浏览的网页源码。还允许你源码进行修改。
本例子的关键点在于存取Internet Explorer的浏览机制,其实它只不过是WebBrowser控件的一个实例而已。这个例子可以分解为以下五步来实现:
探测谁在装入这个对象,是Internet Explorer还是Windows资源管理器;
获取接口IWebBrowser2以实现Web浏览器对象;
捕捉Web浏览器的特定事件;
存取当前文档对象,确定它是一份HTML类型的文件;
管理对话框窗口以实现HTML源码的显示;
第一个步骤是在DllMain()中完成的。SetSite()是取得指向WebBrowser对象指针的适当位置。请详细分析以下步骤。
更多内容请看浏览器安全隐患及对策专题,或进入讨论组讨论。
一个BHO对象就是一个进程中服务器DLL,选用ATL创建它是再恰当不过的了。我们选择ATL的另外一个原因是因为它已经提供了缺省的而且提供了IObjectWithSite接口的足够好的实现。另外,在ATL COM 向导本地支持的已定义好的对象类型当中,有一个,就是Internet Explorer对象,这正是一个BHO应该具有的类型。一个 ATL Internet Explorer 对象,事实上是一个简单对象――也就是说,是一个支持IUnknown和自注册,还有接口IObjectWithSite的COM 服务器。如果你在ATL工程中添加一个这样的对象,并调用相应的类CViewSource,你将从向导中得到下列代码:
class ATL_NO_VTABLE CViewSource :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CViewSource, &CLSID_ViewSource>,
public IObjectWithSiteImpl<CViewSource>,
public IDispatchImpl<IViewSource, &IID_IViewSource,
&LIBID_HTMLEDITLib>
正如你所见,向导已经使类从接口IObjectWithSiteImpl继承,这是一个ATL模板类,它提供了接口IObjectWithSite的基本实现。一般情况下,没有必要重载成员函数GetSite()。取而代之的是, SetSite() 实现代码经常需要加以定制。ATL实际上仅仅把一个IUnknown接口指针存储在成员变量m_spUnkSite中。
在文章的剩余部分,我将讨论一个 BHO 的相当复杂而丰富的例子。该BHO对象将依附于Internet Explorer,并显示一个文本框来显示当前正浏览的网页源码。 该代码窗口将 随着你改变网页而自动更新,如果浏览器显示的不是一个HTML网页时,它将变灰。你对于原始HTML代码的任何改动立即反映在浏览器中。HTML (DHTML)使得这一看似魔术般的实现成为可能。该代码窗口可被隐藏和通过按动热键重现。 在可见情况下,它与Internet Explorer共享整个桌面空间,见图三。
图三 BHO对象在使用中。它依附于Internet Explorer,并显示一个窗口来显示当前正浏览的网页源码。还允许你源码进行修改。
本例子的关键点在于存取Internet Explorer的浏览机制,其实它只不过是WebBrowser控件的一个实例而已。这个例子可以分解为以下五步来实现:
探测谁在装入这个对象,是Internet Explorer还是Windows资源管理器;
获取接口IWebBrowser2以实现Web浏览器对象;
捕捉Web浏览器的特定事件;
存取当前文档对象,确定它是一份HTML类型的文件;
管理对话框窗口以实现HTML源码的显示;
第一个步骤是在DllMain()中完成的。SetSite()是取得指向WebBrowser对象指针的适当位置。请详细分析以下步骤。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
·最新数据结构(试题)习题解答 (7796次浏览)
·Linux系统的硬件驱动程序编写原理 (3325次浏览)
·2000年试题集锦(下半年)数据结构试题 (3200次浏览)
·《数据结构》教学大纲--入门必看 (2867次浏览)
·Solaris 10 安装及SVC管理及X及Vmware及其 (2829次浏览)
·数据结构教程 第六课 线性表的顺 (1200次浏览)
·数据结构教程 第三十六课 选择排 (506次浏览)
·五子棋算法 (505次浏览)
·玩转你的三星--EasyStudio管理软件全攻略 (457次浏览)
·利用套接字机制实现Flash与数据库连接 (444次浏览)
·Linux系统的硬件驱动程序编写原理 (3325次浏览)
·2000年试题集锦(下半年)数据结构试题 (3200次浏览)
·《数据结构》教学大纲--入门必看 (2867次浏览)
·Solaris 10 安装及SVC管理及X及Vmware及其 (2829次浏览)
·数据结构教程 第六课 线性表的顺 (1200次浏览)
·数据结构教程 第三十六课 选择排 (506次浏览)
·五子棋算法 (505次浏览)
·玩转你的三星--EasyStudio管理软件全攻略 (457次浏览)
·利用套接字机制实现Flash与数据库连接 (444次浏览)
·新手学堂:常用的正则表达式操作符图示 10-16
·c语言数据结构教程 10-09
·教你如何分析未文档化的数据结构 10-09
·简明 Python 教程 -- 第9章 数据结构 10-09
·全文信息检索介绍及算法分析 10-09
·监听以太网(3) Packet32数据结构说明 10-09
·Discuz!6.0新版本尝鲜—“数据结构化”方便分类浏 10-09
·数据结构教程 第六课 线性表的顺序表示 10-05
·玩转你的三星--EasyStudio管理软件全攻略 10-03
·五子棋算法 10-03
·c语言数据结构教程 10-09
·教你如何分析未文档化的数据结构 10-09
·简明 Python 教程 -- 第9章 数据结构 10-09
·全文信息检索介绍及算法分析 10-09
·监听以太网(3) Packet32数据结构说明 10-09
·Discuz!6.0新版本尝鲜—“数据结构化”方便分类浏 10-09
·数据结构教程 第六课 线性表的顺序表示 10-05
·玩转你的三星--EasyStudio管理软件全攻略 10-03
·五子棋算法 10-03
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
站内频道文章精选
百度推荐,商机无限
搜索您感兴趣的内容



