看来COM对象是受OS控制的通用对象。对象遵循严格的界面,并允许您查询对象以确定信息。这是COM对象吗?
看来COM对象是受OS控制的通用对象。对象遵循严格的界面,并允许您查询对象以确定信息。这是COM对象吗?
Answers:
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组件均已在系统中注册。如果程序员想使用某个组件,则需要:
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逐渐变得过时。