Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Этот класс реализует интерфейс отключения.
Синтаксис
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();
Возвращаемое значение
В сборках, отличных от отладки, всегда возвращается ноль. В отладочных сборках возвращает значение, которое может быть полезно для диагностика или тестирования.