获取指向对象的指针

由于 COM 没有严格的类模型,因此客户端可以通过四种方式实例化或获取指向对象上的接口的指针:

  • 调用创建预先确定类型的对象的 COM 库函数;也就是说,该函数将只返回指向特定对象类的一个特定接口的指针。
  • 调用一个 COM 库函数,该函数可以基于类标识符 (CLSID) 创建对象,并返回请求的任何类型的接口指针。
  • 调用某些接口的方法,该方法创建另一个对象(或连接到现有对象),并返回这个单独的对象上的接口指针。
  • 使用接口实现对象,通过该接口,其他对象将接口指针直接传递给客户端。

有关在获得第一个接口后获取指向对象的其他接口的指针的信息,请参阅 QueryInterface:在对象中导航

创建预先确定的类型的对象

有许多 COM 函数(例如 CoGetMalloc)返回指向特定接口实现的指针。 (CoGetMalloc 检索指向标准 COM 内存分配器的指针。)其中大多数是帮助程序函数,其中大多数函数在本文档参考部分的相关具体章节中介绍,例如存储或数据传输。

基于 CLSID 创建对象

根据 CLSID,客户端可以调用多个函数来创建对象实例并获取指向它的指针。 所有这些函数都基于函数 CoGetClassObject,该函数创建类对象并提供指向接口的指针,该接口允许你创建该类的实例。 虽然必须提供指示服务器驻留的系统的信息,但客户端中不需要包含该信息。 客户端只需要知道 CLSID,并且从不需要知道服务器代码的绝对路径。 有关详细信息,请参阅通过类对象创建对象

返回指向单独对象的指针

在返回指向单独对象的指针的许多接口方法中,有几个方法可创建并返回指向枚举器对象的指针,从而可以确定对象维护的给定类型的项数。 COM 定义用于枚举各种项的接口,例如字符串、重要结构、名字对象和 IUnknown 接口指针。 创建枚举器实例并获取指向其接口的指针的常用方法是从另一个接口调用方法。 例如,IDataObject 接口定义了两种方法,即 EnumDAdviseEnumFormatEtc,这些方法返回指向两个不同的枚举对象上的接口的指针。 COM 中还有其他许多方法示例,这些方法返回指向对象的指针,例如 OLE 复合文档接口 IOleObject::GetClientSite,在嵌入对象或链接对象上调用时,将返回指向容器对象的 IOleClientSite 实现的指针。

实现将接口指针直接传递到客户端的对象

当两个对象(如 OLE 复合文档容器和服务器)需要双向通信时,各自实现一个包含接口方法的对象,通过该方法可将接口指针传递给另一个对象。 实现对象(也是所创建对象的客户端)随后可以调用该方法并获取传递的指针。

COM 客户端和服务器

COM 服务器职责