Класс 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();
Возвращаемое значение
В сборках, отличных от отладки, всегда возвращается ноль. В отладочных сборках возвращает значение, которое может быть полезно для диагностика или тестирования.