Поделиться через


Основы COM-объектов ATL

На следующем рисунке показана связь между классами и интерфейсами, которые используются для определения com-объекта ATL.

Diagram of the classes and interfaces used to define an A T L object.

Примечание.

На этой схеме показано, что CComObject производный от CYourClass этого CComAggObject и CComPolyObject включается CYourClass в качестве переменной-члена.

Существует три способа определения COM-объекта ATL. Стандартный вариант — использовать класс, производный CComObject от CYourClass. Второй вариант — создать агрегированный объект с помощью CComAggObject класса. Третий вариант — использовать CComPolyObject класс. CComPolyObject выступает в качестве гибридного: он может функционировать как CComObject класс или CComAggObject как класс, в зависимости от того, как он был создан. Дополнительные сведения об использовании CComPolyObject класса см. в разделе CComPolyObject Class.

При использовании стандартного COM ATL используются два объекта: внешний объект и внутренний объект. Внешние клиенты получают доступ к функциям внутреннего объекта через функции-оболочки, определенные во внешнем объекте. Внешний объект имеет тип CComObject.

При использовании агрегированного объекта внешний объект не предоставляет оболочки для функциональных возможностей внутреннего объекта. Вместо этого внешний объект предоставляет указатель, который напрямую осуществляется внешними клиентами. В этом сценарии внешний объект имеет тип CComAggObject. Внутренний объект представляет собой переменную-член внешнего объекта, и он имеет тип CYourClass.

Так как клиенту не нужно проходить через внешний объект для взаимодействия с внутренним объектом, агрегированные объекты обычно более эффективны. Кроме того, внешний объект не должен знать функциональные возможности агрегированного объекта, учитывая, что интерфейс агрегированного объекта напрямую доступен клиенту. Однако не все объекты можно агрегировать. Чтобы объект был агрегирован, он должен быть разработан с учетом агрегирования.

ATL реализует IUnknown на двух этапах:

Другие аспекты com-объекта ATL обрабатываются другими классами:

  • CComCoClass определяет фабрику классов по умолчанию объекта и модель агрегирования.

  • IDispatchImpl предоставляет реализацию IDispatch Interface по умолчанию части всех двух интерфейсов объекта.

  • ISupportErrorInfoImpl реализует ISupportErrorInfo интерфейс, обеспечивающий правильное распространение сведений об ошибках в цепочке вызовов.

В этом разделе

Реализация CComObjectRootEx
Отображение примеров записей карты COM для реализации CComObjectRootEx.

Реализация CComObject, CComAggObject и CComPolyObject
Описывает, как макросы DECLARE_*_AGGREGATABLE влияют на использование CComObject, CComAggObjectи CComPolyObject.

Поддержка IDispatch и IErrorInfo
Выводит список классов реализации ATL, используемых для поддержки IDispatch интерфейсов и IErrorInfo интерфейсов.

Поддержка IDispEventImpl
Описывает шаги по реализации точки подключения для класса.

Изменение модели агрегирования и фабрики класса по умолчанию
Отображение макросов, используемых для изменения фабрики классов по умолчанию и модели агрегирования.

Создание объединенного объекта
Перечисляет шаги по созданию агрегированного объекта.

Создание проекта ATL
Предоставляет сведения о создании COM-объекта ATL.

ATL
Ссылки на разделы о программировании с использованием библиотеки ATL.

См. также

Основные понятия