本页内容
 |
CMI:问题的核心 |
 |
对象无处不在 |
 |
扩展对象模型 |
 |
CMI 的作用 |
 |
小结和展望未来 |
欢迎返回我们专栏的 Microsoft Windows XP Embedded
部分。11 月末,我们在 Las Vegas 的 Devcon 庆祝 Windows
XP Embedded
的发布,人们对该产品的兴奋之情溢于言表。我们所有的讨论会都安排满了(实际上,有些是过度拥挤的只售站票的会议),并且实用的教程同样很流行。我有机会与我们的很多客户一起交谈和工作,我对他们提出的问题的数量和层次印象深刻。感谢参加这次盛大发布会的每个人!
在我们开始讨论之前,让我澄清一个小问题:主专栏页上的图片是我的同事
Mike Hall(左侧)和我。Devcon
的很多人认识我的面孔,但把我当成了 Steve Maillet,因为
Steve 和 Mike
编写了第一篇文章。结果,我现在不仅要回答给我提的问题,还要说明我不是
Steve。
在我们上一篇文章中,我答应大体讨论一下
Windows XP Embedded
体系结构,说明正常的构建过程,以便让大家了解一些原理。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
还将只读和独占访问模式区分开来。如果任何工具想删除数据库中的信息(当前只有
Component Database Manager),它首先需要进行独占访问,如果有任何工具已将数据库打开,它就无法获得独占访问权。相反,如果它被授予独占访问权,则任何其他工具均无法访问数据库,直到独占访问权被释放为止。
对象无处不在
注以下讨论使用了两个很容易混淆的术语
£
组件和实例。简单地说,组件只是驻留在数据库中的一组资源和属性。当组件被添加到配置中时,它就叫作实例,然后可以修改、操作和构建它。请将组件看作饼干模子,而把实例看作模子作出的真正饼干
£ Äú无法轻易地修改饼干切割模子,但一旦将饼干切割后就可以随便处置这些饼干了。组件和实例之间的这种差别是您务必记住的,在本文和以后的文章中您将看到这一点。
因为 CMI 是工具的 COM
服务器,所以它强制形成了一个 Windows XP Embedded
体系结构的基础 £
所有内容都是对象。配置、组件、实例、资源、文件、注册表项、储备库
£ 实际上它们全部都是对象。因此,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
的每个对象都带有一组属性和方法,并且某些对象甚至可以对事件作出反应。属性可以分类为标准属性(例如,Component
Name、Component Author 和 Copyright)和高级属性(cmiNoHelpFiles
是组件常见的高级属性)。对象的方法可以只继承自基本组件(例如,基本构建行为),但还可以是组件特有的方法(例如
User Interface Core 组件,该组件包含 DHTML
配置脚本以及生成脚本,以实现不同的 UI
功能)。事件在构建过程中触发,并且可以由组件脚本对事件作出反应。
某些高级属性是为您预定义的。组件最常用的属性是
cmiNoHelpFiles(生成脚本用来从内部版本中删除帮助文件)、cmiLangEnableMUI(生成脚本用来启用组件的多语言用户界面
[MUI] 支持功能)和 cmiProtPropList(Target Designer
用来保护预定义属性)。可以如此检查组件的高级属性:在
Target Designer 中将组件添加到配置中,在
Configuration Editor 中单击组件,并单击 Advanced。
扩展对象模型
Windows XP Embedded 的对象特征和 CMI
干预不限于组件和实例。配置也被 CMI
作为对象进行处理。配置的标准属性包括配置名称、所有者和作者以及版权。高级配置属性包括对目标启动驱动器、启动
ARC 路径和所包括的帮助文件的设置。通过在
Configuration Editor 中选择配置名称,然后在 Details
窗格中单击 Advanced,就可以在 Target Designer
中检查这些属性。
正如组件和实例是对象一样,它们的组成部分也是对象。组件中的每个文件、注册表或其他资源都是具有自己的一组属性的对象。通过展开实例,然后展开
Files、Registry Data 或 Resources 项,就可以在
Configuration Editor 中检查这些属性。在 Details
窗格中右键单击所需的资源,随后将显示标准资源属性,而使用
Advanced
按钮将显示很少见到的高级属性。可以用相同的方式查看与配置相关的
Extra Files、Extra Registry Data 和 Extra Resources。最后,每个组、包、储备库和储备库集也被视为对象,它们都具有它们自己的一组标准和高级属性。
CMI 的作用
假设我们有一个要包括在运行时映像中的应用程序。这样做的正常步骤是为应用程序编写一个组件,然后将组件导入数据库,并将组件包括在配置中,然后构建运行时映像。让我们看一看在该过程中
CMI
是在哪里交互的。(我将在下两篇文章中深入研究组件编写,所以在这里我们将讲述得快一些)。
启动 Component Designer 时,CMI
首先会确保它有数据库连接。创建新组件的操作将指引
CMI 创建新的组件对象。然后,Component Designer
使用该对象作为您定义的所有组件信息的存储位置。基本编写过程包括:定义组件名称,指定要复制哪些文件和将它们放在运行时映像的什么位置,以及指定要使用的注册表项和将它们放在哪里。名称是标准组件属性,所以包括在
Component 对象中。您指定的文件和注册表项是由
CMI 创建并附加到组件对象上的对象。
做好导入组件的准备后,请启动 Component Database
Manager。它的第一项工作是调用 CMI
以便连接到您在安装期间指定的数据库。如果 CMI
可以连接,将允许您把 SLD 导入数据库中。(SLD
代表“源代码级别定义”,发音是“slide”。它是
Component Designer 的输出。)再次说明,Component
Database Manager 所做的所有事情是将 SLD 传递给 CMI
以便进行处理。浏览数据库,删除包和组件及检查对象属性均由
CMI 处理,并且 CDM 充当了基本 COM 对象层的 UI。
在您做好构建运行时映像的最后准备时,CMI
会再次验证数据库连接。(看见这里的模式了吗?)创建新的配置依赖
CMI 以创建对象,填充 Component Browser
也是如此。将组件添加到配置中需要 CMI
首先基于所选组件创建一个实例,然后将它附加到打开的配置上。还会为实例的文件、注册表和其他资源创建资源对象。在依赖性检查期间,CMI
会负责标识依赖性,并创建需要用于依赖性解析的组件列表。在构建期间,会要求
CMI
来访问要复制的实际文件,并且为处理构建排序提供详细的属性信息。
小结和展望未来
我们简短介绍了 Windows XP Embedded
的基本体系结构。CMI
是该体系结构的核心,它通过实现一个 COM
服务器来为 Windows XP Embedded
工具访问组件数据库提供了标准的访问方式。CMI
还强制形成了此体系结构的面向对象特性,这就需要为运行时开发周期中所需要的所有内容创建对象。
|