COM,Component Object Model 简介

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

COMComponent Object Model 简介

1. COM 是什么

COM 的英文全称是Component Object Model中文译为组件对象模型。它官方的概念是

The Microsoft Component Object Model (COM) is a platform-independent, distributed, object-oriented system for creating binary software components that can interact. 

与其说 COM 是 System更确切的说应该叫做 Standard。因为它实际上是一套公共的 binary 标准用于规定 software component 的接口的标准。也有人会把 COM 叫做 Common Object Model但这其实是一种误传起源于当初一名微软的工作人员 Mark Ryland

但是在长期的使用中大家口中念叨的 COM 渐渐生出了各种各样的含义已经不仅仅是最初的含义了。这也是为什么对于初学者来说理解起来特别费劲。因为总会查到层出不穷又参差不齐的含义让人很疑惑到底哪个含义才是标准

  • 首先在系统设计上它是一种设计理念
  • 然后在 Object 的世界中它是那个世界中的规范和标准
  • 再然后在编程语境下它是一种可以调用的其他程序的接口
  • 再然后在实际的电脑文件中它多数是一个个DLL 文件
  • 最后在内部性质上它是一个个二进制Binary的小程序

其实在我 Research 的时候这些概念也是最头疼的地方。因为对 COM 概念的不了解所以无法区分在不同视角或者不同角度下的概念。而在 Research 的时候往往会看到很多不同的网页给出各种 COM 的概念。而让人头疼的就是这些概念都不统一让人无法理解。甚至开始怀疑这些网页真的都是说的同一个东西的概念么?这种混乱就是因为不同的网站在解释 COM 的时候用的是不同的角度。而同一个东西在不同的角度和情景之下自然会有不同的含义。所以往往 COM 到底是什么要因情景而视之但是上面列出的几个角度已足以让我们对 COM 的概念构建出一个较为立体的理解了

