当前位置:天才代写 > tutorial > C语言/C++ 教程 > 实现应用措施中的并行组件共享(一)

实现应用措施中的并行组件共享(一)

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:386

副标题#e#

摘要:探讨 Microsoft(R) Windows(R) 2000 和 Windows 98 第二版本中并行共享组件的实现(如 Windows 认证类型中接头的)。包罗新的并行组件的建设以及利用 DLL/COM 重定向处理惩罚沟通组件的差异版本之间的不兼容性。包罗编写和安装并行组件以及从头打包和测试应用措施的指南。

目次

先容

一点配景常识

新组件共享计策

较量两种计策

建设新的并行组件

并行组件编写指南

安装并行组件

DLL/COM 重定向

利用 DLL/COM 重定向

先容

现代操纵系统和应用措施由很多组件组成。组件是自包括的软件实体,该软件实体提供了一组可被各类应用措施遍及利用的函数。因为单独的组件被多个应用措施利用,所以组件的共享是很有须要的。

乐成的全局组件共享要求任何共享的组件成果和该组件的先前版本完全一样。可是假如不能实现的话,要到达百分之百的向后兼容实际上是很难的,因为测试所有利用共享组件的设置长短常坚苦的。新旧应用措施最终都利用沟通的组件,因此,跟着时间的推移,批改并改造这些组件变得愈加坚苦。

同时,组件的实际成果也不太容易界说。应用措施大概成为依附在组件上的意外副浸染,而不被认为是该组件焦点成果一部门。譬喻,组件中的一个错误大概影响到应用措施,以及当组件开拓者选择批改此错误时应用措施失败,这种环境就是人们常说的“DLL Hell(活该的 DLL)”。这使得那些利用组件的应用措施会越发深该问题的严重性。

这种缺乏向后兼容性的环境使得在陈设新的应用措施时,必需间断已陈设的应用措施,或是牺牲某些新应用措施的成果。所有新的应用措施都要求共享组件的版本与已设置的版本差异。要在加强应用措施不变性的同时提供乐成的共享,Microsoft 已在 Windows 2000 和 Windows 98 第二版本中引入了并行共享,开创了通过选择性断绝来共享组件的新方法。

一点配景常识

在相识并行共享的具体信息之前,让我们看一些配景资料以及“DLL Hell”的问题。

组件共享

Windows 最初就采用了共享的观念。所有操纵系统都在提供不变性、完整的处事集的需求与操纵系统所要求的硬件的资源限制的之间寻求均衡。到今朝为止, CPU 用量和磁盘空间仍然是 PC 平台中很是告急的资源。很显然,要将操纵系统和应用措施代码装入到一个很小空间,必需尽大概地共享代码。与很多其他长处对比,代码共享增强了硬件资源的平衡运用,而且最洪流平地淘汰在前期质量担保检测中袒露的问题。代码共享是使 Windows 乐成的要素之一。

Windows 的共享并不限于代码。应用措施和组件的状态,可以用注册表状态的形式、文件系统中的应用措施专用数据存储的形式和果真全局定名空间的 Windows API 的形式,在整个操纵系统中找到。这类共享,在多个软件供给商出产的应用措施之间提供了高级此外互操纵性,低落了本钱,提高了软件的效率。

可是,共享也必需支付一些价钱。共享意味着应用措施互相依赖,引入了懦弱性因素。变动某一组件会对其他组件发生无法预料的影响。典范的环境,一个应用措施大概依赖于共享组件的一个特定版本。而另一个应用措施大概是用该共享组件的进级(或降级)版本安装的,因此第一个应用措施大概受此变动的影响。在极度的环境下,曾经事情正常的应用措施会溘然成果紊乱,甚至失败。这种环境凡是称为“DLL Hell”。

断绝

在系统中,共享的后面是断绝。通过将所有资源和代码静态地绑定到应用措施,可以断绝应用措施。可是如今对付依赖于 COM 或其他全局存储的系统资源的应用措施来说,完全的断绝是不行行的。

淘汰应用措施懦弱性的一种办理步伐是,有选择地断绝应用措施和组件。在这种方案中,所有应用措施大概都具有对沟通组件的会见权,但该组件今朝有多个版本可用。组件开拓者有权体例旧组件的新版本、作一些改造或批改错误。而客户可以选择适合于特定应用措施的版本。就像走进一个汽车配件商店为您的 1984 Chevy 挑选一个燃油泵一样。您会发明货架上的这个泵和一些比它晚来的合用于其他车型的泵并行放在一起。在利用组件的环境下,要害是提供适合于每个应用措施的版本而且断绝其他差异的版本。并且,在重定向的环境下,应用措施可以举办设置,以利用适合于该特定应用措施的组件版本,而不管最近开拓的或今后将要开拓那些版本。


