Основы COM-объектов ATL
На следующем рисунке показана связь между классами и интерфейсами, которые используются для определения com-объекта ATL.
Примечание.
На этой схеме показано, что CComObject
производный от CYourClass
этого CComAggObject
и CComPolyObject
включается CYourClass
в качестве переменной-члена.
Существует три способа определения COM-объекта ATL. Стандартный вариант — использовать класс, производный CComObject
от CYourClass
. Второй вариант — создать агрегированный объект с помощью CComAggObject
класса. Третий вариант — использовать CComPolyObject
класс. CComPolyObject
выступает в качестве гибридного: он может функционировать как CComObject
класс или CComAggObject
как класс, в зависимости от того, как он был создан. Дополнительные сведения об использовании CComPolyObject
класса см. в разделе CComPolyObject Class.
При использовании стандартного COM ATL используются два объекта: внешний объект и внутренний объект. Внешние клиенты получают доступ к функциям внутреннего объекта через функции-оболочки, определенные во внешнем объекте. Внешний объект имеет тип CComObject
.
При использовании агрегированного объекта внешний объект не предоставляет оболочки для функциональных возможностей внутреннего объекта. Вместо этого внешний объект предоставляет указатель, который напрямую осуществляется внешними клиентами. В этом сценарии внешний объект имеет тип CComAggObject
. Внутренний объект представляет собой переменную-член внешнего объекта, и он имеет тип CYourClass
.
Так как клиенту не нужно проходить через внешний объект для взаимодействия с внутренним объектом, агрегированные объекты обычно более эффективны. Кроме того, внешний объект не должен знать функциональные возможности агрегированного объекта, учитывая, что интерфейс агрегированного объекта напрямую доступен клиенту. Однако не все объекты можно агрегировать. Чтобы объект был агрегирован, он должен быть разработан с учетом агрегирования.
ATL реализует IUnknown на двух этапах:
CComObject, CComAggObject или CComPolyObject реализует
IUnknown
методы.CComObjectRoot или CComObjectRootEx управляет счетчиком ссылок и внешними указателями
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.