次の方法で共有


CComTearOffObject クラス

更新 : 2007 年 11 月

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

template<
   class Base 
>
class CComTearOffObject :
      public Base

パラメータ

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

ATL では、ティアオフ インターフェイスは 2 段階で実装されます。CComTearOffObjectBase のメソッドが参照カウントと QueryInterface を処理する間に、CComTearOffObjectIUnknown を実装します。

解説

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

参照

参照

CComCachedTearOffObject クラス

その他の技術情報

CComTearOffObject のメンバ

ATL クラスの概要