#p#副标题#e#

并行共享

#p#分页标题#e#

为勉励这类断绝,Microsoft Windows 2000 和 Windows 98 第二版本的新的组件共享形式叫做并行共享,它利用选择性断绝最洪流平地淘汰 DLL Hell。并行共享答允沟通组件(COM 或 Win32)的多个版本同时在差异的历程中运行。因此,应用措施可以利用设计并测试过的组件的特定版本,而不管另一个应用措施要求该沟通组件的差异版本。这种布置答允开拓者成立并陈设更靠得住的应用措施,因为开拓者能指定他们的应用措施利用的组件版本,和系统中其他应用措施无关。

新组件共享计策

Windows 2000 和 Windows 98 第二版本中的并行共享遵照以下两种计策:

建设并行组件。开拓者结构一些新组件,它们支持该组件多个版本的同时执行。这些新组件的用户此刻可以或许利用已成立并安装的版本,不管在计较机中安装了哪些其他版本。

DLL/COM 重定向。开拓者和打点员从头包装现有的应用措施和组件,使要求的共享组件版本专门用于需要它们的应用措施,各自与其他版本并行利用。

并行组件,岂论是最近建设的照旧现有的、或从头设置的应用措施的一部门,并不是所有的方案都支持。

建设并行组件的景象主要产生在当在另一个容器应用措施的内部被主持的进程中。譬喻,假如您的控件将要由桌面 Windows 应用措施(用 Microsoft Visual Basic(R) 或 Visual C++(R) 语言编写)利用,那么这些控件最好利用并行设计。不推荐在处事器中利用并行组件。

DLL/COM 重定向的景象主要产生在,新的客户端应用措施正在陈设到已经支持几个其他应用措施的计较机上时,可能正在陈设新的客户端应用措施的处所,要求它对由于其他应用措施的安装所引起的共享组件的变动有更大适应力。不推荐在处事器中利用 DLL/COM 重定向。

留意  DLL/COM 重定向致力于办理陈设现有应用措施和组件时的应用措施斗嘴。在开拓新的应用措施或组件时,最佳计策是陈设被天然断绝的并行组件。

较量两种计策

下表较量两种要领,DLL/COM 重定向和建设并行 (SxS) 组件,并指导如作甚您的方案选择正确的要领。

表 1. 并行计策较量

属性 SxS 组件 DLL/COM 重定向

主要核心是什么? 成立不变的新组件,使它在今后版本中将免受造成组件“向后不兼容”的变动的影响。 将现有应用措施与由于其他应用措施安装了不兼容的共享 DLL 而导致的问题隔分开。

指定的版本对付利用它们的应用措施来说是断绝的吗? 是。SxS 组件老是该当陈设成:对付利用它们的应用措施来说是断绝的。 是。利用 DLL/COM 重定向的应用措施利用安装在该应用措施目次中的共享组件的版本,不管在系统中安装了哪些其他版本。

需要新代码照旧对现有代码举办修改? 是。成立 SxS 组件(或编写现有组件 SxS)至少需要将 COM 注册代码变动为答允按相对路径举办会见。大概需要一些附加编码变动,以确保在 SxS 运行版本之间正确地处理惩罚全局状态。 否。DLL/COM 重定向答允应用措施从头设置为,不需要变动任何代码或从头编译便能安装并运行 SxS。这答允没有应用措施源代码会见权的打点员便能从头设置它以办理 DLL Hell 问题。

该计策在所有方案中均回收吗? 是。SxS 组件被设计并编码以安装并运行 SxS。因此,颠末精采设计、开拓和测试的 SxS 组件(以及利用它们的应用措施)将不会有与 DLL Hell 相关的问题。 否。DLL/COM 重定向不要求改变代码。现有的应用措施和组件大概没有按同时运行多个版本的要求举办设计。履历表白在大大都环境下现有的应用措施和组件可以运行 SxS,但需要举办测试才气确认对付特定方案是否是这样。(请拜见 选择要断绝的组件。)

一般的通例处理惩罚要领:

假如 DLL Hell 问题影响到现有应用措施的陈设,可利用 DLL/COM 重定向断绝斗嘴的组件(要进一步相识该选项,请拜见下面的方案)。

假如正在成立新的应用措施,而且要针对 DLL Hell 问题举办设计和陈设,则开拓并行组件。

#p#副标题#e#

建设新的并行组件

并行共享,要求开拓者在建设新的应用措施时编写并行组件。它们都是普通的 COM 或 Win32 组件,不外它们安装在应用措施目次(或其子目次)中,而不是系统目次中。它们是与特定应用措施断绝的,而且不被所有应用措施全局共享。

