Получение указателя на объект

Так как COM не имеет строгой модели класса, существует четыре способа создания экземпляра клиента или получения указателя на интерфейс объекта:

  • Вызовите функцию библиотеки COM, которая создает объект предопределенного типа; То есть функция возвращает указатель только к одному конкретному интерфейсу для определенного класса объектов.
  • Вызовите функцию библиотеки COM, которая может создать объект на основе идентификатора класса (CLSID) и возвращает любой тип запрошенного указателя интерфейса.
  • Вызовите метод некоторого интерфейса, который создает другой объект (или подключается к существующему) и возвращает указатель интерфейса на этот отдельный объект.
  • Реализуйте объект с интерфейсом, через который другие объекты передают указатель интерфейса клиенту напрямую.

Сведения о получении указателей на другие интерфейсы объекта после первого см. в статье QueryInterface: навигация в объекте.

Создание объекта предопределенного типа

Существует множество функций COM, таких как CoGetMalloc, которые возвращают указатели на определенные реализации интерфейса. (CoGetMalloc извлекает указатель на стандартный объект выделения памяти COM.) Большинство из них являются вспомогательными функциями, и большинство этих функций описаны в справочных разделах этой документации, в соответствии с конкретной областью, к ней относятся такие функции, как хранение или передача данных.

Создание объекта на основе CLSID

Существует несколько функций, которые, учитывая CLSID, клиент может вызвать экземпляр объекта и получить указатель на него. Все эти функции основаны на функции CoGetClassObject, которая создает объект класса и предоставляет указатель на интерфейс, который позволяет создавать экземпляры этого класса. Хотя должны быть сведения, которые говорят, на какой системе находится сервер, не требуется содержать эти сведения в клиенте. Клиент должен знать только CLSID и никогда не абсолютный путь кода сервера. Дополнительные сведения см. в разделе "Создание объекта с помощью объекта класса".

Возврат указателя на отдельный объект

Среди многих методов интерфейса, возвращающих указатель на отдельный объект, есть несколько, которые создают и возвращают указатель на объект перечислителя, который позволяет определить, сколько элементов заданного типа поддерживает объект. COM определяет интерфейсы для перечисления различных элементов, таких как строки, важные структуры, моникеры и указатели интерфейса IUnknown. Типичный способ создания экземпляра перечислителя и получения указателя на его интерфейс заключается в вызове метода из другого интерфейса. Например, интерфейс IDataObject определяет два метода EnumDAdvise и EnumFormatEtc, которые возвращают указатели на интерфейсы двух разных объектов перечисления. Существует множество других примеров в COM методов, возвращающих указатели на объекты, такие как интерфейс составного документа OLE IOleObject::GetClientSite, который при вызове внедренного или связанного объекта возвращает указатель на реализацию объекта контейнера IOleClientSite.

Реализация объекта, через который передает указатель интерфейса непосредственно клиенту

Если для двух объектов, таких как контейнер составных документов OLE и сервер, требуется двунаправленное взаимодействие, каждый реализует объект, содержащий метод интерфейса, через который он может передать указатель интерфейса другому объекту. Реализующий объект, который также является клиентом созданного объекта, затем может вызвать метод и получить указатель, переданный.

COM-клиенты и серверы

Обязанности COM-сервера