【发布时间】:2010-10-02 03:00:12
【问题描述】:
似乎 COM 对象是由操作系统管理的通用对象。对象遵循严格的接口,允许您查询对象以确定信息。这就是 COM 对象吗?
【问题讨论】:
似乎 COM 对象是由操作系统管理的通用对象。对象遵循严格的接口,允许您查询对象以确定信息。这就是 COM 对象吗?
【问题讨论】:
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 资源管理器(文件管理器)基本上是一个空壳。它定义了一组用于导航和显示树层次结构的 COM 接口,所有实际显示“我的电脑”、驱动器、文件夹和文件的代码都是作为一组实现这些接口的 COM 组件。
随着 .NET 的出现,COM 逐渐过时。
【讨论】:
COM 是一种允许人们分发可重复使用的二进制文件的机制,即使调用者使用的是其他供应商的 C++ 编译器或(最终)完全不同的语言。
如果您想很好地了解 COM,请阅读 Essential COM 的 Don Box。
【讨论】: