다음을 통해 공유


CComTearOffObject 클래스

이 클래스는 분리 인터페이스를 구현합니다.

구문

template<class Base>
class CComTearOffObject : public Base

매개 변수

Base
해체 개체에서 CComTearOffObjectBase 파생된 분리 클래스 및 지원하려는 인터페이스입니다.

ATL은 두 단계로 분리 인터페이스를 구현합니다. 이 메서드는 CComTearOffObjectBase 참조 횟수를 처리하고 QueryInterfaceCComTearOffObject IUnknown을 구현합니다.

멤버

공용 생성자

속성 설명
CComTearOffObject::CComTearOffObject 생성자입니다.
CComTearOffObject::~CComTearOffObject 소멸자입니다.

공용 메서드

이름 설명
CComTearOffObject::AddRef 개체에 대한 CComTearOffObject 참조 수를 증분합니다.
CComTearOffObject::QueryInterface 중단 클래스 또는 소유자 클래스에서 요청된 인터페이스에 대한 포인터를 반환합니다.
CComTearOffObject::Release 개체에 대한 CComTearOffObject 참조 수를 감소시키고 삭제합니다.

CComTearOffObjectBase 메서드

함수 설명
CComTearOffObjectBase 생성자입니다.

CComTearOffObjectBase 데이터 멤버

데이터 멤버 설명
m_pOwner CComObject 소유자 클래스에서 파생된 포인터입니다.

설명

CComTearOffObject 는 해당 인터페이스를 쿼리할 때만 인스턴스화되는 별도의 개체로 분리 인터페이스를 구현합니다. 해제는 참조 수가 0이 되면 삭제됩니다. 일반적으로는 분리를 사용하면 주 개체의 모든 인스턴스에 vtable 포인터가 저장되므로 거의 사용되지 않는 인터페이스에 대한 분리 인터페이스를 빌드합니다.

분리 개체를 지원하려는 인터페이스에서 CComTearOffObjectBase 분리를 구현하는 클래스를 파생시켜야 합니다. CComTearOffObjectBase 는 소유자 클래스 및 스레드 모델에서 템플릿화됩니다. 소유자 클래스는 분리가 구현되는 개체의 클래스입니다. 스레드 모델을 지정하지 않으면 기본 스레드 모델이 사용됩니다.

해체 클래스에 대한 COM 맵을 만들어야 합니다. ATL이 해체를 인스턴스화하면 만들 CComTearOffObject<CYourTearOffClass> 거나 CComCachedTearOffObject<CYourTearOffClass>만듭니다.

예를 들어 BEEPER 샘플 CBeeper2 에서 클래스는 분리 클래스이고 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 1씩 증분합니다.

STDMETHOD_(ULONG, AddRef)();

Return Value

진단 및 테스트에 유용할 수 있는 값입니다.

CComTearOffObject::CComTearOffObject

생성자입니다.

CComTearOffObject(void* pv);

매개 변수

pv
[in] 개체에 대한 포인터로 변환될 포인터입니다 CComObject<Owner> .

설명

소유자의 참조 수를 1씩 증분합니다.

CComTearOffObject::~CComTearOffObject

소멸자입니다.

~CComTearOffObject();

설명

할당된 모든 리소스를 해제하고 FinalRelease를 호출하며 모듈 잠금 수를 줄입니다.

CComTearOffObject::CComTearOffObjectBase

생성자입니다.

CComTearOffObjectBase();

설명

m_pOwner 멤버를 NULL로 초기화합니다.

CComTearOffObject::m_pOwner

Owner에서 파생된 CComObject 개체에 대한 포인터입니다.

CComObject<Owner>* m_pOwner;

매개 변수

담당자
[in] 해체가 구현되는 클래스입니다.

설명

포인터는 생성 중에 NULL로 초기화됩니다.

CComTearOffObject::QueryInterface

요청된 인터페이스에 대한 포인터를 검색합니다.

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

매개 변수

iid
[in] 요청되는 인터페이스의 IID입니다.

ppvObject
[out] iid로 식별되는 인터페이스 포인터에 대한 포인터이거나, 인터페이스를 찾을 수 없는 경우 NULL입니다.

Return Value

표준 HRESULT 값입니다.

설명

먼저 중단 클래스의 인터페이스에 대한 쿼리입니다. 인터페이스가 없으면 소유자 개체의 인터페이스를 쿼리합니다. 요청된 인터페이스인 IUnknown경우 소유자의 인터페이스를 IUnknown 반환합니다.

CComTearOffObject::Release

참조 수를 1씩 감소시키고 참조 수가 0이면 을 삭제합니다 CComTearOffObject.

STDMETHOD_ULONG Release();

Return Value

디버그가 아닌 빌드에서는 항상 0을 반환합니다. 디버그 빌드에서 진단 또는 테스트에 유용할 수 있는 값을 반환합니다.

참고 항목

CComCachedTearOffObject 클래스
클래스 개요