关于几个HTML文档接口的使用探讨

2016-02-19 19:24 9 1 收藏

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐关于几个HTML文档接口的使用探讨,希望大家看完后也有个好心情,快快行动吧!

【 tulaoshi.com - Web开发 】

  问题:

  在使用Active Accessibility SDK的过程中,我从某个窗口的句柄来获得IHTMLDocument2指针。有没有什么方法可以从IHTMLDocument2指针来获得IWebBrowser2指针?我用QueryInterface在两个接口(IHTMLDocument2 和 IWebBrowser2)上试过,但没有成功。我也用网景(Netscape)的 HTMLWindow2 指针试过从get_navigator获取IOmNavigator *。也以失败告终。请高手指点。

  解答:

  这个问题通常是COM编程中存在的共性问题。你有了窗口,文档,或者浏览器,你明明知道可以通过这些已知数据来得到其它的信息,但往往在实际环境中一运行,QueryInterface总是给你送回一个肥大的NULL。这个问题的答案实际上隐藏在神秘的IServiceProvider接口中,顾名思义,IServiceProvider的作用就是提供服务。IServiceProvider是个非常棒的接口:它只有一个方法——QueryService。如果你会用ATL智能指针,就像下面这样。首先必须获得IServiceProvider接口,

  
CComQIPtr isp = pIHTMLDocument2;

  这行代码实际上就是对文档执行了一次 QueryInterface,以询问IServiceProvider接口。一旦具备了isp,你便可以象下面这样获得浏览器。

  
CComQIPtr iwb2;
isp-QueryService(IID_IWebBrowserApp,IID_IWebBrowser2, (void**)&iwb2);

  如果你还是不明白上面所讲东西,没有关系,很正常。COM编程的一个根本规则是:QueryInterface必须总是要返回所查询对象的接口。但是文档不实现 IWebBrowser2 接口,它只知道如何获得正在工作的对象。文档,浏览器和窗口都是独立的对象。通常IServiceProvider被用于多个单独且相关的COM对象群来实现某种类型的服务。QueryInterface询问某个对象:“你实现这个接口吗?”,而QueryService告诉某个服务提供者,“不管什么对象实现这个接口都要告诉我。” 使用QueryService返回的接口指针与所查询的对象可能相同,也可能不相同。如图一所示。所有对象都实现它们自己不同的接口并在内部存储指向另一个对象的指针。你必须用IServiceProvider接口来获得特定接口的对象,不论它是哪一个对象实现的。IServiceProvider::QueryService要追随这些内部指针来获取实现你所想要的接口对象。

  

图一 多个对象,一个IServiceProvider

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  从本质上讲,IServiceProvider用于导航DHTML对象层次。假设你正在写一个ActiveX控件来导航这个对象模型。你如何做呢?首先要像下面这样查询IOleClientSite来取得IServiceProvider:

  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_IWebBrowserApp作为服务ID的代码。两种用法都可以行得通,因为文件中有个宏定义:

#defines SID_SWebBrowserApp IID_IWebBrowserApp

  但从编程的角度上讲,SID_SWebBrowserApp在技术上更正确,并且对阅读代码的人来说也更清晰。

  此外,如果你有足够的勇气去实现像DHTML对象模型这类庞大的对象系统的话,你也要用到IServiceProvider接口...... 

  关于这个问题的解答我也只能浅尝辄止地说明到这个地步,再往深处走,我也蒙嚓嚓。更深层次的探讨请各位参见MSDN库。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  由于个人水平所限,对解答中存在的错误与不详之处,请各位弟兄海涵。

来源:https://www.tulaoshi.com/n/20160219/1620924.html

延伸阅读
标签: Web开发
当网页内容太长或要导航到其它页面的一个具体位置时,可以使用  Html 中书签。 1.同一个web页面链接 首先设计书签 a name=”top”/a   在不同位置定义 a href=”#top”返回到top位置/a 2.不同的页面之间转接 如果是在不同的页面之间链接时要在href属性中加上网页名称。 First.html中定义了书签 a name=”top”Top的位置/a ...
标签: Web开发
    Dreamweaver是一个非常简单易用但又功能强大的网页制作软件。但是,它却又一个令很多初学者很困惑的问题。那就是空格。在Dreamweaver中使用空格远远没有象word中一样方便。比如首行无法空格,句子中间空一格以上都是不行的。原因是什么呢?这是因为在HTML语言中多于一个的空格都被忽略不计。这样就造成了空格困难的原因。 ...
标签: Web开发
CSS通过与(X)HTML的文档结构相对应的选择器(selector)来达到控制页面表现的目的,而文档结构不仅仅在CSS的应用上非常重要,对于行为层(例如使用JavaScript控制元素的行为)同样也非常重要。 4.1 文档结构 (X)HTML文档可以看作一个家族树,这个树有1个祖先根元素,然后各元素依次向下排列,例如有XHTML代码如下,其文档树如图4-...
标签: Web开发
介绍几个不常用的HTML标签 在HTML王国里,这里有很多子民,通常我们看到的是一些熟悉的面孔,而对于那些不熟悉的面孔你又了解多少呢,你知道它们的用法吗? 0、!DOCTYPE 标签 !DOCTYPE 标签出现在HTML文档第一行上的信息,说明该文档的类型,是一个“标准概括化置标语言(SGML)”声明,不是元素。语法: !DOCTYPE 例子:!DOCTYPE HTML PUBL...
标签: Web开发
在当前的许多NOVELL网络中,数据平台仍是基于DOS的FoxPro环境,一般工作站均是无盘站,但领导查询用的工作站往往配制较好,并装有WIN95或WIN98等系统,如果只用于数据查询或简单数据处理, 便造成资源浪费;如果同时进行其他工作处理,又不能确保网络安全。 ----鉴于此,我们设计了一个FoxPro程序,生成HTML文件,放在服务器的...

经验教程

787

收藏

49
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部