次の方法で共有


CComTearOffObject クラス

このクラスは、ティアオフ インターフェイスを実装します。

構文

template<class Base>
class CComTearOffObject : public Base

パラメーター

Base
CComTearOffObjectBase から派生したティアオフ クラスと、ティアオフ オブジェクトでサポートするインターフェイス。

ATL は、2 つのフェーズ (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)();

戻り値

診断やテストに役立つ可能性がある値。

CComTearOffObject::CComTearOffObject

コンストラクター。

CComTearOffObject(void* pv);

パラメーター

pv
[入力] CComObject<Owner> オブジェクトへのポインターに変換されるポインター。

解説

所有者の参照カウントを 1 ずつインクリメントします。

CComTearOffObject::~CComTearOffObject

デストラクター。

~CComTearOffObject();

解説

割り当てられているすべてのリソースを解放し、FinalRelease を呼び出して、モジュールのロック数をデクリメントします。

CComTearOffObject::CComTearOffObjectBase

コンストラクター。

CComTearOffObjectBase();

解説

m_pOwner メンバーを NULL に初期化します。

CComTearOffObject::m_pOwner

Owner から派生した CComObject オブジェクトへのポインター。

CComObject<Owner>* m_pOwner;

パラメーター

所有者
[入力] ティアオフを実装するクラス。

解説

ポインターは、構築時に NULL に初期化されます。

CComTearOffObject::QueryInterface

要求されたインターフェイスへのポインターを取得します。

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

パラメーター

iid
[入力] 要求されているインターフェイスの IID。

ppvObject
[出力] iid で識別されるインターフェイス ポインターへのポインター。インターフェイスが見つからない場合は NULL。

戻り値

標準の HRESULT 値。

解説

最初に、ティアオフ クラスのインターフェイスに対してクエリを実行します。 インターフェイスがそこにない場合は、所有者オブジェクトのインターフェイスに対してクエリを実行します。 要求されたインターフェイスが IUnknown の場合、所有者の IUnknown を返します。

CComTearOffObject::Release

参照カウントを 1 つデクリメントし、参照カウントが 0 の場合は CComTearOffObject を削除します。

STDMETHOD_ULONG Release();

戻り値

デバッグなしのビルドでは、常に 0 が返されます。 デバッグ ビルドでは、診断またはテストに役立つ可能性のある値が返されます。

関連項目

CComCachedTearOffObject クラス
クラスの概要