Повторное использование СОМ-объектов. Реализация агрегации с помощью 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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий