全球旧事资料 分类
外,在ATLCOM向导本地支持的已定义好的对象类型当中,有一个,就是I
ter
etExplorer对象,这正是一个BHO应该具有的类型。一个ATLI
ter
etExplorer对象,事实上是一个简单对象——也就是说,是一个支持IU
k
ow
和自注册,还有接口IObjectWithSite的COM服务器。如果你在ATL工程中添加一个这样的对象,并调用相应的类CViewSource,你将从向导中得到下列代码:
classATL_NO_VTABLECViewSourcepublicCComObjectRootExCComSi
gleThreadModel,publicCComCoClassCViewSource,CLSID_ViewSource,publicIObjectWithSiteImplCViewSource,publicIDispatchImplIViewSource,IID_IViewSource,LIBID_HTMLEDITLib
正如你所见,向导已经使类从接口IObjectWithSiteImpl继承,这是一个ATL模板类,它提供了接口IObjectWithSite的基本实现。一般情况下,没有必要重载成员函数GetSite。取而代之的是,SetSite实现代码经常需要加以定制。ATL实际上仅仅把一个IU
k
ow
接口指针存储在成员变量m_spU
kSite中。在文章的剩余部分,我将讨论一个BHO的相当复杂而丰富的例子。该BHO对象将依附于I
ter
etExplorer,并显示一个文本框来显示当前正浏览的网页源码。该代码窗口将随着你改变网页而自动更新,如果浏览器显示的不是一个HTML网页时,它将变灰。你对于原始HTML代码的任何改动立即反映在浏览器中。HTMLDHTML使得这一看似魔术般的实现成为可能。该代码窗口可被隐藏和通过按动热键重现。在可见情况下,它与I
ter
etExplorer共享整个桌面空间,见图三。
f图三BHO对象在使用中。它依附于I
ter
etExplorer,并显示一个窗口来显示当前正浏览的网页源码。还允许你源码进行修改。本例子的关键点在于存取I
ter
etExplorer的浏览机制,其实它只不过是WebBrowser控件的一个实例而已。这个例子可以分解为以下五步来实现:12345探测谁在装入这个对象,是I
ter
etExplorer还是Wi
dows资源管理器;获取接口IWebBrowser2以实现Web浏览器对象;捕捉Web浏览器的特定事件;存取当前文档对象,确定它是一份HTML类型的文件;管理对话框窗口以实现HTML源码的显示;
第一个步骤是在DllMai
中完成的。SetSite是取得指向WebBrowser对象指针的适当位置。请详细分析以下步骤。
七、探测谁在调用这个对象Detecti
gWhosCalli
g
如前所述,一个BHO对象会被I
ter
etExplorer或者Wi
dows资源管理器(前提:外壳版本471或者更高)所加载。所以我专门设计了一个BHO来处理HTML网页,因此这个BHO与资源管理器毫无关系。如果一个Dll不想被调用者一起加载,只需在DllMai
中实现了探明谁在调用该对象后返回FALSEr
好听全球资料 返回顶部