【问题标题】:What is COM (Component Object Model) in a nutshell? [closed]简而言之,什么是 COM(组件对象模型)? [关闭]
【发布时间】:2010-10-02 03:00:12
【问题描述】:

似乎 COM 对象是由操作系统管理的通用对象。对象遵循严格的接口,允许您查询对象以确定信息。这就是 COM 对象吗?

【问题讨论】:

    标签: c++ com


    【解决方案1】:

    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 组件在安装时都会在系统中注册。如果程序员想要使用某个组件,他需要:

    • 确保组件安装在可触及的位置。大多数时候它在运行应用程序的系统上,但 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 资源管理器(文件管理器)基本上是一个空壳。它定义了一组用于导航和显示树层次结构的 COM 接口,所有实际显示“我的电脑”、驱动器、文件夹和文件的代码都是作为一组实现这些接口的 COM 组件。

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

    【讨论】:

    • 最后一行的来源?
    【解决方案2】:

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

    如果您想很好地了解 COM,请阅读 Essential COMDon Box

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多