什么是COM(组件对象模型)?

76 c++ com

COM对象似乎是由OS管理的通用对象.对象遵循严格的界面,允许您查询对象以确定信息.这是COM对象是什么?

Car*_*org 93

COM是一种允许重用对象(或更确切地说是组件)的机制,独立于实现组件的程序员和使用它的程序员所使用的语言,而不管组件是否在客户端程序中实现或机器(或网络)上的其他地方.

从广义上讲,每个COM组件都提供一个或多个接口的实现.这些接口使用接口定义语言(IDL)以与语言无关的方式定义.例如,COM中的一个基本接口IUnknown定义如下:

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

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

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

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

  • 确保组件安装在可到达的位置.大多数情况下,它位于正在运行的应用程序的系统上,但COM +还允许组件存在于远程计算机上.
  • 知道给定组件的GUID.使用此GUID,客户端可以要求系统实例化组件(在C中,调用执行此操作的函数CoCreateInstance()).您可以在注册表中查看HKEY_CLASSES_ROOT\CLSID:其中的每个GUID(最可能)是COM组件或接口的标识符,该键下面的条目告诉系统应该如何实例化.

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

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

随着.NET的出现,COM正逐渐过时.

  • 最后一行的来源? (5认同)

McD*_*ell 30

COM是一种机制,开发用于允许人们分发可以重用的二进制文件,即使调用者正在使用其他供应商的C++编译器或(最终)使用不同的语言.

如果你想有一个很好的介绍,COM,阅读基本COM唐盒.