因此,组件可以安详地与安装在其它处所的同一组件的差异版本,并行安装在另一个应用措施目次中。假如系统中的另一个应用措施要求(因此安装了)差异的版本,您的应用措施不会受到影响。这两个应用措施将和它们各自的组件版本一起运行。

#p#分页标题#e#

假如另一个应用措施在系统中安装了新的组件版本,您的该组件版本将保持稳定,因为您已将它安装到本身的应用措施目次中。在其他应用措施利用它的版本的同时,您的应用措施继承利用随该应用措施提供的组件版本。操纵系统可以同时加载这两个版本。

同样,因为并行组件对付安装它的应用措施是“私有”的,所以应用措施的卸装措施始终可以安详地删除并行组件,凭据界说,任何其他应用措施都不能依赖于私有组件。

留意  并行组件必需通过操纵系统正确注册(在本章后头部门中说明),组件的每个版本才不会与该组件的其他现有版本斗嘴。

留意  Windows 2000 和 Windows 98 第二版本均支持并行共享。以前的 Windows 操纵系统不支持它;可是,在这些系统中,可以在系统目次中安装一个并行 DLL(凭据下一节中的指南编写的 DLL)。因此,DLL 以全局共享(向后兼容)方法事情。应用措施必需动态地查抄操纵系统版本以确定要利用的共享要领。

并行组件编写指南

下面的指南概述了在发生并行组件(COM 或 Win32)中涉及的事项。当您编写这类组件并将它们放在应用措施目次中时,您的代码被私有化为该应用措施的上下文。当您将数据放入以该应用措施名称为根项的注册表项中时,该数据被私有化为该应用措施的。

您的并行组件的用户,与您的组件的其他用户所需要的变动绝缘。您还可以或许更新您的组件,而不必担忧粉碎现有的应用措施。应用措施可以或许安装您的组件而不消从头引导,纵然另一个应用措施正在利用该组件的差异版本。

留意  这些指南是当前 Windows 认证指南的更不变的形式,它汇报用户将 Win32 DLL 放在应用措施的目次中。

一般事项

不要实验替换受“系统文件掩护”(随 Windows 2000 提供)所掩护的任何文件,包罗大部门 .sys、.dll、.exe 以及 .ocx 文件。

必需测试所有组件以确保并行的有效性,尤其在大概呈现共享的区域中,因为没有任何由当前操纵系统强制的并行。

将所有版本特命名称一起收集到 #defines 中,以便于将源代码从一个版本迁移到另一个版本。执行此操纵答允用户在某个位置变动版本;然后自动变动所有注册表项。譬喻:

#define MyRegistryKey "MyAppv1.0.0.0"

刊行组件的新版本时,只需要在某个位置变动该版本。

谨防丧失对组件举办快速批改的本领,因为它们正在随意定位的应用措施目次中。作为组件开拓者,您大概不知道所有需要批改组件的位置。应用措施供给商需要向用户分发更新。

谨防由于疏忽所造成的交错历程共享。譬喻,共享的内存部门大概导致问题,因为该部门内存不能在组件的差异版本之间交错共享。

需要将所有共享的数据布局设计成并行(对付组件的每个版本有所差异),包罗内存映射的文件、互斥措施、定名管道以及硬件驱动措施。

必需将不是恒久生存的数据存储在 TEMP 目次中。

不要将用户数据放在全局位置。应用措施数据和用户数据应该明晰分隔。

加强您的组件

在安装和卸装由差异供给商提供的组件进程中,必需正确引用全局注册表中 GUID 的计数。在 GUID 注册表项下维护一个引用计数是执行该操纵最靠得住的要领。

HKEY_CLASSES_ROOT\CLSID\{GUID}\InprocServer32

Default=foo.dll

ThreadingModel=Apartment

RefCount=1

留意

必需引用与 GUID 无关的 DLL 计数。

不要注册 COM 注册表的完整路径名,可以依靠应用措施目次的目次搜索查找您的组件及其从属。

假如变动了 COM GUID 下的元数据(如线程模子),则需要为组件改名,并应用新的 GUID,因为它是组件的有效新版本。需要执行此操纵是因为注册表中的数据在另一个应用措施的上下文中(具有该应用措施私有的组件版本)大概无效。

在您的 DLL 中,而不是在单独的文件中,必需包括范例库。

不要利用 LoadRegTypeLib ,通过注册表加载范例库。注册表中范例库的注册表项是全局状态,而且以私有法则运行计数器。因此请利用 LoadType Lib。

OLEAUT 建设外部范例库新版本的本领是懦弱的,而且易于失败。发起不要对并行组件利用外部范例库。

 

    关键字:

天才代写-代写联系方式