Microsoft Component Object Model (COM).
目的
COM是一个独立于平台的,分布式的、面向对象的系统创建二进制软件组件,这些组件可以进行交互。微软的COM是基础技术,OLE(复合文档)和ActiveX(网络组件)技术多基于此技术。
在适用情况下
COM对象可以创建各种编程语言。面向对象的语言(如C++,提供编程机制,简化的实现COM对象。这些对象可以在一个过程中,在其他进程,甚至在远程机器。
开发人员受众
COM设计主要针对C++和微软Visual Basic开发人员。
运行时的要求
各种各样的操作系统上运行。
本节介绍了微软的组件对象模型(COM),描述了线程模型组件可以支持,COM客户端和服务器之间的区别,并描述了如何使异步调用过程,定义COM接口和注册COM应用程序。也介绍了COM安全、错误处理COM处理程序,DLL代理人,在COM事件,可连接对象。
微软的组件对象模型(COM)是一个独立于平台的,分布式的、面向对象的系统创建二进制软件组件可以交互。微软的COM是基础技术OLE(复合文档),ActiveX(网络组件),以及其他。
理解COM(因此所有基于COM技术),它是至关重要的理解不是一个面向对象的语言而是一个标准。COM也没有指定应用程序应该如何结构化;语言、结构和实现细节留给应用程序程序员。相反,COM指定一个对象模型和编程要求,使COM对象(也称为COM组件,或者有时只是对象)与其他对象进行交互。这些对象可以在一个过程中,在其他进程,甚至可以在远程的机器上。他们可以被其他语言编写的,他们可能在结构上完全不同,这就是为什么COM称为二进制标准标准,程序已被翻译后适用于二进制机器代码。
唯一的语言要求COM是代码生成的语言可以创建指针和结构,通过显式或隐式地调用函数指针。面向对象的语言(如Microsoft Visual c++ 和Smalltalk提供编程机制,简化的实现COM对象,但语言(如C、Pascal、Ada、Java、甚至基本编程环境中可以创建和使用COM对象。
COM定义了COM对象的本质。一般来说,软件对象由一组数据和操作数据的函数。一个COM对象的数据访问对象的实现只通过一个或多个组相关功能。这些函数集被称为接口和接口的函数被称为方法。此外,COM要求获得的唯一方法接口的方法是通过一个接口指针。
除了指定二进制对象的基本标准,COM定义某些基本接口,提供所有基于COM技术通用的函数,它提供了一个所有组件需要少量的API函数。COM还定义了对象如何一起工作在一个分布式环境中,增加了安全功能提供系统和组件的完整性。
下面的主题在这一节中描述基本的COM设计COM对象相关的问题:
COM对象和接口
COM是一种技术,允许对象交互跨进程和机器一样轻松地在一个过程。COM使这个通过指定的唯一方法操作与对象相关的数据是通过一个接口的对象。本文档中使用这个词时,它指的是一个实现的代码COM binary-compliant接口与一个对象相关联。
COM在某种意义上使用这个词接口不同,通常用在Visual c++编程。一个c++接口指的是所有的功能类支持,客户交互的对象可以调用。一个COM接口是指一组相关的预定义函数一个COM类实现,但是一个特定接口并不一定代表类所支持的所有功能。(Java程序员会发现自己在家里使用COM接口,因为Java定义了接口在同样的方式。)
指一个对象实现接口意味着对象使用的代码,实现每个方法的接口,并提供COM binary-compliant指向这些功能到COM库。COM然后使这些功能可用于任何客户要求一个指针接口,客户端是否内部或外部的过程,实现了这些功能。
接口和接口实现
COM是一个基本接口定义及其实现之间的区别。一个接口实际上是一个合同,由一组相关的函数原型定义的使用,但其实施则还不到时候。这些函数原型是相当于纯虚拟基类c++编程。接口定义指定接口的成员函数,调用方法,返回类型,数量和类型的参数,和他们必须做什么。没有实现一个接口。
供应一个接口的实现是一个程序员的代码执行一个接口定义中指定的操作。许多程序员可以使用的接口的实现在一个基于对象的应用程序都包含在COM库。然而,程序员可以忽略这些实现,编写自己的。一个接口实现与一个对象在创建该对象的实例时,和实现提供服务对象提供。
例如,假设接口命名IStack可能定义了两个方法,命名和流行,连续指定调用方法返回,在相反的顺序,先前值传递给推的方法。该接口定义不指定的功能是如何实现的代码。在实现接口,一个程序员可能实现堆栈数组和实现Push和Pop方法等方式来访问该数组,而另一个程序员可能更喜欢使用一个链表,并将相应的实现方法。无论推和流行的特定实现方法,指针指向的内存中表示一个IStack接口,因此它的使用客户,完全由接口定义。
简单的对象仅支持单个接口。更复杂的对象,如可嵌入对象,通常支持多个接口。客户只能通过指针访问COM对象的接口,而反过来,允许客户端调用任何方法构成的界面。这些方法确定客户端可以使用对象的数据。
接口定义对象及其客户之间的合同。合同指定的方法必须与每个接口和相关的行为必须在每个方法的输入和输出。合同一般没有定义如何实现一个接口中的方法。合同的另一个重要方面是,如果一个对象支持一个接口,它必须支持该接口的所有方法。并非所有方法的实现需要做的如果一个对象不支持函数隐含的方法,它的实现可能是一个简单的返回或者返回有意义的错误消息,但必须存在的方法。
接口指针和接口
一个接口的一个实例实现实际上是一个指针数组的指针的方法,一个函数表,指的是一个实现接口中指定的所有方法。对象具有多个接口可以提供多个函数表的指针。任何代码,通过它可以访问数组的指针可以调用该接口中的方法。
说正是这多个间接不方便,所以,接口函数表,另一个对象的指针必须调用它的方法叫做只是一个接口指针。您可以手动创建函数表C应用程序或几乎自动地通过使用Visual c++支持COM)的(或其它面向对象的语言。
与适当的编译器支持(这是固有的C和c++),客户可以通过它的名字调用一个接口方法,它在数组中的位置。因为一个接口类型,编译器,由于方法的名称,可以检查参数和返回值的类型的每个接口方法调用。相反,如果一个客户端使用一个定位方案,这样的类型检查是不可用的,即使是在C或c++。
每个接口,不变的官能团的方法是指合同在运行时具有全局惟一接口标识符(IID)。这IID特定实例的全局唯一标识符(GUID)支持COM,允许客户端向一个对象是否支持的语义接口,没有不必要的开销和系统中可能出现的混乱有多个版本的名称相同的相同的接口。
总之,重要的是要理解什么是COM接口,而不是:
一个COM接口是不一样的一个c++阶层谋求一席之地。纯虚拟的定义并没有实现。如果你是一个c++程序员,你可以定义一个接口的实现类,但这属于标题的实现细节,COM没有指定。一个实例对象的实现必须创建一个接口的接口实际上存在。此外,不同的对象类可能以不同的方式实现一个接口还在二进制形式交替使用,只要符合接口定义的行为。
COM接口并不是一个对象是一组相关的函数和二进制标准通过客户和对象交流。只要它能提供接口方法的指针,该对象可以在任何语言实现与任何内部状态表示。
COM接口是强typed-Every接口都有自己的接口标识符(GUID),这可以消除重复的可能性,可能会出现在任何其他命名方案。
COM接口是immutable-You不能定义一个新版本的界面和给它相同的标识符。添加或删除一个接口或改变语义的方法创建一个新的接口,不是一个新版本的界面。因此,一个新的接口不能与老接口之间的冲突。然而,对象可以同时支持多个接口,可以公开接口逐次修正的一个接口,与不同的标识符。因此,每个接口都是一个独立的合同,和系统对象不需要担心是否接口的版本被称为是他们期望的。接口ID(IID)定义了接口合同明确的和独特的。
IUnknown和接口继承
崩溃所有扩展语言过滤器:所有语言过滤器:多语言过滤器:Visual Basic语言过滤器:c#语言过滤器:c++语言过滤器:J #语言过滤器:JScript
Visual Basic(声明)
Visual Basic(使用)
c#
c++
J #
JScript
继承COM并不意味着代码重用。因为没有实现与接口,接口继承并不意味着代码继承。这只意味着,与接口相关的合同是一个c++继承的虚基类时尚和modified-either通过添加新的方法或通过进一步排位赛的允许使用方法。没有选择性的继承COM。如果一个接口继承自另一个,它包括所有其他接口定义的方法。
很少用于预定义的COM接口的继承。所有预定义的接口(和任何自定义接口定义)继承他们的定义从IUnknown重要接口,它包含三个重要的方法:QueryInterface AddRef和发布。所有COM对象必须实现IUnknown接口,因为它提供了手段,使用QueryInterface之间自由移动一个对象支持的不同的接口以及手段利用AddRef和发布管理它的生命周期。
创建一个对象,它支持聚合(COM),您将需要实现IUnknown功能的一组接口以及一个独立的IUnknown接口。在任何情况下,任何对象实现者将实现IUnknown方法。指的是部分使用和实现IUnknown获得更多信息。
虽然有几个接口,从第二个接口继承它们的定义除了IUnknown,大多数只是继承IUnknown接口方法。这使得大多数接口相对紧凑,易于封装。