CComTearOffObject クラス
更新 : 2007 年 11 月
このクラスは、ティアオフ インターフェイスを実装します。
template<
class Base
>
class CComTearOffObject :
public Base
パラメータ
- Base
CComTearOffObjectBase と、そのティアオフ オブジェクトでサポートするインターフェイスから派生したティアオフ クラス。
ATL では、ティアオフ インターフェイスは 2 段階で実装されます。CComTearOffObjectBase のメソッドが参照カウントと QueryInterface を処理する間に、CComTearOffObject は IUnknown を実装します。
解説
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:
};
必要条件
ヘッダー : atlcom.h