荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: DuMiYue (TH@Figo), 信区: Visual
标  题: 关于几个HTML文档接口的使用探讨
发信站: 荔园晨风BBS站 (Tue Mar 19 15:02:20 2002), 转信

关于几个HTML文档接口的使用探讨
赵湘宁
问题:
       在使用Active Accessibility SDK的过程中,我从某个窗口的句柄来获得IHTML
Document2指针。有没有什么方法可以从IHTMLDocument2指针来获得IWebBrowser2指针?
我用QueryInterface在两个接口(IHTMLDocument2 和 IWebBrowser2)上试过,但没有
成功。我也用网景(Netscape)的 HTMLWindow2 指针试过从get_navigator获取IOmNav
igator *。也以失败告终。请高手指点。
解答:
    这个问题通常是COM编程中存在的共性问题。你有了窗口,文档,或者浏览器,你明
明知道可以通过这些已知数据来得到其它的信息,但往往在实际环境中一运行,QueryI
nterface总是给你送回一个肥大的NULL。这个问题的答案实际上隐藏在神秘的IService
Provider接口中,顾名思义,IServiceProvider的作用就是提供服务。IServiceProvid
er是个非常棒的接口:它只有一个方法——QueryService。如果你会用ATL智能指针,就
像下面这样。首先必须获得IServiceProvider接口,
CComQIPtr isp = pIHTMLDocument2;
这行代码实际上就是对文档执行了一次 QueryInterface,以询问IServiceProvider接口
。一旦具备了isp,你便可以象下面这样获得浏览器。
CComQIPtr iwb2;
isp->QueryService(IID_IWebBrowserApp,IID_IWebBrowser2, (void**)&iwb2);
  如果你还是不明白上面所讲东西,没有关系,很正常。COM编程的一个根本规则是:Q
ueryInterface必须总是要返回所查询对象的接口。但是文档不实现 IWebBrowser2 接口
,它只知道如何获得正在工作的对象。文档,浏览器和窗口都是独立的对象。通常ISer
viceProvider被用于多个单独且相关的COM对象群来实现某种类型的服务。QueryInterf
ace询问某个对象:“你实现这个接口吗?”,而QueryService告诉某个服务提供者,“
不管什么对象实现这个接口都要告诉我。” 使用QueryService返回的接口指针与所查询
的对象可能相同,也可能不相同。如图一所示。所有对象都实现它们自己不同的接口并
在内部存储指向另一个对象的指针。你必须用IServiceProvider接口来获得特定接口的
对象,不论它是哪一个对象实现的。IServiceProvider::QueryService要追随这些内部
指针来获取实现你所想要的接口对象。
图一 多个对象,一个IServiceProvider
从本质上讲,IServiceProvider用于导航DHTML对象层次。假设你正在写一个ActiveX控
件来导航这个对象模型。你如何做呢?首先要像下面这样查询IOleClientSite来取得IS
erviceProvider:
CComQIPtr isp = pSite;
然后,一旦你具备了IServiceProvider,则可以用QueryService来从中查询应用对象。

CComQIPtr iwba;
isp->QueryService(IID_IWebBrowserApp, IID_IWebBrowserApp, (void **)&iwba);
接下来你就可以导航这个对象层次了(应用对象在最顶层)。如果你想要得到Web浏览器
,那么与前面类似。
CComQIPtr iwb2;
isp->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void **)&iwb2));
在所有这些例子中,SID_SWebBrowserApp都是服务标示,但你也能常常见到将IID_IWeb
BrowserApp作为服务ID的代码。两种用法都可以行得通,因为文件中有个宏定义:
 #defines SID_SWebBrowserApp  IID_IWebBrowserApp
但从编程的角度上讲,SID_SWebBrowserApp在技术上更正确,并且对阅读代码的人来说
也更清晰。
   此外,如果你有足够的勇气去实现像DHTML对象模型这类庞大的对象系统的话,你也
要用到IServiceProvider接口......
   关于这个问题的解答我也只能浅尝辄止地说明到这个地步,再往深处走,我也蒙嚓嚓
。更深层次的探讨请各位参见MSDN库。
   由于个人水平所限,对解答中存在的错误与不详之处,请各位弟兄海涵。

--
他能够不知不觉令到我倾心
    也能够一句说话而留下痛恨
        感情最光辉一刹热暖我一生
            爱人远走了以后仍然是爱人

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 218.30.30.9]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店