CComTearOffObject 클래스
이 클래스는 분리 인터페이스를 구현합니다.
구문
template<class Base>
class CComTearOffObject : public Base
매개 변수
Base
해체 개체에서 CComTearOffObjectBase
파생된 분리 클래스 및 지원하려는 인터페이스입니다.
ATL은 두 단계로 분리 인터페이스를 구현합니다. 이 메서드는 CComTearOffObjectBase
참조 횟수를 처리하고 QueryInterface
CComTearOffObject
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을 반환합니다. 디버그 빌드에서 진단 또는 테스트에 유용할 수 있는 값을 반환합니다.