似乎COM对象是由OS管理的通用对象。对象遵循严格的界面,允许您查询对象以确定信息。这是COM对象是什么?
答案 0 :(得分:82)
COM是一种允许重用对象(或更确切地说是组件)的机制,独立于实现组件的程序员和使用它的程序员所使用的语言,而与组件是否无关。在客户的程序或机器(或网络)的其他地方实施。
一般来说,每个COM组件都提供一个或多个接口的实现。这些接口使用Interface Definition Language (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对象的内存管理机制。顾名思义,最常见的模型是引用计数机制,其中一个实例在最后一个客户端释放其引用后被销毁。安装时,所有COM组件都已在系统中注册。如果程序员想要使用某个组件,他需要:
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正逐渐过时。
答案 1 :(得分:25)
COM是一种机制,旨在允许人们分发可以重复使用的二进制文件,即使调用者正在使用其他供应商的C ++编译器或(最终)使用不同的语言。
如果您希望对COM有一个很好的介绍,请通过Essential COM阅读Don Box。