COM 类对象和 CLSID

COM 服务器作为 COM 类实现。 COM 类是只要与给定对象交互就在代码中执行的一组接口的实现。 C++ 类和 COM 类之间有一项重要区别:在 C++ 中,类是一种类型,而 COM 类只是对象的定义,并且不携带任何类型,但 C++ 程序员可以使用 C++ 类实现它。 COM 旨在允许不同应用程序使用类,包括在不了解存在该特定类的情况下编写的应用程序。 因此,动态链接库 (DLL) 或其他可执行应用程序 (EXE) 中存在给定类型的对象的类代码。

每个 COM 类均由 CLSID 标识,这是服务器必须注册的唯一 128 位 GUID。 COM 根据客户端的请求使用此 CLSID,将特定数据与包含实现该类的代码的 DLL 或 EXE 相关联,从而创建对象的实例。

对于同一计算机上的客户端和服务器,所有客户端都需要服务器的 CLSID。 在每台计算机上,COM 都会为系统上安装的服务器的所有 CLSID 维护一个数据库(它利用 Microsoft Windows 和 Macintosh 平台上的系统注册表)。 这是每个 CLSID 与存放该 CLSID 代码的 DLL 或 EXE 位置之间的映射。 每当客户端想要创建 COM 类的实例并使用其服务时,COM 都会咨询此数据库,因此客户端永远不需要知道代码在计算机上的绝对位置。

对于分布式系统,COM 提供允许远程服务器将自身注册为供客户端使用的注册表项。 虽然应用程序只需要知道服务器的 CLSID,因为它们可以依赖注册表来找到服务器,但 COM 允许客户端覆盖注册表项并指定服务器位置,以充分利用网络。 (请参阅查找远程对象。)

创建类实例的基本方法是通过 COM 类对象。 这只是一个中间对象,它支持创建给定类的新实例所共有的函数。 用于从 CLSID 创建对象的大多数类对象都支持 IClassFactory 接口,该接口包含重要的 CreateInstance 方法。 为要实例化的每个对象类实现 IClassFactory 接口。 (有关实现 IClassFactory 的详细信息,请参阅 实现 IClassFactory。)

注意

支持某些其他自定义类工厂接口的服务器不需要专门支持 IClassFactory。 但是,调用 CoGetClassObject 之外的激活函数(如 CoCreateInstanceEx)时,要求服务器支持 IClassFactory

 

当客户端想要创建服务器对象的实例时,会在调用 CoGetClassObject 时使用所需对象的 CLSID。 (通过其中一个对象创建帮助程序函数,此调用可以是直接调用或隐式调用。)此函数会找到与 CLSID 关联的代码,创建类对象,并提供指向所请求接口的指针。 (CoGetClassObject 采用指定客户端所需接口指针的 riid 参数。)

注意

COM 只有一些函数,许多其他函数会利用这些函数。 其中最重要的一个函数可能是 CoGetClassObject,这是所有实例创建函数的基础。

 

使用此指针,调用方可以创建对象的实例,并检索指向对象上所请求接口的指针。 这通常是一个初始化接口,用于激活对象(将其置于正在运行状态),以便客户端可以对想要的对象执行任何操作。 使用 COM 的基本函数时,客户端还必须注意释放所有对象指针。

激活对象实例的另一种机制是通过类名字对象。 类名字对象绑定到创建它们的类的类对象。 有关详细信息,请参阅类名字对象

COM 提供了多个帮助程序函数,可减少创建对象实例的工作量。 实例创建帮助程序函数中介绍了这些内容。

通过类对象创建对象