具体实施方式
现在参考这些附图,图1展示了根据本发明的某些实施例的示范计算设备150。计算设备150被展示为拥有软件产品(例如,操作系统152,以及一个或多个应用程序154)。操作系统152是用于计算设备150的基本软件控制程序,可执行各种功能,包括:提供用户界面;管理一个或多个应用程序154的执行;并控制数据从各种输入/输出(I/O)设备的输入以及数据到各种输入/输出(I/O)设备的输出。
在这个实例中,采取产品名称、标识语、位图图像或类似物形式的标记信息出现在操作系统152的许多文件各处。通常在产品开发的关键阶段进行标记更改;甚至在发行诸如操作系统等产品之后,也可继续该标记更改。这些阶段包括内部生产周期、β(外部)发行和最终的零售产品。本发明的实施例简化了标记元素由此被应用于诸如操作系统152等软件产品的过程。本发明在其他事物之中提供了一种全新的方法,用于处理产品标记的每个方面。例如,本发明集中所有的标记信息,因而允许通过在一处进行一项更改(而不是贯穿任何给定的软件产品来进行无数的更改),来应用标记更改。而且,本发明的各个方面有益于已购买许可权来用其自己的标记定制产品的第三方。如以下更详细的描述,本发明的实施例将标记信息装入单一标记部件,这使标记与核心操作系统代码分离。本发明的另外的各个方面利用部件化体系结构,用于将标记元素应用于软件产品。
除了大量的文件以外,操作系统(例如,操作系统152)通常在文件之中具有大量的从属性。例如,许多文件可能为将要执行的其预定功能性而要求安装一个或多个其他的文件。虽然该操作系统的制造商可能知道安装时的这类从属性,但是,对于用户、管理员或其他软件开发者而言,会很难了解这些从属性。这会证明是很麻烦的,因为软件开发者可能不知道其他文件中的什么数据或指令影响他们所关心的特定文件。同样,对不正常工作的计算机进行故障检修的管理员或用户在不了解这些从属性的条件下可能不知道哪些文件适用于该问题。
精通该技术领域的人熟悉常规的操作系统——其中,服务器和客户机OS产品从包含所有这些二进制文件的巨大的中央文件中构造而成。在一般整体式的常规操作系统的这个例子中,可执行的设置必须规定哪些文件被包括在这些不同的产品中。这样,很难理解每个产品的各个部分之间的关系。这种信息缺乏会妨碍在其生存期内维修操作系统的各个部分的能力。换言之,对于开发者和其他人而言,更难以了解该操作系统的所有这些不同的模块和文件,以确保:随着该操作系统变得更大、更复杂,它们将共同地和单独地进行适当的运作。
举例来讲,特定的OS产品可能作为“家庭”版本而被出售,而具有附加特点的高级产品可能作为“专业”版本而被出售。在这个实例中,该家庭产品和专业产品将经常包括不同的标记信息,以及散布在构成各自的产品的这许多二进制文件各处的其他参考资料。遗憾的是,由于二进制文件与这些标记参考资料(必须为新产品更改其中的每一项)的存在之间的关系,产品的创建和维修非常费力,并要求广泛的测试。
可以用众多不同的方式中的任何方式(例如,通过增加或替换一个或多个特定的二进制文件、通过众多不同的人中的任何人(例如,用户、管理员、除该操作系统开发者以外的软件开发者等))来修改(例如,更新或维修)该操作系统。当进行这类修改时,会增加识别存在于该计算机上的文件之中的从属性的难度。例如,更改单一文件可能会迫使更改其他的从属文件。另外,更难以对不正常工作的计算机进行故障检修或更新该操作系统,这是因为该用户或管理员无法确切、容易地知道什么功能性被安装在或应该被安装在该计算机上。
在图1的所展示的实施例中,应用程序154表现了可以在计算设备150上加以执行的众多不同的软件应用程序中的一个或多个软件应用程序。这类应用程序154的例子包括教育程序、引用程序、生产率程序(例如,文字处理器、电子表格、数据库)、娱乐程序、实用程序(例如,通信程序)等。应用程序154可以由用户安装在计算设备150上,或者,作为选择,可以由计算设备150的制造商和/或销售者来预先安装。
图1中的操作系统152将其功能性分成多个部件156(例如,所展示的实施例中的部件#1至部件#N(也见图2和图3))。每个部件156分别具有对应的清单158(例如,清单#1至清单#N)。部件156包括一个或多个文件(或文件标识符)的收集。这些文件可能包括诸如可执行文件、动态链接库(DLL)或组件对象模块(COM)等软件指令。这些文件也可能包括供部件156中的一个或多个部件使用的数据。在一项实施中,与操作系统152的特定功能性相对应的这些文件(例如,数据和/或指令)被共同分组在相同的部件156中。例如,可能有游戏部件、通信部件和文件系统部件。导致部件化的文件分组可能是静态的,或者,作为选择,可能随时间的推移而变化。在一个例子中,对操作系统152进行更新可能会导致:除去从某些部件156中选择的文件,并将这些文件加入其他部件156。
进一步参考图1,每个清单158包括描述对应的部件156的信息。与对应的部件156有关的众多不同的元数据中的任何元数据可能被包括在每个清单158内。在一项实施中,清单158识别对应的部件156的版本,以及对应的部件156依靠哪些其他的部件156(如果有的话)。举例来讲,为了使部件156中的一个或多个文件适当地执行,来自另一个部件的一个或多个其他的文件(例如,DLL文件)可能需要被安装在计算设备150上。在这个例子中,清单158将会指出:部件156依靠另一个部件。
由于现存的操作系统的复杂性和尺寸,越来越难以创建新产品,来满足市场或竞争的需求。如今的操作系统本质上更加整体式,因此,会很难理解各种组成部分之间的关系。由于缺乏该信息,因此,在该产品的生存期内维修操作系统会十分困难。为了克服这些和其他的问题,本发明的实施例对该操作系统实行部件化。换言之,本发明允许将软件产品表现为部件的收集。本发明的各个方面涉及被用来按部件化方法构建操作系统的几个抽象观念,以促进创建新产品和维修现存的产品。可以将这些抽象观念应用于包括应用程序和任何操作系统的任何软件产品。
示范的部件定义模式引入几个抽象观念,即部件(也被称作“组合”)、种类、特点、程序包、产品和SKU(库存单位)。在这个实例中,部件156表现销售、维修和/或结合的可再用、可共享的自描述原子单位。描述该部件本身以及按公布方式被用于安装、维修和/或结合到必要资源的所有有关的信息(即元数据)的是最基本的抽象观念。
如以下关于本发明的实施例的更详细的描述,种类对象162(见图4)表现用于为部件156的共同集合分组的机制;特点对象164(见图5)表现部件156和/或特点164的构成,并被用作用于创建产品对象166(见图7)的构件块;并且,程序包对象168(见图6)表现部件156、特点164、种类162和/或其他程序包168的构成。举例来讲,出于管理的目的,使用程序包对象168来为部件156的集合分组。另外,这个实施例中的产品对象166表现特点164和/或部件156的最高级的构成,SKU对象170(见图7)表现关于产品166的运输机制(例如,一个SKU 170可能包含多个产品166)。
现在参考图8,根据本发明的这些实施例的客户机二进制部件174利用标记构架,用于安装、更新、修改并/或维修被应用于该软件产品的标记资源。该标记构架将标记并入单一位置,因此,包括标记信息的所有产品将会受益。在这个实例中,这些标记二进制被分成两个部分,即标记引擎176和多个标记资源文件178。标记引擎176对资源文件178中所包含的标记资源进行存取。换言之,本发明的该标记构架利用标记引擎176,来贯穿软件产品而应用标记更改。该标记构架也支持将要按产品的需求来加以使用的自定义标记部件(即资源)的创建,这些产品除(例如)诸如该OS商标等更一般的商标以外,还包含唯一的商标元素。例如,每个标记资源文件是纯
资源DLL或一个或多个标记资源驻留在其中的其他应用编程接口(API)。如上所述,标记资源包括表示产品名称、标识语、位图图像和类似物的字符串和图像。
标记资源文件178被分成各个名字空间,这些名字空间又被分类成各个部件。在本发明的一个实施例中,标记引擎176的二进制包含API,用于调用一组资源文件178(即部件),作为所选择的名字空间的功能。根据所规定的名字空间,标记引擎176在DLL中搜索所请求的标记资源。有利的是,不需要安装所有的标记资源文件178。相反,本发明的这个实施例只安装由被安装的部件156要求的这些标记部件。
对于发行的每个不同的SKU 170(例如,高级版本、家庭版本等)而言,也可能要求发行后的标记更改。从长期来看,当不需要改变该商标时,本发明的该标记构架允许利用相同的二进制文件来维修所有的SKU 170。也可理解:维修包、QFE发行和类似物是商标不可知论的。
进一步参考包含该API接口的二进制,标记引擎176知道:在哪个DLL中寻找使用所规定的名字空间的请求资源。以下是标记引擎176的未管理的API的例子:
INT BrandLoadString(LPCTSTR NameSpace,//包含所请求的资源
INT Id,
LPTSTR缓冲器,
INT尺寸
的该标记(子)部件的名字空间);
与Win32SDK API LoadingString相同的行为。
HANDLE BrandLoadImage(LPCTSTR NameSpace,//包含所请求的资源LPCTSTR IpszName//将要装载的图像
UINT uType,//图像类型,因为现在将只支持IMAGE_BITMAP
int cxDesired,//所需宽度
int int cyDesired,//所需高度
int UINT fuLoad//装载选项
的该标记(子)部件的名字空间);
与Win32 SDK API LoadImage相同的行为。该调用者必须破坏被返回的对象(与利用LoadImage相同)。
HBITMAP BrandingLoadBitmap(LPCTSTR NameSpace,LPCTSTRIpszName)
与Win32 SDK API LoadBitmap相同的行为。该调用者必须破坏被返回的对象(与利用LoadBitmap相同)。
HCURSOR WINAPI BrandingLoadCursor(LPCTSTR NameSpace,LPCTSTRIpszName)
与Win32 SDK API LoadCursor相同的行为。该调用者必须破坏被返回的对象(与利用LoadCursor相同)。
HICON WINAPI BrandingLoadIcon(LPCTSTR NameSpace,LPCTSTRIpszName)
与Win32 SDK API LoadIcon相同的行为。该调用者必须破坏被返回的对象(与利用LoadIcon相同)。
标记引擎176使用这个实施例中的NameSpace参数来发现该标记部件(即资源DLL 178)。例如,见以下的该标记资源。
“助手API,”LPTSTR BrandingFormatString(LPCTSTR inString)表现示范的标记资源文件178。该助手API被用于包含产品名称的消息。该调用者所传入的那个字符串可能包含关于这些产品名称的可代替的参数。以下是示范的产品名称参数:
关于类属产品名称的%WINDOWS_GENERIC%
(IDS_WINDOWS_GENERIC);
关于简短的产品名称的%WINDOWS_SHORT%
(IDS_WINDOWS_SHORT,例如:Windows操作系统);
关于长的产品名称的%WINDOWS_LONG%
(IDS_WINDWOS_LONG,例如:Windows
家庭版本操作系统);
关于SKU名称的%WINDOWS_PRODUCT%
(IDS_WINDOWS_PRODUCT,例如:专业的);
关于版权字符串的%WINDOWS_COPYRIGHT%
(IDS_WINDOWS_COPYRIGHT,例如:版权
1983-2003微软公司);
关于微软公司名称的%MICROSOFT_COMPANYNAME%
(IDS_MICROSOFT_COMPANY,例如:微软);
关于版本年份的%WINDOWS_VERSION%
(IDS_WINDOWS_VERSION,例如:版本2003)。
这个例子中的该功能用该对应的产品字符串来替换这些参数,并返回这个新的字符串。例如,在该字符串上执行GlobalAlloc功能。该调用者使用GlobalFree来释放该字符串。没有触及该输入串。任何其他可代替的参数(例如,%Id(关于sprintf)或%1!Id!(关于FormatMessage))保持“按现状”。在调入BrandingFormatString之前或之后,该调用者可以调用他/她喜欢的功能来替换那些。作为选择,该调用者可以调用BrandingLoadString来获得这些产品字符串,然后将它们传递到他/她喜欢的功能。BrandingFormatString只是为方便标记引擎176的用户而提供的助手API。
以下是输入串的例子:“%WINDOWS_LONG%是最佳产品”。如果该计算机正在运行Windows
家庭版本操作系统,则该输出将会是:“Windows
家庭版本是最佳产品”。
现在参考图9,本发明的一个方面涉及诸如原始设备制造商(OEM)等第三方所实行的定制的标记。标记引擎176支持OEM自定义标记,这由标记资源DLL 178中所包含的可扩展标记语言(XML)文件来实现。该XML文件(也被称作“标记清单”)描述关联的标记资源DLL 178中所包含的这些资源。当资源被加入该标记资源DLL(即资源文件178)时,为这个(这些)新资源更新关于该DLL的XML数据。
在一个实施例中,该XML文件中的数据区之一指出:OEM或其他的第三方是否会提供/重写将要被安装在该软件产品内的特定的标记资源。举例来讲,该数据包含以下信息:ResourceType、ResourceID和Overwrite。ResourceType通过类型来描述、识别该标记资源(例如,字符串=6,位图=2),而ResourceID提供标识符。Overwrite(具有NO(“否”)的缺设值)指出:是否允许第三方提供关于被识别的标记信息的资源。此外,该清单也可以包括描述该资源的其他特征(例如,尺寸、长度、颜色、格式等)的嵌入式元数据。
在182处开始,图9描述获得第三方资源的过程。二进制文件或其他文件(例如,部件156)首先请求标记资源。有利的是,将标记规则保持在这些资源本身内可防止资源败坏。该部件在184处调入标记引擎176的标记API。在这个例子中,使该标记API(对于不同类型的资源而言可能是不同的)模仿
未管理的API。将会理解:该界面也会得到管理(例如,诸如利用.NET构架)。
在186处,标记引擎176根据(例如)名字空间和资源ID来核对标记清单。所规定的名字空间映射到这个例子中的特殊的DLL。这时,标记引擎176尝试将该DLL定位在其集中的位置,并尝试确定该DLL是否知道关于该请求资源的ID。在188处,标记引擎176进一步为取代指令而检查该清单。随着取代设置为NO(“否”)值,在190处返回该正规资源。另一方面,如果取代被设置为YES(“是”)值,则将允许第三方改变该软件产品的可见外观的某个方面。
进行到192,标记引擎176核对第三方取代DLL的存在。如以前,标记引擎176根据关于该取代DLL的规定的名字空间,来搜索已知位置。如果该取代DLL不存在或没有规定它想要取代该正规资源,则操作返回到190。如果该取代DLL可用,则在194处返回该第三方资源。
以下是该数据文件(即该标记清单)的例子:
<标记>
<资源ResourceType=”2”ResourceID=”100”重写=”否:”/>
<资源ResourceType=”2”ResourceID=”101”重写=”否:”/>
<资源ResourceType=”2”ResourceID=”110”重写=”否:”/>
<资源ResourceType=”2”ResourceID=”111”重写=”否:”/>
<资源ResourceType=”6”ResourceID=10”重写=”是:”/>
<资源ResourceType=”6”ResourceID=”11”重写=”是:”/>
<资源ResourceType=”6”ResourceID=”12”重写=”是:”/>
<资源ResourceType=”6”ResourceID=”13”重写=”是:”/>
</标记>
如果第一个实例中的该标记资源DLL内没有提供资源,则要求以上数据文件内的项目。但是,该资源可能由第三方提供,而不是在该标记资源DLL中提供。例如,使用该数据文件中的项目来指出:OEM/第三方可以重写特定的资源(例如,Windows
操作系统的系统属性页上的OEM标识语)。在这个例子中,如果该OEM选择不提供该标记资源,则该标记资源DLL不需要具有默认值。
也可以使用这里所描述的部件定义来概括地描述应用部件,而不是明确地描述操作系统部件。换言之,可以使用这种部件定义来描述任何应用程序。相应地,可以将该标记构架应用于任何操作系统、应用程序或其他软件产品。
这里所描述的部件化体系结构定义用于在设计时间和运行时间期间管理部件的这些概念、部件库和编程模型。有几个部件化的战略好处:敏捷、速度、承载能力和增加的收入机会。甚至跨越客户机和服务器线路,创建新的软件产品(由产品或SKU对象来表现)也变得更加容易。这是一项相对较简单的任务:选择正确的部件,并提供某种额外的配置,以制造新产品。若在相对较短的时间内创建新产品具备敏捷灵活性,则能够展开有效率的竞争,并可避免错过市场机会。例如,可以提供额外的部件供以后加入当前的产品,这允许客户升级到高级产品,这增加了许可证的总数,等等。所有这些额外的活动可能会带来关于这些产品的额外收入。
部件化也促进减少原始设备制造商(OEM)或公司必须保持的产品图像数量,这可以节省大量的成本。根据本发明的至少一个实施例,大部分的该部件信息是公布性质的,以便可以用离线的方式来安装部件。这减少了将整个产品安装到目标设备上所花费的时间,并可以为OEM、公司、最终用户和类似方大大降低成本,提高客户的满意程度。
精通该技术领域的人认识到作为该产品周期的一部分的服务的重要性。根据本发明的实施例来维修部件化产品相对较简单,这是因为容易根据每个部件所提供的公布信息来评估这些变化的影响。也可以更容易地测试更加隔离的环境中的这些部件,以提高测试效率。这又降低了该软件产品的总体脆性。
这里所描述的部件定义模式包括部件156描述的信息,以便安装、升级服务并结合到合适的资源。在这点上,图2展示了根据本发明的某些实施例的示范的部件156和对应的清单158。根据本发明的实施例,每个部件156由对应的清单158来表现。部件156包括至少一个文件174,并可能随意地包括一个以上(n)的文件。虽然在图2中被展示为文件,但是,作为选择,部件156可能包括文件174(而不是实际文件)中的一个或多个文件的指针或其他标识符。
部件156对应于清单158。在所展示的例子中,清单158包括识别部件156(例如,通过名称或某个其他的唯一标识符)的部件标识符。作为选择,这种一致性可以用不同的方式(例如,将清单158的标识符(未示出)包括在部件156中;将部件156和清单158(或其标识符)存储在数据结构中,该数据结构保持部件156与清单158之间的固有的一致性;等等)来保持。清单158可能是可扩展标记语言(XML)文档。
如图2中的示范清单所示,清单158也包括从属部件清单,该从属部件清单识别部件156所依靠的零个或多个部件。被识别的从属部件是也需要作为该操作系统图像的一部分来加以安装以便使部件156适当地运作的那些部件。在所展示的例子中,这些标识符识别部件156适当地运作所必要的部件,但作为选择,这些标识符可能包括应该被包括在内的部件(即,部件156喜欢拥有的、作为该操作系统的一部分但却不是必要的部件)。除了本体和从属性以外,这个例子中的清单156也描述部件156的许多其他的细节,即通用信息(包括所有者、测试者、开发者、说明等)、文件、登记信息、设置(配置)、从属关系和其他信息。
选择性实施例中的清单158也可能包括优先顺序和版本指示器,以协助安装和/或升级。
作为选择,清单158中所保存的部分或全部的该信息可以被保存在不同的位置中。举例来讲,部分或全部的该信息可以被并入图1中的部件156。
“附录A”的例子进一步展示了关于清单158的、本发明的各个方面。
下文进一步提供了关于例示本发明的各个方面的部件化体系结构中所使用的主要抽象观念的细节。
如上所述,被称作“部件156(或组合)”的对象表现销售、维修和结合的可再用的或可共享的自描述原子单位。在图3的实施例中,部件156可能依靠其他的部件156和/或特点164来运行,即,它们展示出相对于这些其他的对象的从属性。部件156也可能是不同的开放组(即种类162)的成员。在这个实例中,被称作“本体”的开发者友好的、可扩展的多部分属性“bag”识别每个部件156。该部件本体具有以下特质,例如:名称、版本、处理器体系结构、语言(例如,“us-eng”或“jpn”)、制造类型(例如,释放或调试)和创办者的标识。该名称特质采取场所独立字符串的形式,该场所独立字符串描述一个实施例中的特定部件156。四部分版本号(一般遵循(例如)“major.minor.build.revision”格式)由该本体的版本特质来提供。在该本体的创办者的ID特质中发现允许该部件本体安全的采用密码方式的安全信息。
如上所示,每个部件156由一个或多个文件以及关联的清单158构成。如图3所示,清单158描述部件156的细节。在图3的实施例中,被称作“部件”或“组合”的对象可能具有关于另一个部件156、种类162和/或特点164的从属性。特别是,图3表现了:部件156可能依靠在零个或多个种类162、零个或多个特点164和/或零个或多个其他的部件156中发现的二进制文件中的一个或多个二进制文件。此外,部件156可能会宣布种类162中的从属关系。
图4所示的种类对象162定义开放组,在该开放组中,从属关系信息的存在与该种类的成员有关,而不是存在于种类清单中。例如,可以建立一个种类162,来为与文本编辑器(例如,Notepad和Wordpad)有关的一个或多个部件156分组。也使用与部件156的本体机制相类似的本体机制来识别种类162。在一个实施例中,种类162具有诸如本体、通用信息和其他信息等细节。
在图4的示范的从属关系图表中,可以使用种类162来为零个或多个特点164、零个或多个部件156以及/或者零个或多个程序包168分组。如上所述,种类对象162表现了其他对象宣布其进入其中的从属关系的开放组。
现在参考图5,特点对象164表现部件156和/或其他特点164的构成。特点164被用作软件产品构件块,并可以从安装中被加入或除去。特点164具有关于部件156、其他特点164和种类162的包含的从属关系,而不是依靠其他对象。换言之,特点164没有根据这个实施例的从属性。举例来讲,一个特点对象164表现合并的Web浏览器特点,另一个特点对象164表现媒体播放器应用程序,这两者都利用操作系统来加以运输。特点164包括本体、通用信息(例如,所有者、测试者、开发者、说明等)、从属关系、构成和其他信息。在本发明的一个实施例中,该特点本体类似于结构中的部件本体,并被用来识别每个特点164。特点164可能是多个不同的种类162的成员(见图4)。
图5进一步展示了:特点164包括零个或多个其他的特点164和/或部件156;特点164可能会宣布种类162中的零个或多个种类内的从属关系。
图6用图解法展示了程序包对象168。如所示,程序包168是部件156、特点164、种类162和其他程序包168的合成物。与种类162对比,程序包168是封闭组。程序包168主要用于管理的目的。例如,OS的家庭版本可能利用“cab1”、“cab2”、“cab3”和“cab4”所指出的四个不同的程序包168来加以运输。这个例子中的程序包对象168是出于设置目的而形成的组。程序包168只规定图6的实施例中的其他程序包168上的从属性。根据这里所描述的部件化定义的每个程序包168包括诸如本体、通用信息、从属关系、构成、从属性和其他信息等细节。
进一步参考图6,程序包168表现零个或多个其他的程序包168、种类162、特点164和/或部件156的分组。在这个实例中,程序包168可能属于诸如种类162的开放组,也可能依靠诸如另一个程序包168的封闭组。
图7中的产品对象166表现特点164和/或部件156的最高级的构成。它也具有被用来配置组成的特点164和部件156的属性。根据本发明的实施例,产品设计者为产品166选择一个或多个特点164(见图13)。产品对象166包含关于本体、通用信息、构成和其他信息的细节。SKU对象170表现关于产品166的运输介质(即,什么产品被包括在圆盘上供运输)。合适的运输介质包括软盘或光盘以及web下载柜文件。SKU 170也可能包括一个以上的产品164(见图13)。本发明的至少一个实施例使用SKU设计者工具来生成SKU清单。与以上所描述的其他抽象观念相类似的是,SKU 170包含本体、通用信息、产品和其他信息。
图10提供了“为OS二进制文件的各种部件156分组,以定义特点164”的例子。然后,为特点164分组,来定义产品166,它们又被包括在内,供利用SKU 170来运输。不同的计算机可能具有基于相同的操作系统的不同的操作系统图像。例如,不同的OEM可能会用不同的方法来定制相同的操作系统(例如,以便该操作系统利用识别该OEM的初始屏幕来进行引导、可能使用不同的默认设置等)。不同的功能性也可能被包括在内(例如,屏幕保护程序、背景或主题、诸如通信程序、游戏等软件应用程序)。这个附加的功能性可以由该OEM、或作为选择由其他的制造商或销售者来提供。这样,许多不同的部件可能成为该操作系统的一部分,只有该操作系统的子集实际上被安装在特定的计算机上,作为操作系统图像。另一方面,OEM特定部件和清单集包括可以由该OEM作为该操作系统图像的一部分来加以安装的附加部件。
可以出于任何众多不同的原因,来更新该操作系统。举例来讲,对某些部件的某些文件的故障修理可能可用,部件中的新的功能性(例如,替换或附加的文件)可能可用,新部件可能可用,等等。
此外,新部件可以与先前的部件一起作为该操作系统的一部分来加以安装,而不是替换该先前的部件。这允许不同的应用程序使用它们所喜欢的(或者被编程来使用的)该部件的任何一个版本。
举例来讲,OEM可以提供对应于家庭运用、商业运用、服务器运用等的各种基本的计算机配置。这个例子中的这些配置中的每一个配置都基于相同的操作系统,但包括不同的功能性。附加的联网和通信功能性可能被包括在服务器配置内,这是家庭或商业配置中所不包括的;并且,附加的游戏或音频重放功能性可能被包括在家庭配置内,这是商业或服务器配置中所不包括的。图10表现了包括基本家庭产品的示范的高级产品。
图11表现了根据本发明的实施例的编程模型的第一层次抽象观念。特别是,该示范图表使用(例如)“统一模型建立语言”(UML)来展示不同的第一层次对象(或类)。在这个例子中,使用UML来向程序设计员揭露这些对象。这些界面中的每个界面直接映射到部件化的第一层次概念。
通过该操作系统的部件化,大大简化了该操作系统安装过程。通过包括这个合适的部件和对应的清单,可以将OEM特定功能性容易地加入计算机。另外,通过只替换这些对应的部件,为改善功能性而对该操作系统进行更新、故障修理和类似的操作可以被容易地并入该安装过程。作为选择,包括这类更新的操作系统安装站可能具备附加的更新部件和清单集。
现在参考本发明的该标记构架的另外的各个方面,在至少一个实施例中,内部标记情况一般基于手动过程。举例来讲,部件156可能被创造成包括产品标记。这包括在其UI中清单产品标记的部件156,以及除现存的类属产品标记元素以外没有唯一的标记UI的部件156。在这个实例中,该部件创造者允许部件156在该部件化过程期间的各个时刻(例如,规划和实施)清单标记。
例如,在规划阶段,部件156的创造者可以为标记元素而检验其UI,并找到类属产品标记元素的几个实例。如果该创造者没有找到对于该特定部件而言是唯一的任何标记,则他或她可以推断出:部件156可以使用标记种类162中的现存的类属产品标记元素。在这个实例中,该创造者特别提到:部件156将需要表达关于标记引擎178APIs的从属性。
例如,在实施阶段,该创造者发现标记种类162内的各种标记资源,标记种类162列出由标记资源部件(DLLs)划分的所有这些资源文件178。在替换方案中,该创造者可能可获得所有标记二进制的根。在实施期间,该创造者从标记种类162中选择这些标记资源部件,并为部件156而对该UI进行编码。这时,该创造者将从属性从部件156加入该标记API。在制造时间,所规定的标记元素被显示在该UI中。
在另一个实施例中,部件创造者可能要求唯一的或自定义的标记元素,而不是要求类属标记(例如,关于高级产品)。现在参考图12,具体表现本发明的各个方面的该标记构架允许部件创造者规定对标记引擎176的从属性,用于创建具有自定义标记元素的软件产品。
图13展示了用于本发明的示范的部件化体系结构。图13中所示的可扩展体系结构允许建立OS安装(包括安装和卸载部件),并启用产品/SKU敏捷灵活性。而且,该体系结构提供用于维修运行的OS和OS图像的基础结构,提供OS部件目录;并且依靠该被安装的系统。该部件化体系结构提供关于部件的创建和管理的概括的构架。它也考虑到按类属的方式从配置中建立运行时间图像。部件管理界面(CMI)是编程模型界面,它可以被不同的消费者用来访问该部件化体系结构所揭露的功能性。这些工具一般可以被分成以下各个类:设计时间工具;运行时间工具;以及制造时间工具。设计时间工具是在设计时间被使用的工具(例如,设计或创建部件的部件设计者,以及设计或创建配置的目标设计者)。运行时间工具被用来管理运行时间图像上的现存的部件(安装)。这可能包括诸如选项部件管理器(OCM)的功能性,它管理被安装在系统上的这些部件。运行时间工具的另一个例子可以是维修客户机,该维修客户机与远程服务器对话来获得部件更新,并更新被安装在装置上的这些部件。制造时间工具被用于制造实验室中。它们主要被用来从配置中创建运行时间图像。
如图13所示,CMI具有核心层和实用层。该CMI核心层包括一般被揭示为和用作众所周知的界面的不同的功能块。该层包括核心CMI对象模型、仓库和文件库、以及串行化器/解串器。为了方便编程,该核心CMI对象模型块向CMI客户机揭露作为界面的多个不同的第一类抽象观念。它们一般用相对较容易使用的格式来反映部件化抽象观念。例如,Iassembly使“部件”概念抽象化。这个实施例中的这些抽象观念不具备与它们关联的任何功能性。它们是可以通过这些抽象观念上所揭露的各种方法来加以检索和设置的特质收集。以下的清单包括通过该核心CMI对象模型中的界面来加以揭露的部分抽象观念:IAssembly;IFeature;ICategory;IPackage;IProduct;ISku;IConfiguration;IRepository。
图13的例子中的部件库被用于管理存在于这些仓库之一内的部件。如上所述,每个部件具有元数据(即关于该数据的信息)和实际数据(即部件的文件)。元数据可通过元数据库界面(IRepository)来存取,而数据可通过文件库界面(IfileRepository)来存取。在一个实施例中,使用关系数据库来执行该元数据库界面,以便存储部件的元数据并将其编入索引中。该文件库界面允许客户机用一致的方法来接触到该部件数据(文件)。
该部件元数据和数据界面在图13中的部件库界面下被分开,以虑及基于不同情况的不同的可插元数据库实施。例如,在设计机器上可使用SQL元数据库,因为可用的贮藏器和存储器可能没有受到约束,但在运行时间系统上,元数据库可能得到小型足迹数据库(例如,登记处)的支持,以照顾到严厉的存储要求。
串行化器和解串器界面允许CMI中的第一类对象被串行化为文本文件并从文本文件中被解串。例如,XML串行化器和解串器读、写XML文件。如以下所述,该串行化器和解串器一般读出并写出载体和配置。
用串行化格式携带任何第一类抽象观念的这些文件被称作“载体”或“清单”。这些载体提供填充该部件库数据的方法,即,工具创建或编辑载体文件中的部件的串行化实例,并且,该部件库界面考虑到该载体输入该部件库。
为信息交换而使用载体的主要优点是:它允许使这些工具与该部件库分离。另一个优点是:在输入载体信息的同时,可以用更一致的(或完整的)格式将该数据输入该部件库。该串行化器和解串器界面隔离也虑及将要被执行的其他种类的载体(例如,INF)。
配置是该CMI的IConfiguration对象的串行化表示,它表现被用来建立运行时间图像的部件和设置的收集。在单独的文件中而不是在载体文件中对配置实行串行化,这是因为无法将配置输入该数据库。
该CMI实用层包括频繁变化的功能块。在图13的实施例中,这些功能块被揭示为并被用作众所周知的界面。该实用层包括关于安装者、升级者、从属性分解器、该CMI对象模型和客户机的各个块。安装者块具有用于安装(或制造)和除去该核心层所揭露的特定的部件化抽象观念的逻辑。例如,用在线或离线的方式从该OS安装中安装并除去IAssembly。安装和除去组合的逻辑存在于这个块中。使用“IInstallable”界面来安装和除去所有这些核心抽象观念。这些方法的实施为每个核心抽象观念而改变。例如,关于组合,将会有被称作“IAssemblyInstaller”的安装者抽象观念。IAssemblyInstaller聚集“IAssembly”界面,并执行“IInstallable”,以安装和卸载组合实例。
与核心抽象观念结合的这种类型的特定功能性允许按需要来改变组合安装逻辑的实施,而不会影响核心IAssembly界面。对于其他的核心抽象观念而言,也是如此。
升级者块具有用于使关于窗口安装的特定核心抽象观念升级和降级的逻辑。例如,按在线或离线的方式从该OS安装中升级或降级IAssembly。使组合升级和降级的逻辑存在于这个块中。使用“IUpgradable”界面来升级和降级所有这些核心抽象观念。
对于每个核心抽象观念,可分开执行这些方法。由于在升级过程期间需要安装和卸载功能性,因此,“IUpgradable”继承“IInstallable”,以再使用现存的安装和卸载功能性。例如,该组合具有被称作“IAssemblyUpgrader”的升级者抽象观念。IAssemblyUpgrader聚集“IAssembly”、“IAssemblyInstaller”,并执行“IUpgradable”,以便使窗口安装上的组合实例升级和降级。这种结合再次允许按需要来改变组合升级逻辑的实施,而不会影响该核心IAssembly界面和安装或卸载逻辑。对于其他核心抽象观念的升级功能性而言,也是如此。
从属性分解器块为特定的核心抽象观念执行从属性分解逻辑。在这个实例中,关于每个核心抽象观念,这个块以自动化方式或手动方式而具有从属性分解方面的逻辑。该从属性分解器对于这些客户程序而言是可扩展的,以便按特定的客户机上下文中的需要来扩展默认的从属性分解功能性。这个块的功能性通过“IDependencyResolver”界面来加以揭露。分解从属性的这个方法根据它正被用于其中的情况来返回CMI对象或实例对象的树。一般按照根据本发明的至少一个实施例的配置或仓库来完成从属性分解。该仓库可以是可安装的或被安装的仓库。
通常,在运行时间系统上,依照被安装的仓库和现存的配置来进行从属性分解;而在设计时间情况中,依照可安装的仓库和正在被编辑的当前配置来进行该从属性分解。
该CMI对象模型是CMI核心对象模型和实用层中所揭露的不同的功能段的聚集形式。该核心CMI对象模型也被揭露出来,供创造工具直接处理这些抽象观念,同时对这些载体(或清单)实行串行化和解串。
在以上的体系结构中要注意的关键事物之一是:为设计时间、运行时间和制造时间情况有利地揭露相同的编程模型。这有助于使该对象模型在不同的要求方面保持一致,并有助于提高程序设计员的生产率。这也有助于再使用将要被用于不同情况(例如,设计和运行时间)的CMI的单一实施,所以,与关于设计时间和运行时间情况的不同实施相比较,更可维持。
图14表现了采取计算机70形式的通用计算设备的一个例子。在本发明的一个实施例中,诸如计算机70的计算机适合用作计算机150。
在所展示的实施例中,计算机70具有一个或多个处理器或处理单元72,以及系统存储器74。在这个所展示的实施例中,系统总线76将包括系统存储器74的各种系统部件耦合到处理器72。总线76表现任何几种类型的总线结构(包括存储总线或存储控制器、外围总线、加速图形端口和使用各种总线构造中的任何总线构造的处理器或局域总线)中的一种或多种总线结构。举例来讲(不作限制),这类结构包括“工业标准结构”(ISA)总线、“微通道结构”(MCA)总线、“增强型ISA”(EISA)总线、“视频电子标准协会”(VESA)局域总线和也被称作“夹层(Mezzanine)总线”的“外围部件互连”(PCI)总线。
计算机70通常至少具有某种形式的计算机可读介质。计算机可读介质(包括易失和非易失介质、可移动和不可移动的介质)可能是可以由计算机70存取的任何可用介质。举例来讲(不作限制),计算机可读介质包括计算机存储介质和通信介质。计算机存储介质包括易失和非易失的可移动和不可移动的介质,该介质用关于信息(例如,计算机可读指令、数据结构、程序模块或其他数据)存储的任何方法或技术来加以执行。例如,计算机存储介质包括RAM、ROM、EEPROM、快闪存储器或其他存储技术、CD-ROM、数字通用光盘(DVD)或其他光盘存储器、盒式磁带、磁带、磁盘存储器或其他磁性存储设备、或可以被用来存储所需信息并可以由计算机70来存取的任何其他的介质。通信介质通常具体表现计算机可读指令、数据结构、程序模块或调制数据信号(例如,载波或其他传送机制)中的其他数据,它包括任何信息传递介质。精通该技术领域的人熟悉该调制数据信号,该调制数据信号的一个或多个特征按为该信号中的信息编码这样一种方式来加以设置或更改。有线介质(例如,有线网络或直线连接)和无线介质(例如,声音、RF、红外线和其他无线介质)是通信介质的例子。以上任何内容的组合也被包括在计算机可读介质的范围以内。
系统存储器74包括采取可移动和/或不可移动的易失和/或非易失存储器形式的计算机存储介质。在所展示的实施例中,系统存储器74包括只读存储器(ROM)78和随机存取存储器(RAM)80。基本输入/输出系统82(BIOS)通常被存储在ROM 78中,该基本输入/输出系统包含有助于在计算机70内的各个元件之间传送信息(例如,在启动期间)的这些基本例行程序。RAM 80通常包含可由处理单元72立即存取并且/或者目前正由处理单元72进行操作的数据和/或程序模块。举例来讲(不作限制),图16展示了操作系统84、应用程序86、其他程序模块88和程序数据90。
计算机70也可能包括其他可移动/不可移动的易失/非易失计算机存储介质。例如,图14展示了从不可移动的非易失磁性介质读取或对其写入的硬盘驱动器94。图14也表现了从可移动的非易失磁盘98读取或对其写入的磁盘驱动器96,以及从可移动的非易失光盘102(例如,CD-ROM或其他光学介质)读取或对其写入的光盘驱动器100。可以被用于示范操作环境中的其他可移动/不可移动的易失/非易失计算机存储介质包括(但不局限于)卡型盒式磁带机、快闪存储卡、数字通用光盘、数字录像带、固态RAM、固态ROM和类似的存储介质。硬盘驱动器84、磁盘驱动器96和光盘驱动器100通常由非易失存储接口(例如,接口106)连接到系统总线76。
以上所讨论的和图14中所展示的这些驱动器或其他海量存储设备及其关联的计算机存储介质为计算机70提供了计算机可读指令、数据结构、程序模块和其他数据的存储。在图14中,例如,硬盘驱动器94被展示为存储操作系统110、应用程序112、其他程序模块114和程序数据116。注意,这些部件可以等同于或不同于操作系统84、应用程序86、其他程序模块88和程序数据90。这里为操作系统110、应用程序112、其他程序模块114和程序数据116提供不同的号码,以展示:它们至少是不同的副本。
用户可以通过输入设备或用户界面选择设备(例如,键盘120和定点设备122(例如,鼠标、跟踪球、笔或触垫)),来将命令和信息输入计算机70。其他输入设备(未示出)可能包括话筒、操纵杆、游戏垫、圆盘式卫星电视天线、扫描仪或类似的输入设备。这些和其他的输入设备通过被耦合到系统总线76的用户输入接口124而与处理单元72连接,但也可以由其他的接口和总线结构(例如,并行端口、游戏端口或通用串行总线(USB))来加以连接。监视器128或其他类型的显示设备也经由接口(例如,视频接口130)而连接到系统总线76。除监视器128以外,计算机还经常包括诸如打印机和扬声器等其他的外围输出设备(未示出),这些外围输出设备可以通过输出外围接口(未示出)来加以连接。
计算机70可以在使用与一台或多台远程计算机(例如,远程计算机134)的逻辑连接的联网环境中进行操作。远程计算机134可能是个人计算机、服务器、路由器、网络PC、对等设备或其他共同的网络节点,它通常包括以上相对于计算机70而描述的许多或全部元件。图16中所描绘的这些逻辑连接包括局域网(LAN)136和广域网(WAN)138,但也可能包括其他网络。LAN136和/或WAN 138可以是有线网络、无线网络、其组合等。这类联网环境在办公室、企业范围的计算机网络、内联网和全球计算机网络(例如,因特网)中很普遍。
当被用于局域网环境中时,计算机70通过网络接口或适配器140而连接到LAN 136。当被用于广域网环境中时,计算机70通常包括调制解调器142或用于在WAN 138(例如,因特网)上建立通信的其他装置。调制解调器142(可能是内置的,也可能是外置的)经由用户输入接口134或其他合适的机制而连接到系统总线76。在联网环境中,相对于计算机70而描绘的程序模块或其各个部分可以被存储在远程记忆存储设备(未示出)中。举例来讲(不作限制),图14将远程应用程序144展示为驻留在该存储设备上。将会理解:所示的这些网络连接是起示范的作用,可以使用在这些计算机之间建立通信链路的其他方法。
通常,利用于不同的时间被存储在计算机70的各种计算机可读存储介质内的指令,来对该计算机的这些数据处理器进行编程。程序和操作系统通常被分布在(例如)软盘或CD-ROM上。它们从那里被安装入或载入计算机的辅助存储器。在执行时,它们至少被部分地载入该计算机的主电子存储器。当这类介质包含用于结合微处理器或其他数据处理器来执行这里所描述的步骤的指令或程序时,这里所描述的本发明包括这些和其他各种类型的计算机可读存储介质。当根据这里所描述的这些方法和技术来加以编程时,本发明也包括该计算机本身。
出于举例说明的目的,程序和其他可执行程序部件(例如,该操作系统)在这里被展示为离散块。但是,可认识到:这类程序和部件在各个不同的时间驻留在该计算机的不同的存储部件中,并由该计算机的这个(这些)数据处理器来执行。
虽然连同示范的计算机系统环境(包括计算机70)来加以描述,但是,本发明可用于众多其他的通用或专用计算机系统环境或配置。该计算机系统环境并不意在对本发明的使用或功能性的范围提出任何限制。而且,该计算机系统环境不应该被解释为具有涉及该示范操作环境中所展示的任何一个部件或部件组合的任何从属性或要求。可能适用于本发明的众所周知的计算机系统、环境和/或配置的例子包括(但不局限于)个人计算机、服务器计算机、手持设备或便携式设备、多处理器系统、基于微处理器的系统、置顶盒、包括移动电话的可编程消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境、以及类似物。
可以在由一台或多台计算机或其他设备执行的计算机可执行指令(例如,程序模块)的一般上下文中描述本发明的实施例。通常,程序模块包括(但不局限于)执行特殊任务或实施特殊的抽象数据类型的例行程序、程序、对象、部件和数据结构。本发明也可以在分布式计算环境中加以实践,在这些分布式计算环境中,由通过通信网络而连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括记忆存储设备的本地计算机存储介质和远程计算机存储介质中。
在操作中,计算机70执行计算机可执行指令(例如,这里所描述的计算机可执行指令),以便为资源文件178中的每个资源文件分配名字空间,并根据所分配的名字空间来对它们进行分组。计算机70进一步执行界面,以调用一组资源文件,作为所选择的名字空间的功能;并且在所调用的这个组中搜索将要被安装在该软件产品内的这些标记资源中的一个或多个标记资源。在另一个实施例中,计算机70执行计算机可执行指令(例如,这里所描述的计算机可执行指令),它们用于在资源文件178中的每个资源文件内嵌入识别这些资源文件中所包含的标记资源的元数据。在这个实例中,计算机70根据该嵌入式元数据,在被调用的资源文件中搜索将要被安装在该软件产品内的这些标记资源中的一个或多个标记资源。
精通该技术领域的人将会注意到:除非另有规定,这里所展示和描述的这些方法的执行或实行顺序并不重要。也就是说,这些发明者预期:除非另有规定,可以按任何顺序来执行这些方法的元素;并且,这些方法可能包括比这里所揭示的元素更多或更少的元素。
这个文档中的信息(包括统一资源定位器和其他因特网web站点参考资料)在不预先通知的条件下经历变化。除非另外指出,这里所描绘的范例公司、组织、产品、域名、电子邮件地址、标识语、人物、地点和事件都是虚构的,没有意指、也不应该推断与任何真实的公司、组织、产品、域名、电子邮件地址、标识语、人物、地点或事件的关联。
当介绍本发明的元素或其各个实施例时,冠词“a”、“an”、“the”和“said(所述)”意在意味着:有这些元素中的一个或多个元素。术语“comprising(包括)”、“including(包括)”和“having(具有)”意在包含,并意味着:可能有除所列出的元素以外的附加元素。
鉴于以上说明,将会看到:本发明的几个目的被实现,并达到其他有利的结果。
由于在不脱离本发明的范围的前提下可以在以上的构造和方法中进行各种更改,因此,上文所包含的和附图所示的所有内容将意在被解释为起说明的作用,而不进行限制。
附录A
数据存储和格式:创造工具创建该部件、特点、种类、程序包、产品和SKU。在这个例子中,它们在XML文件(被称作“载体”或“清单”)中得到表现。每个载体只包含特点或种类或程序包或产品或SKU的一个实例。以下是记事本清单的例子:
<?xml版本=”1.0”编码=”UTF-16”?>
<!--由vijayj(ms)利用XMLSPY v5U(http://www.xmlspy.com)来编辑-->
<!--由Vijay Jayaseelan(ms)利用XML Spy v4.4U(http://www.xmlspy.com)来编辑-->
<组合manifestVersion=”1.0”创造者=”vijayj”公司=”微软”
版权=”微软”displayName=”记事本”lastUpdateTimeStamp=”2002-07-31T09:23:00”所有者=”无”发行=”假”测试者=”无”
supportInformation=”http://www.microsoft.com”说明=”单一代码和非单一代码文本文件编辑器.”xmlns=”urn:schemas-microsoft.com:asm.v2”>
<assemblyIdentity名称=”记事本”版本=”1.0.0.0”
processorArchitecture=”x86”语言=”中立”buildType=”发行”/>
<从属性>
<DependentCategory名称=”记事本语言种类”
版本=”1.0.0.0”processorArchitecture=”x86”语言=”*”buildType=”发行”
选择=”一”/>
</从属性>
<从属性>
<dependentAssembly>
<assemblyIdentity名称=”Windows Shell”版本=”1.0.0.0”
processorArchitecture=”x86”语言=”*”buildType=”发行”/>
</dependentAssembly>
</从属性>
<文件名=”notepad.exe”sourcePath=”%_NTTREE%\”/>
<从属关系>
<categoryMembership名称=”文本编辑器”版本=”1.0.0.0”
processorArchitecture=”x86”语言=”*”buildType=”发行”/>
</从属关系>
<registryKeys>
<registryKey keyName=”HKCU\记事本\设置\”/>
<registryKey keyName=”HKCU\记事本\设置\字体\”>
<registryValue名称=”名称”valueType=”REG_SZ”
值=”Arial”/>
<registryValue名称=”尺寸”valueType=”REG_DWORD”
值=”10”/>
</registryKey>
</registryKeys>
<propertyTypes>
<propertyType名称=”DefaultFont”valueType=”字符串”存取=”公用”
readOnly=”假”值=”Arial”regularExpression=”(Arial)|(LucidaConsole)|(Courier)”>
<registryLocation keyName=”HKCU\记事本\设置\字体\”>
<registryValue名称=”名称”valueType=”REG_SZ”
值=”Arial”/>
</registryLocation>
</propertyType>
</propertyTypes>
</组合>