什么是COM(组件对象模型)简而言之?

看来COM对象是由OSpipe理的通用对象。 对象遵循一个严格的界面,允许你查询对象来确定信息。 这是什么COM对象?

COM是一种允许重用对象(或者说组件)的机制,而不依赖于实现组件的程序员和使用它的程序员使用的语言,也不pipe组件是在客户端程序中实现还是机器(或networking)上的其他地方。

一般来说,每个COM组件都提供了一个或多个接口的实现。 这些接口是使用接口定义语言(IDL)以与语言无关的方式定义的 。 举个例子,COM中的一个基本接口IUnknown定义如下:

interface IUnknown { virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) = 0; virtual ULONG AddRef(void) = 0; virtual ULONG Release(void) = 0; }; 

这个小接口是COM的基础,因为每个COM组件都必须实现它。 它定义了COM机制的两个重要方面:

  • QueryInterface允许调用代码来获取已知接口的实现。 在COM中,接口由GUID(也称为接口标识符,IID)引用。 如果一个对象实现了多个接口,这就是客户端代码如何得到每个接口的引用。 如果你愿意的话,它就像一个铸造操作员一样。
  • AddRef()Release()实现COM对象的内存pipe理机制。 顾名思义,最常见的模型就是引用计数机制,在最后一个客户端释放引用后,实例被销毁。

所有COM组件在安装时都会注册到系统中。 如果程序员想要使用某个组件,他需要:

  • 确保组件安装在可到达的位置。 大部分时间都在正在运行的应用程序的系统上,但COM +还允许远程计算机上存在组件。
  • 知道给定组件的GUID。 使用这个GUID,客户端可以要求系统实例化组件(在C中,执行此操作的函数称为CoCreateInstance() )。 您可以在registry下的HKEY_CLASSES_ROOT\CLSID下查看:其中的每个GUID(最有可能)是一个COM组件或接口的标识符,并且该键下面的条目告诉系统如何实例化。

COM机器非常复杂。 例如,在C中实现或使用COM组件需要大量的工作,但像Visual Basic这样的高级语言已经做了很多工作来简化COM组件的实现和使用。 然而好处是非常真实的。 它使得在Visual Basic中编写应用程序成为可能,但仍然可以将C或C ++中的性能关键algorithm作为COM对象来实现,这些对象可以直接从VB代码中使用。 系统负责编组方法调用参数,根据需要将它们传递给线程,进程和networking连接,以便客户端代码具有使用普通对象的印象。

Windows的许多基础部分都是基于COM的。 Windows资源pipe理器(文件pipe理器),例如,基本上是一个空壳。 它定义了一系列用于导航和显示树层次结构的COM接口,而实际显示“我的电脑”,驱动器,文件夹和文件的所有代码都是一组实现这些接口的COM组件。

随着.NET的出现,COM正在慢慢变得过时。

COM是一个开发的机制,允许人们分发二进制文件,即使调用者使用另一个供应商的C ++编译器或者(最终)完全不同的语言也可以重用。

如果你想要一个很好的COM介绍,请阅读Don Box的 基本COM 。

这样想:当.NET出来时,我立即想到:“哇…这是COM,但它不吸收。