Шаг 196.
Среда программирования Visual C++.
Повторное использование СОМ-объектов. Реализация агрегации с помощью ATL
На этом шаге мы рассмотрим как реализуется агрегация средствами ATL.
Для облегчения реализации агрегации ATL предоставляет ряд макросов и методов базового класса. Чтобы
создать агрегируемый (внутренний) объект, нужно средствами мастера ATL Object Wizard добавить новый
СОМ-объект в ATL-проект, указав при этом, что компонент должен поддерживать агрегацию.
Для этого выберите соответствующий вариант на вкладке Attributes.
Рис.1. Вкладка Attributes
По умолчанию создаваемые ATL СОМ-объекты агрегируемы. Если Вы укажете пункт No, то
создадите неагрегируемый объект, а щелкнув Only - создадите объект, который может использоваться только
как агрегированный.
В заключение мы приведем алгоритм реализации внешнего объекта.
- Реализация внешнего объекта.
- Добавьте в класс своего объекта указатель на IUnknown и инициализируйте его, присвоив значение NULL в конструкторе.
В данном примере мы назвали этот указатель m_pUnkInner.
- В определении класса объявите макрос DECLARE_GET_CONTROLLING_ UNKNOWN. Он определяет
функцию по имени GetControllingUnknown().
- Переопределите методы FinalConstruct() и FinalRelease(). Это методы базового класса
CComObjectRootBase, вызываемые соответственно в конце процесса создания и уничтожения СОМ-объекта.
- В FinalConstruct() вызывается функция CoCreateInstance(), в первом параметре которой передается
CLSID создаваемого Вами внутреннего объекта. В качестве второго параметра передайте значение,
возвращенное функцией GetControllingUnknown(), чтобы снабдить внутренний класс указателем на
управляющий стандартный интерфейс IUnknown. В качестве пятого параметра передайте адрес m_pUnkInner,
чтобы получить указатель на интерфейс IUnknown внутреннего объекта. Вот пример переопределенной функции FinalConstruct():
HRESULT FinalConstruct()
{
return CoCreateInstance(CLSID_InnerObject,
GetControllingUnknown(),
CLSCTX_ALL, I
ID_IInnerObject, &m_pUnkInner);
}
- В FinalRelease() вызовите IUnknown::Release() внутреннего объекта.
- С помощью макроса COM_INTERFACE_ENTRY_AGGREGATE добавьте в СОМ-карту внешнего
объекта запись об интерфейсе внутреннего объекта. Этот макрос представляет собой специализированную версию
макроса COM_INTERFACE_ENTRY для агрегированных объектов. COM_INTERFACE_ ENTRY_AGGREGATE
принимает дополнительный параметр IUnknown *, указывающий на интерфейс IUnknown внутреннего объекта.
- Добавьте определение интерфейса агрегированного объекта в IDL-файл внешнего объекта и вставьте ссылку на него в раздел [coclass].
На следующем шаге мы вернемся к компоненту UploadStockData.
Предыдущий шаг
Содержание
Следующий шаг