- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
XPCOM指南-3_组件的内部结构
组件的内部结构
— Component Internals
前面章节从客户使用角度描述了XPCOM组件,本章从开发者角度讨论组件。 请仔细阅读,XPCOM组件是怎么实现的,你可以略过本章到下一章节,从下一章节开始将会一步一步创建WebLock组件。
1. 用C++创建组件
让我们用C++开始XPCOM之旅吧。 XPCOM的大多数组件是用C++写的,然后编译为共享库(在windows下是DLL,Unix下是DSO)。
下面的图显示了包含组件实现代码的共享库和XPCOM framework 之间的关系。 在这个图里,外边界是共享库模块,模块里定义了一个组件。
图 A Component in the XPCOM Framework
当你以库的形式编译一个组件或模块的时候,这个库必须到处一个函数:NSGetModule。 这个函数时访问库的入口点。 它在组件注册或注销的时候被调用,当XPCOM想发现模块/库实现了哪些接口时,也会调用。 在本章中将对这个过程做个大概描述。
正如文章“A Component in the XPCOM Framework”所描述,除了NSGetModule入口点,用于组件实际创建的nsIModule 和 nsIFactory接口,字符串,和XPCOM glue部分,将在后面(参见 XPCOM Glue)进行详细描述。 后面是一些为了方便开发的使用工具,比如智能指针,泛型模块支持,以及简单的字符串实现。 最大的也可能是最复杂的一个组成部分是组件本身的专用代码。
组件到底在哪儿呢?
组件放在模块里,模块在共享库文件里定义,一般它放在XPCOM应用程序的 components路径下面。
对于典型的Gecko安装,已经把一些包含了组件的库放在了components路径下,包括网络访问,布局,跨平台的UI界面,等等。
2. XPCOM 初始化
要明白你的组件库什么时候,为什么被调用,你就需要弄明白XPCOM的初始化进程。当一个应用程序启动时,它会初始化XPCOM。XPCOM初始化事件可能由用户的某个操作触发,也有可能由应用程序启动时自己触发。 一个嵌入了Gecko的浏览器,可能在启动时通过嵌入式API的调用触发XPCOM的初始化。 另一个程序可能推迟XPCOM的初始化,直到它第一次需要使用XPCOM时。 在上面的任意一种情况下,XPCOM内部的初始化顺序是一样的。
XPCOM在应用初始化它后就启动了。 在启动时一些参数可以被传递给XPCOM,包括自定义特别路径(如组件路径)的位置。 这样可以指定XPCOM搜索组件的路径。
2.1 XPCOM 启动步骤
XPCOM的启动遵循下面六个步骤:
应用程序启动XPCOM
XPCOM发送开始启动的通知
XPCOM发现和处理组件清单
XPCOM发现和处理类型库 清单
如果XPCOM发现了新的组件,XPCOM注册它
XPCOM调用autoregistration ,启动自动注册
XPCOM注册新组件
XPCOM调用autoregistration结束
完成XPCOM启动,XPCOM通知启动过程结束
组件和类型库清单在下面章节描述,“XPCOM Registry Manifests”
2.2 XPCOM Manifests
XPCOM使用特殊文件跟踪和信息。有两种类型的跟踪XPCOM组件:
但正在努力将它从这个位置中移除以达到减弱以应用为中心(更以用户为中心)这些类型库文件都位于XPCOM可脚本化的核心并且是二进制的XPCOM组件结构模块接口提供另一个抽象允许多个工厂对象。从组件库,那里是只有单一的入口点,NSGetModule()。此入口点可任意数量的工厂,并从那里, XPCOM 对象。
这个库就是glue库。 它为你的组件和XPCOM之间,提供了一个桥,或者说是连接(glue)层。
XPCOM内置了glue库的一个版本,当你的组件使用了它,他就会链接到这个库:它直接包含了这些没有冻结的库的一个拷贝,这样XPCOM库版本的改变就不会影响到她。 你可以根据你的需要剔除不需要的片段。
3.2 XPCOM字符串类
XPCOM使用nsAString和nsACString等一些类作为基础的字符串类型。 这些类在Mozilla字符串指南里进行了描述(参见 Gecko Resources)。
这些字符串类提供了另外一个辅助类集合,他们在XPCOM里是没有冻结的。 很多组件和嵌入式应用需要链接到一些字符串类,但是这些代码太复杂,甚至比Glue的代码还要大。基于此,我们为开发者实现了一些轻量级的字符串类:nsEmbedString和nsEmbedCString。这些实现提供了nsAString/nsAString功能的最小集合。
在你的组件里,你可以通过使用nsEmbedString或其他类来
文档评论(0)