windows xp embedded 的体系结构很复杂,一篇文章的篇幅是远远不够的。因此,我只是以一种结构化的方式着重讲述个别工具背后的体系结构。但是,我首先要介绍这些工具的一个组成部分,这就是大家都比较陌生的 cmi。
cmi:技术的核心
正如您从我的上一篇文章(以及所有出版物)中所了解到的,windows xp embedded 使用基于 sql 的数据库来存储所有组件。数据库可以是本地或远程的 microsoft? sql server,也可以是本地的 microsoft? 数据引擎 (msde)(可在 windows xp embedded cd 上找到)。而 windows nt embedded 4.0 则使用一个单一的本地 jet 数据库 .mdb 文件来存储所有的组件和配置。
为了能够从一组工具中无缝访问本地和远程数据库,同时提供快捷的数据库切换,整个体系结构中设置了一个数据库通信层。该层称为 cmi,或组件管理接口。它的主要目的是在 windows xp embedded 工具(target designer、component designer 和 component database manager)和组件数据库之间提供一个标准接口,而不管数据库驻留在哪里(本地或远程、sql server 或 msde)。只要与组件数据库中的内容有关,cmi 就会被调用。
因为所有工具都依赖于活动的数据库连接来进行工作,所以任何工具所做的第一件事都是请求 cmi 提供一个活动数据库连接。如果没有可用的数据库连接,cmi 将返回一个失败,而工具将报告一个错误。总之,没有数据库连接,windows xp embedded 将不能进行任何工作。
cmi 也支持某种级别的异步数据库访问,这种情况通常发生在远程 sql server 数据库和多个客户端之间。所有涉及数据库更改的操作都在 sql 中处理,并在操作失败时提供复原功能。cmi 还可以区分只读模式和独占模式。任何工具要从数据库中删除信息(当前仅限于组件数据库管理器),都必须具有独占访问权限,如果任何其他工具打开了数据库,该工具将不能获得这一权限。另一方面,如果某工具已经被授予独占访问权限,其他工具将不能访问数据库,直到该工具释放这一权限。
此对象非彼对象
注意:下面的讨论中将使用两个术语 - 组件和实例,二者很容易混淆。简单地说,组件只是一组驻留在数据库中的资源和属性。组件添加到配置中便称为实例,可以修改、处理和构建。可以把组件视为 cookie 模式,而实例是从该模式中创建的实际 cookie。更改 cookie 剪裁模式并不容易,但在剪裁 cookie 后,可以随意对 cookie 进行处理。了解组件和实例之间的这种差异很重要,在本文和以后的文章中都将涉及这一问题。
因为 cmi 是工具的 com 服务器,这使得 windows xp embedded 体系结构形成这样一个基本特性 - 把任何事物都视为对象。配置、组件、实例、资源、文件、注册项、存储库都是 cmi 覆盖下的对象。因此,windows xp embedded 体系结构体现了面向对象 (oo) 思想的三个原则:封装、继承和多态。这里我们不对 oo 设计做详细讨论,只解释其中与 windows xp embedded 体系结构有关的几个方面。讨论的重点将集中在组件上,但相关的概念可以扩展到所有 windows xp embedded 对象。
每个 windows xp embedded 对象都是一个独立的单元。组件带有自己的属性和内部代码,以此来封装自己,并与其他对象区分开来。
组件也能够继承其他组件的属性。例如,假定一组设备都基于同一芯片组:假设为声卡驱动器,使用虚构的 soundexplosion 1a 芯片组。有三个声卡使用该芯片组,但提供不同的功能:一个用于游戏端口,一个用于 midi 端口,另一个用于 scsi 接口。我们不用创建三个大同小异的组件来适应不同的要求,而只需创建一个组件,将基本功能封装进去。然后针对三种差异创建三个组件,并将基本功能组件列为“原型”。这三个组件将继承与原型相关联的属性和资源,但同时也添加了自己的资源。
windows xp embedded 对象中的多态通常由 dhtml 配置脚本和构建脚本来处理。dhtml 配置脚本允许组件的最终用户在组件实例中动态设置属性,然后在构建脚本中检查这些属性并对其做出反应。这样,您就可以在构建配置时更改组件的行为,以满足开发人员的需求。
这最后一部分会进一步体现 cmi 面向对象的特性:windows xp embedded 中的每个对象都具有一组属性和方法,某些对象甚至能够对事件做出反应。属性可以分为标准属性(如组件名称、组件作者和版权)和高级属性(cminohelpfiles 是组件的一个常用高级属性)。对象的方法可以简单地继承自基本组件(如基本构建行为),也可以是该组件所特有的(如用户接口核心组件,它包含 dhtml 配置脚本以及构建脚本,可以实现不同的 ui 功能)。可以在构建过程中引发事件,并可由组件脚本做出反应。
某些高级属性已经被预定义,组件最常见的高级属性有 cminohelpfiles(构建脚本用它从构建中删除帮助文件)、cmilangenablemui(构建脚本用它来启用组件的多语言用户接口 支持)以及 cmiprotproplist(target designer 用它来保护预定义的属性)。要检查组件的高级属性,可以在 target designer 中将组件添加到某个配置,然后在 configuration editor 中单击该组件,再单击 advanced。