简而言之,什么是COM(组件对象模型)?[关闭]


89

看来COM对象是受OS控制的通用对象。对象遵循严格的界面,并允许您查询对象以确定信息。这是COM对象吗?

c++  com 

Answers:


111

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;
};

这个小接口是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逐渐变得过时。


10
最后一行的来源?
Shad

32

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.