COM就是一个可以用于构造组件的模型。组件就是一个程序包(Package或者一段功能模块(module或者说是一个可执行程序(EXE或DLL。作为一种模型COM组件对象模型规范(The Component Object Model Specification的正式文献中完整地给出了定义。该文献制订了一个二进制标准允许异构型组件无缝地相互协同工作。COM就是这样的一个二进制标准允许异构型组件无缝地相互协同工作。COM就是这样的一个二进制标准因为它允许一个组件在无需另一组件源代码的情况下重用该组件。除了作为二进制标准COM还指定了一系列规范和要求用以构件软件组件。然而它仅仅是一种规范并不强制使用某种特定的语言、工具或操作系统来创建组件的软件。

2. 科技历史与 COM 的由来

要了解 COM 的历史由来我们首先要从科技发展的历史开始捋顺下来。先说 Object Oriented 这种概念其实这种概念据说是19世纪60年代就有了是源自于 MIT。但是那个时候 PC 还没有普及大多数公司使用的都是十分昂贵的大型机微软还没有成立这种情况下自然对软件的需求也是非常基本的大多数停留在数学计算文字处理和军事使用的范围。而且那个时候CPU 的概念都还没出现自然电脑也是不可能具备足够的运算能力的。第一个 CPU是 Intel 在 1971 年为完成一家日本公司的订单而设计发明的自此才解锁的计算的巨大潜力进入了现代计算机的篇章。而 CPU 的发展与成熟才造就了后来的软件行业。微软也于 1975 年正式成立。同年IBM 也开始生产 Portable Computers。那时起微型电脑开始变成潮流。Microsoft BASIC 这种最早期的编程语言也诞生于 1975年。那时候绝大多数的微型电脑虽然系统都不同但是几乎都支持 BASIC 这种编程语言。正是这种编程语言成为了日后微软的基础。1981年微软首次为 IBM 提供了操作系统叫做 QDOC是微软的第一套系统但却是买来的别人研发的系统。1983年微软研发出了 Lotus Software是最早期的电子表格软件这个软件成为了 IBM 电脑上的明星软件装机必备。后来 1985年 Windows 1 诞生了同时伴随着 Microsoft Excel 的诞生。自此之后软件行业开始变得日益繁荣微软也开启了自己的软件帝国。

软件行业变得日益繁荣但是 Object Oriented 这种思想还并没有发展到一定的高度。那时候开发个软件或者系统是非常麻烦非常复杂的。日后想给软件添加一个功能或者升级一个功能时就更麻烦因为没办法独立的去更新或者改进某一个特定的功能。若想要添加新功能需要全盘改动后再重新进行编译非常的费时费力。于是人们就开始想办法解决上面这个问题然后 Object Oriented Programming(面向对象的编程的概念就开始兴起。这时虽然面向对象编程的概念已经兴起但是还没有统一的 Framework 或者说是标准能让不同软件之间里的 Object 可以互相交流。于是不同的软件就变成了一个个孤立在大海中的小岛里面住着一堆 Objects无法和外界交流。人们想出的解决办法就是开发一个系统或者体系在这个体系中写软件的人只需要制造出Software Component 就行了。而这个 Component 就像是买回来一个方块形的电子配件一样插在我们自己的电路板上就可以开始发挥作用。而这些Software Component 外表上必须遵循系统中的统一标准而内部就随便怎么编程都可以。后来微软在1993年开发出了这个标准这标准就被叫做Component Object Model (COM)。

我们再把 COM 形成前后的技术发展掰开来看下。首先在 1987年也就是在 Windows 2 发行的时候Dynamic Data Exchange (DDE) 技术产生了作为一种进程间通信手段(Inter-process communication。在这个技术之前只支持系统和客户端应用程序之间的通信这个通信则是通过 Windows Messaging Layer 实现的。而 DDE 技术则再此基础之上实现了客户端应用程序之间的通信这也就成为了进程间通信技术的开端。但这时的通信还只是停留在 Text conversations 和 Windows messages 的层面上。之后 Antony Williams 分别于 1988年 和 1990年 发表了两篇微软内部文章分别是 【Object Architecture: Dealing With the Unknown】和【On Inheritance: What It Means and How To Use It】。正是两篇文章奠定了日后 COM 产生的理论基础。之后1991年微软在 DDE 的基础上开发出了第一个 object-based framework(基于对象的框架叫做 Object Linking and Embedding (OLE)即对象的连接与嵌入。

这个技术是同 Word 软件的发行一同发布的专注于实现 Compound document(复合型文件就是将 Excel 文件嵌入到 Word 中。同在 1991年微软发布了 Visual Basic 1.0 编程语言并以 dynamic-link library (DLL) 的形式附带了 Visual Basic Extensions (VBX) 插件。这个插件让使用者可以通过 Properties and Methods 来操控 objects (对象。1992年随着 Windows 3.1 的发布OLE2 和它自己的 Object Model也一同发布了。和 OLE1 不同OLE2 是在 COM 概念的基础上重新实施的。这时的 COM Application binary interface (ABI)即 COM 应用接口的标准也发生了改变。1994的时候微软宣布OLE2 改名为 OLE从此 OLE 变成了微软组件技术(Component Technologies的统称。同年还发布了 OLE Custom Controls (OCXs) 作为 VBX 的升级版。后来在1995年微软发布了 Visual Basic 4.0开始支持 OCXs这时微软也开始考如何让 COM 组件可以实现跨语言支持。这就要求COM 架构下必须要提供一个一致的接口以及提供一组可以调用接口内方法的能力。此后才发展成了我们现今熟悉的 COM 的含义。在1996年微软有发现 OCXs 可以应用在浏览器上所以就把部分 OLE 改名为 Internet “ActiveX”然后逐渐的所有的 OLE 都改名叫做 ActiveX 了。同年后期微软又拓展了 COM 的能力使得组件对象拥有了在网络上通信的的能力。这个技术被称为 DCOM (Distributed COM。自此便形成了今时今日的 COM 的概念。

3. 接口(Interface周围的概念

个人认为关于 COM的一切的一切最后都是为了这个“接口”。因为只有有了“接口”才算是真正的实现了 Component Object 的理念(或者说才算是实现了把 Object 变成 Component 的想法。因为只有有了“接口”Component 才能被叫做组件才能被调用。所以下面简单描述下几个常见的围绕着“接口”的概念。

3.1 API (Application Programming Interface)

API 中文为应用程序编程接口;很多时候都被直接叫做 接口 (Interface)。接口操作系统程序库提供给应用程序的接入点让应用程序能调用系统某一方面的功能。其主要作用是让开发人员可以轻松调用这些功能而不需要了解到底怎么做到的和底层代码。但是API 并不是代码他只是一个接口或者说只是一个地址。

3.2 IDL(Interface Defining Language

IDL 中文为接口描述语言。它是一种 Specification language(规范语言。是用来描述软件 Component 的 API 的 “规范语言”。与之相比Programming Language(编程语言是可以直接运行用于系统实现的形式语言。而“规范语言” 是通常不能直接运行的而是用于系统分析和设计的描述语言。然后这些一段一段的用来描述 Interface 的文字就被储存在了 IDL 文件中(文件后缀就是 .idl。每个这样的文件里面都有一个 header 和一个 body。格式很整齐。

3.3 OLE (Object Linking and Embedding)

OLE 中文为对象链接与嵌入。是能让应用程序创建包含不同来源的文档的复合文档技术。OLE 是建立在 COM 理念的基础之上的。COM 是理论框架而 OLE 是根据这个框架实施出来的一套技术。正如之前在PC Mag 杂质上看到的一个副标题就很好的诠释了这种关系型

COM-the master plan that lets Windows apps interact through OLE.

一个比较常见的例子就是把 Excel 表格整个插入到 Word 文档中。而这个 Excel Object就是通过这个 OLE 技术连接并嵌入(Linking and Embedding到 Word 中的。但正如上文所说后来 OLE 就变成了微软组件技术(Component Technologies的统称。而像这样的一个典型的 OLE 功能(或 OLE 特性其背后是有一大堆Interface(接口作为支持才得以实现的。

3.4 GUID (Globally Unique Identifier)

GUID 中文为全局唯一标识符也被称为UUID (Universally Unique Identifier)即通用唯一识别码。是一个用于标识信息的128-bit的标识符;由一组32位數的16进制的数字组成。数字串的格式为 8-4-4-4-12 的32个字元;大概长成这样550e8400-e29b-41d4-a716-446655440000。GUID 具有全球唯一性出现重复的概率几乎为零。所以才叫做全局唯一标识符。

3.5 CLSID (Class IDentifier)

CLSID 中文为类标识符。是一个 GUID但是是专门用于标识 COM class object 的。每一个 OLE Class都会有一个与之对应的全球独一的 CLSID。

3.6 ProgID (PROGrammatic IDentifier)

ProgID 可以翻译为程序标识符或者编程标识符。通常情况下每个 CLSID都会有对应的 ProgID。例如ProgID 是 Msxml2.DOMDocument 的字符串;而 CLSID 则长成这个样子 {F9043C85-F6F2-101A-A3C9-08002B2F49FB}。所以 ProgID 的存在是为了编程的时候方便调用。

3.7 Registry (Windows)

Registry 中文为注册表。它是一个 hierarchical database (分层的数据库)。用于储存 Windows 系统或者应用程序的 low-level settings。但并不是所有的应用程序都选择把设置存在注册表里。Registry 是从 Windows 3.0推出 OLE 的时候开始有的。在那之前应用程序都是把自己的设置信息存在一个后缀为 .ini 的文本文件中的。除了设置之外所有的 OLE Objects 的 CLSID 也都储存在这个 Registry 中。感兴趣的同学可以去 Regedit.exe 中这个位置 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID 看下所有的 CLSID 都长成什么样。而在每个 CLSID 的“文件夹”中又都会储存着这个 Class 的 ProgID 的名字。

4. 调用组件的流程

阅读到这里的同学应该已经对基本的概念有一些了解。那么我们就再来看下在实际运行中Component(组件到底是怎么被调用的。就用在 Word 里面插入一张 Bitmap Image 来举例;当我们在 Word 程序里点击插入 Object 的时候Word 会弹出插入对象的对话框。然后程序会立刻开始扫描系统的 Registry看哪些 Object 是能够插入的然后把它们都列在你面前供你选择。当你选中 Bitmap Image 这个对象后程序会立刻调出他的 ProgID 名字然后把这个名字递给一个叫做 CoCreateInstance 的 OLE Function。再然后在这个 Function 的内部就开始了一系列流程。

首先 OLE 会用立刻这个 ProgID(或者 CLSID去找出与它对应的 Regstry 条目。然后通过注册表里登记的信息便可以轻易的找到提供这个“服务”的应用程序或者 Component(.exe 或者 .dll到底住在哪里。一旦找到了便可以立刻调用(Invoke这个 Component然后创建出一个 Bitmap 对象的 Instance(这个Instance似乎也叫做 Interface Pointer。

这和我们写代码的时候是一样的在我们要使用某个模块的功能之前都是先通过 PorgID 创建一个 Instance(例如在 VBScript 中通常是用Set XL = CreateObject("Excel.Application")这样的语句。然后通过这个 Instance和它提供的 Interface(接口我们就可以开始调用这个实例的各种属性和功能了(例如 XL.Workbooks.Open("FilePath")

5. DCOM分布组件对象模型

5.1 概述

在 Microsoft 推出 Windows NT4.0 之后以往只有在大型主机或者工作站上才可能出现的分布式处理终于可以在PC的世界中工作了。造成 Windows NT 可以成为企业计算环境。除了NT的日渐成熟和执行效率增加以外最重要的就是加入了DCOM(Distributed Component Object Model的功能。Microsoft 在NT4.0 中第一次推出了该项技术但是接着推出了DCOM For Windows95在其推出的 Windows 98 中更内置了DCOM。它代表着使用 PC 环境也可以处理非常庞大和复杂的计算工作。通过该技术PC级的程序员终于可以进入分布式对象的世界了。

Microsoft 的 COM 模型能够让同一台计算机中的各种对象相互沟通和使用对方提供的服务而 DCOM 则更进一步地让不同的应用程序和对象可以在网络中不同的计算机之间沟通。这意味相可以在应用程序中或者动态链接程序库中建立对象并且提供这个对象的各种服务然后在另外一台不同的机器中的应用程序可以调用这个对象的方法或者是访问它的属性值。 DCOM 为什么如此重要呢?图为目前软件发展的趋势是走向以组件为基础的分布式计算 , 而在不同的织件中需要一个相互沟通的通信协议。这就像 PC 中的各种适配器 , 它们是援在 PCI 和 ISA 等总线之上 , 通过总线和其他计算机组件迹行沟通。组件也需要一个相互沟通的总线 , 使用一致的通信协议来沟通而 DCOM 就是这种组件的总线。它负责各种组件之间的信息传递。如果没有 DCOM那么就达不到分布计算环境的要求。

DCOM 是构造于 COM 之上的。在 COM 中程序通过指定一个对象的ID(Class GUID和要访问的接口 ID就能够访问这个对象的特定接口中的方法和属性。

在这里插入图片描述

COM 模型中访问对象接口中的方法或属性如上图所示在 COM 的基札模型中不同的应用程序和对象之间可以通过指定对象和接口 ID 来取得对方的服务 , 但这种模型是发生在同一台计算机中。如果在 A 计算机中的应用程序或者对象希望访问在计算机 B 中的特定对象的服务 , 应该怎么办昵?在基本的 COM 模型中无法做到这一点Microsoft 用 DCOM 解决了这个问题。如下图所示 :

在这里插入图片描述

从上图可以看出在使用 DCOM 时和使用 COM 建立对象的方式是相同的只需再加入一个机器名称的参数。如果在 COM 中是使用 Windows API 的CoGetClassObject 建立对象的话那么只需要再输入机器名称的参数即可在远程指定的计算机中建立对象并且取得指定接口的信息 . 简单的说 , DCOM 是 COM 的延伸它让对象和接口的建立可以跨越不同的机器并且保持和 COM 的兼容性。它构造于 RPC(Remote Procedure Call的技术之上 , 并且使用 TCP/IP 作为网络通信协议。 NT4.0 和 Win98 部直接支持 DCOMWin95 中可以安装 DCOM For Windows95 来支持它。Microsoft 对 DCOM 也在进行不断的完善例如在 NT4.0 的 Server Pack 1、Server Pack 2、Server Pack 3 以及 Server Pack 4 中 , 对 DCOM 的支持越来越好 , 其中在 Server Pack 2 中有一个 DCOM 非常重要的功能是开发 N-Tier(多层应用程序必须使用的。现在 DCOM 已经占据了非常重要的地位Microsoft 的 SQL Server、Transaction Server. Message Queuing Seryer 等部充分利用 DCOM 来进行企业中的分布式计算。

5.2 COM/DCOM 包含的技术

COM 规范包含了几种成功的技术包括动态链接、口向对象的模型和客户/服务器模型。

5.2.1 面向对象的模型

面向对象的编程之所以成功 , 正因为它支持封装、继承性和多态性。我们将简要地回顾一下这些传统概念。这桦 , 我们就可以大致了解 COM 是如何吸收斧改进它们的。

5.2.2 封装性

封装性(encapsulation或者隐藏变量和可能存在的函数使调用程序只看到它所需要看到的信息这是面向对象编程的重要原则。对议用程序隐藏了信息对象就可以控制其内部变量并防止意外错误和非法的外部访问发生。这一点十分重要因为它在容许调用程序可靠地使用对象的同时也使对象改变或增强其内部功能所需的维护最小化了。除了支持对状态(state和行为(behavior的列集外封装允许我们把接口和实现分离开来。总体来说对象所发布的行为集合就称为“接口“。外部世界与一个对象都是通过它发布的接口来相互作用的。将接口与实现分开意味着这个世界无需理会那些隐藏在发布了的行为之后那些烦人的实现方法。这些行为在对象周园有效地构筑了一道栅栏封装和保护了对象内部的实现和数据。既然客户只能看到发布了的行为 , 水远看不到内部的实现和数据这样就减少了对象与其客户之间的糊合(coupling。COM 不仅支持和吸收了封装性 , 而且大力加强了这一概念。COM 要求区分接口与实现。在 COM 中 , 外部世界只知道一个对象支持的接口而永远无法看见这个对象的内部实现。凭借封装的严格性COM 赢得了它今天所拥有的卓然地位。这是因为正确使用封装能够获得“黑盒“(black box式的组件集成。此概念允诈在不破坏原完整系统的前提下 , 计组件在以后的一定时间里升级发展。

5.2.2.1 继承性

继承性(inheritance可用于扩展或继承类的状态和行为。最初定义的类称为“基类“(base class, 由它扩展所创建出来的新类秘为“派生类“(derived class。简单继承提供接口和实现的重用性。这一概念强有力的地方在于你不必通过不断地复制和粘贴代码来实现时可怜的代码重用。通过继承堆类 , 就可以得到基类建立的所有状态和行为。更有吸引力的是实现继承性 , 即重复使用先前写好的代码。

通常情况下重用可以在源代码级上完成但是对于组件世界重用可以在二进制级上完成。二进制级的代码重用允许那些不同的软件发行商不再受限于某种编程语言或工具允许开发的异构组件间有更多的协同合作。

5.2.2.2 多态性

多态性的意思是使用同一个名称去引用一系列不同的方法(函数。这一概念允许在运行时基于某一个对象选择最合适的那一种方法来实现。换句话说它支持迟绑定(Iate binding即在运行时根据对象的真实类型动态地、有选择地去调用某个方法。

客户/服务器模型

客户 / 服务器模型有许多优点但没有哪个优点能像系统的稳定性那样激动人心。在客户/服务器的世界里一台服务器可以同时支持很多客户。如果其中一部客户瘫痨的话 , 它不会拖垮服务器和其他的客户、同理如果服务器崩溃了只要那些客户处理断开连接 , 也不会受到影响。稳定性正是 COM 要包含客户/服务器模型的主要原因。为了讨论方便 , 我们假设“客户“(client就是使用其余实体(任意一段代码的服务的某一个实体而“服务器“ (server) 就是服务于客户要求的一个实体。如果你接受这个简单的假设 , 就可以很容易地推出一系列客户/服务器的类比

  • 一个进程(客户通过简单的函数调用与一个DLL(服务器进行通信。
  • 一个进程(客户通过系统调用与操作系统(服务器通信。
  • 一个进程(客户使用命名管道与同一机器上的另一个进程(服务器通信。
  • 一个进程(客户通过套接字(socket与另一远程机器上的另一进程(服务器通信

在上面的这些方案中你己经见识了客户/服务器的概念。但是这里还有个问题在每个方案中客户和服务器之间的通信都是不同的。具体说来你看见了四种不同的客户与服务器协同合作的方式。为了消除这些差异COM 指定了一条所有组件都必须遵守的通信标准。这条通信标准就是 COM 接口 也可以看作一个容户与一个服务器协同合作的通用途径 。有了 COM 接口 , 大家就可以在单一的通信方式一一也就是说一种通用语言上达成一致。COM 从 RPC 处继承了这一标准支持客户/服务器通过一个 RPC 接口通信。

6. COM/DCOM 的功能和服务

一个分布对象的体系结构要支持许多公认为必须的特征位置透明性、动态和远程对象的激活、安全性、接口、生存期支持和动态发现、二进制互操作性、连接管理、并发管理、重用、接口储藏库、实现储藏库、静态调用、动态调用和事件。

6.1 位置透明性

当一位客户用 COM 调用一个方法时它认为此方法是在本地执行的。但事实上此方法可以存在于网络空间中的任何地方。它可以和客户位于合一进程中位于同一台机器的不同进程中或者位于第三方机器的一个进程中这就是位置透明性的含义。

位置透明性主要依赖列集。位置透明性的优势在于 , 针对某一目标编写代码时不必考虑目标的物理位置这样赋予程序更大的自由度和可移植性还可以允许更好的伸缩性和容错性。

6.2 动态和远程对象的激活

COM SCM 支持远程激活可以在任何支持 COM 的机器上安装。它的目的是应客户的请求动态地定位和激活分布式对象。如果对象存在于同一台机器的 DLL 中COM 会为使用此对象的客户进程动态地加载 DLL。如果对象他在于同一台机器的独立可执行文件中COM 会要求其本地的 SCM 激活该可执行文件这样客户进程就可以使用此对象了。如果对象存在于一台远程机器中就需要一定的协调了。在这种情况下客户机上的本地 SCM 会与还程 SCM 联系而远程 SCM 会负责激活远程 EXE 或 DLL。对远程 EXE远程 SCM 仪仅产生它罢了但对远程 EXE远程 SCM 要激活一个己注册的代理进程来动态加载此 DLL。

6.3 安全性

COM 支持启动、访问和调用级的安全性。启动安全性或者叫做激活安全性决定谁可以启动或激活服务器组件从而保护了服务器。COM 也支持扮演。这一特性允许服务器在激活或执行客户进程的那个用户的安全环境下运行 , 换句话说服务器可以完成系统中其他部分允诈该客户所做的事情。在扮演客户后对象做的所有访问都受到该客户的用户安全环境的限制。在扮演客户完成其任务后 , 对象就会返回到自己的安全环境中。

6.4 接口

在时间和空间上 , 每个接口都是独一无二的 , 因为它被分配了一个 IID那是一个 128 位的 GUID。这同时也意味着版本的支持实际上是自动的因为每个接口都包含了在全局唯一的标识符。

6.5 生存期支持和动态发现

对象最重要的特征之一就是其生命周期因为对象必须被正确地创造和销毁。在 COM 中使用引用计数来支持对象的生存期管理。通常一个对象会保留所有客户的计数。每当一个客户要求使用一个对象的接口时该对象的引用计数就会增长而当一个客户释放了接口引用计数就会减少。一旦此引用计数达到零 , 该对象就会自动清除并销毁掉自己。

6.6 二进制互操作性

二进制互操作性是软件重用的一个重要方面。当部署一个开发函数库时必须装载头文件和库文件。如果以前的客户必须把库链接进他们的系统才能让他们的系统工作那么组件技术诞生后只需装载二进制代码就可以工作了不需要头文件也不霁要链接到库文件。二进制互操作性不仅让软件集成更容易它还允许了插件组件的开发和集成。

6.7 连接管理

简单的连接管理依赖对象的生存期管理。对象一直与客户保持虚拟的连接如果引用记数大于 0对象就假想客户一直活动。但是如果客户由于某种原团没有释放引用的对象那么对象将永不释放其占有的资源。COM 通过一种简单的偏执检查(paranoia check来支持连接管理。每个 COM 机器都运行了一个名为 OXID 分鲜器(resolver的特殊协调器/管理器 (coordinator/manager、服务器端的 OXID 分解器监听来自客户 OXID 分解器的 ping。客户端的 OXID 分解器聚集针对某一特定机器的所有 ping这种根集称为一个 ping 集由一个动态产生的 ping SETID (集标识符来表示。有了聚集客户端的 OXID 分解器可以只给服务器的 OXID 分解器发送一条 ping 信息 , 但是代表个很多客户到服务器的 ping从而减轻了网络负担。为了进一步提高性能 COM 定期在集合中传送变更(增量如果服务器的 OXID 分解器连续三个周期没有收到某一个对象的 pingCOM 就认为客户已经不存在并执行垃圾回收工作。

6.8 并发管理

COM 将不同并发语义(concurrency semantics的对象分离开来归入独立的执行环境称为套闭(apartment。对象在它自己的套间里生成、存在和死亡 ,
如果要在另一个套间中使用这个对象必须对它列集。列集意味着引入套闭要处理一个对象的代理而不是原始对象此代理对象在引入的套间中存在并和它的客户代码共享相同的并发语义。COM 提供了许多的不同的线程和并发模型来支持异构组件的软件开发。

6.9 重用

COM 支持包容(containment和聚集 (aggregation。包容可用于将被重用的对象隐藏在正在开发的对象之后然后发布一系列通道(passthrough或代理方法来让客户使用这些隐藏对象的服务。当客户调用通道方法时需要将这些调用委派到正在重用的包容对象里。聚集可以把重用对象的接口直接暴露给客户。为了聚集对象必须将他的 Iunknown 指针传递给被重用的对象 , 以便生存期管理可以正常工作。

6.10 接口储藏库

为了使重用和集成更简单 , 一个分布式对象的环境必须提供一种让客户发现对象及其支持的接口的方式。在 COM 中 , 一个对象的类型信息在接口的储藏库中详细的存储称为类型库(type library。类型库存储与其对象及其所支持的服务有关的全部信息。通常 , 一个类型库是一个独立的二进制文件 , 以 .tlb 作文件的扩展名。

6.11 实现储藏库

如果已经得到了一个组件的信息仍然需要找出该组件的位置。在分布式环境中一个实现储藏库存储了对象实现的位置。COM 通过注册表来支持这一概念。COM SCM 使用记录在注册表的某一特定的实现的位置来动态地激活对象。

在客户端SCM 查找注册表来决定远程组件在什么位置。然后 , 和服务器计算机上的远程 SCM 联系该远程 SCM 查找它自己的本地注册表来获得组件的位置信息 , 从而激活组件。

在 Windows 2000 中利用活动目录(active directory为实现储藏库提供了更好的支持。

6.11.1 静态调用和动态调用

静态调用就是指简单的函数调用要求在编译的时候就知道方法及其签名这样编译器就可以在调用的方法的方式上施加限制。在 COM 中静态调用有

  • vtbl 绑定通过 vtbl 调用接口方法。这种调用间接地指向了实际方法可以跟随指向 vptr 的接口指针找到 vtbl而 vtbl 包含了指向实际方法的指针这种技术又叫极早绑定(very early binding

  • ID 绑定通过使用类垣库和一个名为 Idispatch 的特殊接口。此类型库中包含了一个名为 dispid 的数字它可以代替接口中的一个实际方法 , 这种方法又叫早绑定(early binding。

  • 双接口COM 同时允许 Idispatch 和 vtbl 调用

    三种技术。

    动态调用被称为是自动化(Automation并由 Idispatch 支持。使用这种方法首先给出一个方法或属性的名称代唯与之关联的 dispid查找之后就可以使用 dispid 来调用。

6.11.2 事件

事件是分布式环境一个十分重要的特征当某一特定事件发生时对象有能力通知对方。这种事件通知可以帮助其他对象决定他们需要采取什么行动。 COM 通过一个叫做连接点的的慨念来支持事件这就需财有两个合作者源点 (source和汇点(sink。对捕获某一事件感兴趣的客户(汇点必须将自己的意向告诉它们的对象 ( 源点 )。

附录

这篇文章中涉及到了不少的历史把近200年的科技发展历史 Technology Timeline 写在博客里。把微软技术发展的 Timeline和科技发展的 Timeline 揉合在了一起这样能帮助我们感觉到技术是在伴随着科技的发展而发展。也可以看到COM 这种技术理念的产生是在PC渐渐普及起来操作系统渐渐成熟软件需求逐渐提高之后才有的。所以很多事情的发展往往都是自然而然的因为有了需求才会有相应的发展。COM 的产生从这个角度说也是一种必然。因为 COM 实际上就是一种规范就像行业规范一样行业太小自然不用规范而规模大了需求大了自然会产生规范所以 COM 的产生是一种必然结果。而技术的发展既在推进着科技的发展也受制于现有科技的边缘。

YearTechnologyInventorType
1823Silicon (Si)Baron Jons Jackob BerzeliusCPU
1833Analytical EngineCharles BabbageComputer
1872Analog ComputersWilliam ThomsonComputer
1903Electrical Logic Circuits (Gates)Nikola TeslaCPU
1904Diodes Vacuum TubeJohn Ambrose FlemingCPU
1928Punched CardsIBMStorage
1928Magnetic TapeFritz PfleumerStorage
1932Drum memoryGustav TauschekStorage
1936Turing Machine (Mechanical Computation)Alan TuringComputer
1938Electromechanical Analog ComputerUnited States NavyComputer
1939Vacuum Tube Data Processing SystemTommy FlowersComputer
1942Atanasoff–Berry Computer (ABC)John Vincent Atanasoff; Clifford E. BerryComputer
1943Colossus Computer (First Crude Computer)Tommy Flowers; British CodebreakersComputer
1946ENIAC ComputerMao Qili; Ai KeteComputer
1946Delay Line Memory SystemJ. Presper EckerStorage
1947Williams TubeFreddie Williams; Tom KilburnStorage
1947TransistorJohn Bardeen; Walter BrattainCPU
1947Magnetic-Core MemoryAn Wang; Way-Dong WooStorage
1948Manchester Baby (Stored-Program Computer)Frederic C. Williams; Tom Kilburn; Geoff TootillComputer
1953Video Tape RecorderNorikazu SawazakiTech
1954Solar BatteryCalvin Souther Fuller; Daryl Chapin; Gerald PearsonTech
1956Hard Disk Drive (HDD)IBMStorage
1957First Personal Computer (PC)IBMComputer
1958Integrated Circuit (ICs)Jack Kilby; Robert NoyceCPU
1959MOSFET (MOS Transistor)Mohamed Atalla; Dawon KahngCPU
1960Transistors Mass-Production FacilityIBMCPU
1962Atlas Computer (Supercomputers)Ferranti International plcComputer
1963Integrated Bipolar Static Random-Access Memory (SRAM)Robert H. NormanStorage
1964MOS Semiconductor MemoryJohn SchmidtStorage
1965Dynamic Random-Access Memory (DRAM)ToshibaStorage
1960sObject-Oriented ProgrammingMITTech
1965Moore’s LawGordon MooreCPU
1968Silicon-Gate MOS Integrated Circuit (MOS IC)Federico FagginStorage
1968Intel Corporation (Founded)Gordon MooreCPU
1969ADM (Advanced Micro Devices) (Founded)Jerry SandersCPU
1969ARPANETUCLA; SRI; UCSB; The University of UtahTech
1970Pocket CalculatorTexas InstrumentsTech
1970DRAM IC ChipIntelStorage
1971Floppy DiskIBMStorage
1971EmailRay TomlinsonTech
1971Single-Chip Microprocessor (Intel 4004)IntelCPU
1972Microsoft PartnershipMicrosoftMicrosoft
1972Video Game ConsoleRalph H. Baer (Team)Tech
1973First Commercial Graphical User InterfaceXerox AltoTech
1973Capacitive TouchscreenCERNTech
1973Internet Protocol Suite (TCP/IP)Vinton Cerf; Robert E. KahnTech
1975Microsoft FoundMicrosoftMicrosoft
1975IBM 5100 Portable Computer (Portable Computer)IBMComputer
1975Microcomputer RevolutionAltair 8800Tech
1975Microsoft BASICMicrosoftMicrosoft
1980Flash memoryFujio MasuokaStorage
1981QDOCMicrosoftMicrosoft
1982CD-ROMSony; PhilipsStorage
1983Lotus SoftwareMicrosoftMicrosoft
1983Multi-Tool WordMicrosoftMicrosoft
1983StereolithographyChuck HullTech
1984MacintoshAppleComputer
1984Cell PhoneMotorolaTech
1984lithium-ion batteryJohn B. Goodenough; Rachid Yazami; Akira YoshinoTech
1985Microsoft ExcelMicrosoftMicrosoft
1985Windows 1.0MicrosoftMicrosoft
1987Windows 2.0MicrosoftMicrosoft
1987Dynamic Data Exchange (DDE)MicrosoftMicrosoft
1988Antony William, Paper 1 (COM)MicrosoftMicrosoft
1990Windows 3.0MicrosoftMicrosoft
1990Microsoft PowerPointMicrosoftMicrosoft
1990World Wide WebTim Berners-LeeTech
1990Antony William, Paper 2 (COM)MicrosoftMicrosoft
1991Visual Basic 1.0MicrosoftMicrosoft
1991Object Linking and Embedding (OLE)MicrosoftMicrosoft
1991Dynamic-Link Library (DLL)MicrosoftMicrosoft
1992Visual Basic 1.0 for DOSMicrosoftMicrosoft
1992Visual Basic 2.0MicrosoftMicrosoft
1992Synchronous Dynamic Random-Access Memory (SDRAM)Samsung ElectronicsStorage
1992OLE Version 3.1MicrosoftMicrosoft
1992Windows 3.1; OLE 2MicrosoftMicrosoft
1992COM Application binary interface (ABI)MicrosoftMicrosoft
1993Visual Basic 3.0MicrosoftMicrosoft
1993VBA (Visual Basic for Applications)MicrosoftMicrosoft
1993Web BrowserMosaicTech
1994PlayStationSonyTech
1994OLE custom controls (OCXs)MicrosoftMicrosoft
1994OLE2 change to OLEMicrosoftMicrosoft
1995Visual Basic 4.0MicrosoftMicrosoft
1995DVDPhilips; Sony; Toshiba; PanasonicStorage
1996OLE change to ActiveXMicrosoftMicrosoft
1996VBA 4.0MicrosoftMicrosoft
1996DCOMMicrosoftMicrosoft
1997Microsoft Partnership with AppleMicrosoftMicrosoft
1997Visual Basic 5.0MicrosoftMicrosoft
1998Visual Basic 6.0MicrosoftMicrosoft
1998DDR SDRAM (Double Data Rate SDRAM)Samsung ElectronicsStorage
1998GDDR (Graphics DDR)Samsung ElectronicsStorage
1998MP3 playerSaeHan Information SystemsTech
1998Windows 98MicrosoftMicrosoft
2000Windows MEMicrosoftMicrosoft
2001Windows XPMicrosoftMicrosoft
2002.NET FrameworkMicrosoftMicrosoft
2007Windows VistaMicrosoftMicrosoft
2007iPhoneAppleTech
2008Visual Basic 6.0 (support ended)MicrosoftMicrosoft
2008Google ChromeGoogleTech
2009Windows 7MicrosoftMicrosoft
2010IpadAppleTech
20113D transistorsIntelTech
2012Raspberry PiTech VolunteersTech
2015Windows 10MicrosoftMicrosoft
2015AlphaGo (AI)GoogleTech
2019Quantum computingIBMComputer
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6