Сущность технологии COM



Множественные интерфейсы и имена методов - часть 3


Спецификация СОМ не требует, чтобы объект был реализован как класс C++. Хотя существует весьма естественное соответствие между объектами СОМ и классами C++, базирующимися на множественном наследовании, это всего лишь одна из возможных технологий реализации. Для создания объекта СОМ может быть использована любая программная технология, производящая таблицы vtbl в нужном формате и удовлетворяющая правилам СОМ для QueryInterface. Один стандартный метод разрешения конфликтов имен состоит в реализации интерфейсов с конфликтующими именами как отдельных классов C++ и последующей компоновке целевого класса C++ из экземпляров этих отдельных классов. Для гарантии того, что каждый из этих составных элементов данных появится во внешнем мире как единый объект СОМ, часто назначается одна главная реализация QueryInterface, которой каждый составной элемент данных будет передавать функции. Следующий код демонстрирует эту технологию:

class CarPlane { LONG m_cRef; CarPlane(void) : m_cRef(0) {} public: // Main IUnknown methods // Главные методы IUnknown STDMETHODIMP QueryInterface(REFIID, void**); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); private: // define nested class that implements ICar // определяем вложенный класс, реализующий ICar struct XCar : public ICar { // get back pointer to main object // получаем обратный указатель на главный объект inline CarPlane* This(); STDMETHODIMP QueryInterface(REFIID, void**); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); STDMETHODIMP GetMaxSpeed(long *pval); STDMETHODIMP Brake(void); };

// define nested class that implements IPlane // определяем вложенный класс, реализующий IPlane struct XPlane : public IPlane { // Get back pointer to main object // получаем обратный указатель на главный объект inline CarPlane* This(); STDMETHODIMP QueryInterface(REFIID, void**); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); STDMETHODIMP GetMaxSpeed(long *pval); STDMETHODIMP TakeOff(void); }; // declare instances of nested classes // объявляем экземпляры вложенных классов XCar m_xCar; XPlane m_xPlane; };




Содержание  Назад  Вперед