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 が返されます。 デバッグ ビルドでは、診断またはテストに役立つ可能性のある値が返されます。