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


Класс CComTearOffObject

Этот класс реализует интерфейс отключения.

Синтаксис

template<class Base>
class CComTearOffObject : public Base

Параметры

Основание
Класс разрыва, производный от CComTearOffObjectBase и интерфейсов, которые требуется поддерживать объект слеза.

ATL реализует свои интерфейсы отключения на двух этапах — CComTearOffObjectBase методы обрабатывают число ссылок и QueryInterface, в то время как CComTearOffObject реализует IUnknown.

Участники

Открытые конструкторы

Имя Описание
CComTearOffObject::CComTearOffObject Конструктор.
CComTearOffObject::~CComTearOffObject Деструктор

Открытые методы

Имя Описание
CComTearOffObject::AddRef Увеличивает число ссылок для CComTearOffObject объекта.
CComTearOffObject::QueryInterface Возвращает указатель на запрошенный интерфейс в классе слезы или классе владельца.
CComTearOffObject::Release Уменьшает число ссылок для CComTearOffObject объекта и уничтожает его.

Методы CComTearOffObjectBase

Function Description
CComTearOffObjectBase Конструктор.

Элементы данных CComTearOffObjectBase

Элемент данных Description
m_pOwner Указатель на производный CComObject от класса владельца.

Замечания

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

Следует наследовать класс, реализующий отлезать от CComTearOffObjectBase любого интерфейса, от которого требуется поддерживать объект слеза. CComTearOffObjectBase шаблонируется в классе владельца и модели потока. Класс владельца — это класс объекта, для которого реализуется разрыв. Если модель потока не указана, используется модель потока по умолчанию.

Необходимо создать com-карту для класса слезоточивого. При создании или создании CComTearOffObject<CYourTearOffClass> экземпляра CComCachedTearOffObject<CYourTearOffClass>ATL.

Например, в примере CBeeper2 BEEPER класс является классом разрыва, а CBeeper класс является классом владельца:

class CBeeper2 :
   public ISupportErrorInfo,
   public CComTearOffObjectBase<CBeeper>
{
public:
   CBeeper2() {}
   STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
   {
      return (InlineIsEqualGUID(IID_IBeeper, riid)) ? S_OK : S_FALSE;
   }

BEGIN_COM_MAP(CBeeper2)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
};

class ATL_NO_VTABLE CBeeper :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CBeeper, &CLSID_Beeper>,
   public IDispatchImpl<IBeeper, &IID_IBeeper, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   CBeeper()
   {
   }

DECLARE_REGISTRY_RESOURCEID(IDR_BEEPER)

DECLARE_NOT_AGGREGATABLE(CBeeper)

BEGIN_COM_MAP(CBeeper)
   COM_INTERFACE_ENTRY(IBeeper)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()

// ISupportsErrorInfo
   STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);


   DECLARE_PROTECT_FINAL_CONSTRUCT()

   HRESULT FinalConstruct()
   {
      return S_OK;
   }

   void FinalRelease()
   {
   }

public:

};

Иерархия наследования

Base

CComTearOffObject

Требования

Заголовок: atlcom.h

CComTearOffObject::AddRef

Увеличивает число CComTearOffObject ссылок объекта по одному.

STDMETHOD_(ULONG, AddRef)();

Возвращаемое значение

Значение, которое может быть полезно для диагностика и тестирования.

CComTearOffObject::CComTearOffObject

Конструктор.

CComTearOffObject(void* pv);

Параметры

Pv
[in] Указатель, который будет преобразован в указатель на CComObject<Owner> объект.

Замечания

Увеличивает количество ссылок владельца по одному.

CComTearOffObject::~CComTearOffObject

Деструктор

~CComTearOffObject();

Замечания

Освобождает все выделенные ресурсы, вызывает FinalRelease и уменьшает число блокировок модуля.

CComTearOffObject::CComTearOffObjectBase

Конструктор.

CComTearOffObjectBase();

Замечания

Инициализирует элемент m_pOwner значение NULL.

CComTearOffObject::m_pOwner

Указатель на объект CComObject, производный от owner.

CComObject<Owner>* m_pOwner;

Параметры

Ответственное лицо
[in] Класс, для которого реализуется разрыв.

Замечания

Указатель инициализируется значение NULL во время построения.

CComTearOffObject::QueryInterface

Извлекает указатель на запрошенный интерфейс.

STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);

Параметры

Iid
[in] Идентификатор iiD запрашиваемого интерфейса.

ppvObject
[out] Указатель на указатель интерфейса, определяемый iid или NULL, если интерфейс не найден.

Возвращаемое значение

Стандартное значение HRESULT.

Замечания

Сначала запрашивает интерфейсы в классе слеза. Если интерфейс отсутствует, запросы к интерфейсу в объекте владельца. Если запрошенный интерфейс имеет значение IUnknown, возвращает IUnknown владельца.

CComTearOffObject::Release

Уменьшает число ссылок по одному и, если число ссылок равно нулю, удаляет значение CComTearOffObject.

STDMETHOD_ULONG Release();

Возвращаемое значение

В сборках, отличных от отладки, всегда возвращается ноль. В отладочных сборках возвращает значение, которое может быть полезно для диагностика или тестирования.

См. также

Класс CComCachedTearOffObject
Общие сведения о классе