英語で読む

次の方法で共有


ComPtr クラス

テンプレート パラメーターで指定されたインターフェイスを表す スマート ポインター 型を作成します。 ComPtr は、基になるインターフェイス ポインターの参照カウントを維持し、参照カウントがゼロになるとそのインターフェイスを自動的に解放します。

構文

template <typename T>
class ComPtr;

template<class U>
friend class ComPtr;

パラメーター

T
ComPtr が表すインターフェイス。

U
現在の ComPtr がフレンドであるクラス。 (このパラメーターを使用するテンプレートは保護されています)。

解説

ComPtr<> は、基になるインターフェイス ポインターを表す型を宣言します。 ComPtr<> を使用して変数を宣言してから、矢印のメンバー アクセス演算子 (->) を使用してインターフェイス メンバー関数にアクセスします。

スマート ポインターの詳細については、COM コーディングの実践に関する記事で「COM スマート ポインター」のサブセクションをご覧ください。

メンバー

パブリック typedef

名前 説明
InterfaceType T テンプレート パラメーターで指定された型のシノニム。

パブリック コンストラクター

名前 説明
ComPtr::ComPtr ComPtr クラスの新しいインスタンスを初期化します。 オーバーロードは、既定、コピー、移動、および変換の各コンストラクターを提供します。
ComPtr::~ComPtr ComPtr のインスタンスを初期化解除します。

パブリック メソッド

名前 説明
ComPtr::As 指定されたテンプレート パラメーターで識別されるインターフェイスを表す ComPtr オブジェクトを返します。
ComPtr::AsIID 指定されたインターフェイス ID で識別されるインターフェイスを表す ComPtr オブジェクトを返します。
ComPtr::AsWeak 現在のオブジェクトへの弱い参照を取得します。
ComPtr::Attach この ComPtr と、現在のテンプレート型パラメーターで指定されたインターフェイスの種類を関連付けます。
ComPtr::CopyTo この ComPtr に関連付けられた現在のまたは指定されたインターフェイスを、指定された出力ポインターにコピーします。
ComPtr::Detach この ComPtr が表すインターフェイスからその関連付けを解除します。
ComPtr::Get この ComPtr に関連付けられたインターフェイスへのポインターを取得します。
ComPtr::GetAddressOf このComPtrによって表されるインターフェイスへのポインターを含む、ptr_ データ メンバーのアドレスを取得します。
ComPtr::ReleaseAndGetAddressOf この ComPtr に関連付けられているインターフェイスを解放し、解放されたインターフェイスへのポインターを含む ptr_ データ メンバーのアドレスを取得します。
ComPtr::Reset この ComPtr に関連付けられているインターフェイスを解放し、新しい参照カウントを返します。
ComPtr::Swap 指定された ComPtr によって管理されているインターフェイスと現在の ComPtr によって管理されるインターフェイスを交換します。

保護メソッド

名前 説明
ComPtr::InternalAddRef この ComPtr に関連付けられたインターフェイスの参照カウントをインクリメントします。
ComPtr::InternalRelease この ComPtr に関連付けられたインターフェイスに対して COM 解放操作を実行します。

パブリック演算子

名前 説明
ComPtr::operator& 現在の ComPtr のアドレスを取得します。
ComPtr::operator-> 現在のテンプレート パラメーターで指定された型へのポインターを取得します。
ComPtr::operator= 値を現在の ComPtr に割り当てます。
ComPtr::operator== 2 つの ComPtr オブジェクトが等しいかどうかを示します。
ComPtr::operator!= 2 つの ComPtr オブジェクトが等しくないかどうかを示します。
ComPtr::operator Microsoft::WRL::Details::BoolType ComPtr でインターフェイスのオブジェクトの有効期間が管理されているかどうかを示します。

プロテクト データ メンバー

名前 説明
ComPtr::ptr_ この ComPtr に関連付けられ、管理されているインターフェイスへのポインターが含まれています。

継承階層

ComPtr

要件

ヘッダー: client.h

名前空間: Microsoft::WRL

ComPtr::~ComPtr

ComPtr のインスタンスを初期化解除します。

WRL_NOTHROW ~ComPtr();

ComPtr::As

指定されたテンプレート パラメーターで識別されるインターフェイスを表す ComPtr オブジェクトを返します。

template<typename U>
HRESULT As(
   _Out_ ComPtr<U>* p
) const;

template<typename U>
HRESULT As(
   _Out_ Details::ComPtrRef<ComPtr<U>> p
) const;

パラメーター

U
パラメーター pで表されるインターフェイス。

p
パラメーター Uで指定されたインターフェイスを表すComPtr オブジェクト。 パラメーター p は、現在の ComPtr オブジェクトを参照してはなりません。

解説

最初のテンプレートは、コードで使用する必要があるフォームです。 2 つ目のテンプレートは、内部のヘルパーの特殊化です。 auto型推論キーワードなどの C++ 言語機能をサポートしています。

戻り値

S_OK 成功した場合。それ以外の場合は、エラーを示す HRESULT

ComPtr::AsIID

指定されたインターフェイス ID で識別されるインターフェイスを表す ComPtr オブジェクトを返します。

WRL_NOTHROW HRESULT AsIID(
   REFIID riid,
   _Out_ ComPtr<IUnknown>* p
) const;

パラメーター

riid
インターフェイス ID。

p
ID が riid であるインターフェイスがオブジェクトにある場合は、 riid パラメーターで指定されたインターフェイスへの二重間接ポインター。 それ以外の場合は、IUnknown へのポインター。

戻り値

S_OK 成功した場合。それ以外の場合は、エラーを示す HRESULT

ComPtr::AsWeak

現在のオブジェクトへの弱い参照を取得します。

HRESULT AsWeak(
   _Out_ WeakRef* pWeakRef
);

パラメーター

pWeakRef
この操作が完了した場合は、弱い参照オブジェクトへのポインター。

戻り値

成功した場合は S_OK、そうでない場合はエラーを示す HRESULT。

ComPtr::Attach

この ComPtr と、現在のテンプレート型パラメーターで指定されたインターフェイスの種類を関連付けます。

void Attach(
   _In_opt_ InterfaceType* other
);

パラメーター

other
インターフェイスの型。

ComPtr::ComPtr

ComPtr クラスの新しいインスタンスを初期化します。 オーバーロードは、既定、コピー、移動、および変換の各コンストラクターを提供します。

WRL_NOTHROW ComPtr();

WRL_NOTHROW ComPtr(
   decltype(__nullptr)
);

template<class U>
WRL_NOTHROW ComPtr(
   _In_opt_ U *other
);

WRL_NOTHROW ComPtr(
   const ComPtr& other
);

template<class U>
WRL_NOTHROW ComPtr(
   const ComPtr<U> &other,
   typename ENABLE_IF<__is_convertible_to(U*, T*), void *>
);

WRL_NOTHROW ComPtr(
   _Inout_ ComPtr &&other
);

template<class U>
WRL_NOTHROW ComPtr(
   _Inout_ ComPtr<U>&& other, typename ENABLE_IF<__is_convertible_to(U*, T*), void *>
);

パラメーター

U
other パラメーターの型。

other
U 型オブジェクト。

戻り値

解説

最初のコンストラクターは、空のオブジェクトを暗黙的に作成する既定のコンストラクターです。 2 番目のコンストラクターは、空のオブジェクトを明示的に作成する __nullptrを指定します。

3 番目のコンストラクターは、ポインターによって指定されたオブジェクトからオブジェクトを作成します。 ComPtrは、ポイント先のメモリを所有し、それに対する参照カウントを保持するようになりました。

4 番目と 5 番目のコンストラクターはコピー コンストラクターです。 5 番目のコンストラクターは、オブジェクトを現在の型に変換可能な場合、このオブジェクトをコピーします。

6 番目と 7 番目のコンストラクターは移動コンストラクターです。 7 番目のコンストラクターは、オブジェクトを現在の型に変換可能な場合、このオブジェクトを移動します。

ComPtr::CopyTo

この ComPtr に関連付けられた現在のまたは指定されたインターフェイスを、指定されたポインターにコピーします。

HRESULT CopyTo(
   _Deref_out_ InterfaceType** ptr
);

HRESULT CopyTo(
   REFIID riid,
   _Deref_out_ void** ptr
) const;

template<typename U>
HRESULT CopyTo(
   _Deref_out_ U** ptr
) const;

パラメーター

U
型の名前。

ptr
この操作が完了した場合は要求されたインターフェイスへのポインター。

riid
インターフェイス ID。

戻り値

S_OK成功した場合。それ以外の場合は、暗黙的なQueryInterface操作が失敗した理由を示すHRESULT

解説

最初の関数は、この ComPtr に関連付けられているインターフェイスへのポインターのコピーを返します。 この関数は常に S_OKを返します。

2 番目の関数は、riid パラメーターで指定されたインターフェイスに対して、このComPtrに関連付けられているインターフェイスに対してQueryInterface操作を実行します。

3 番目の関数は、U パラメーターの基になるインターフェイスに対して、このComPtrに関連付けられているインターフェイスに対してQueryInterface操作を実行します。

ComPtr::Detach

この ComPtr が表すインターフェイスからその関連付けを解除します。

T* Detach();

戻り値

この ComPtr オブジェクトによって表されたインターフェイスへのポインター。

ComPtr::Get

この ComPtr に関連付けられたインターフェイスへのポインターを取得します。

T* Get() const;

戻り値

この ComPtr に関連付けられたインターフェイスへのポインター。

ComPtr::GetAddressOf

このComPtrによって表されるインターフェイスへのポインターを含む、ptr_ データ メンバーのアドレスを取得します。

T* const* GetAddressOf() const;
T** GetAddressOf();

戻り値

変数のアドレス。

ComPtr::InternalAddRef

この ComPtr に関連付けられたインターフェイスの参照カウントをインクリメントします。

void InternalAddRef() const;

解説

このメソッドは保護されています。

ComPtr::InternalRelease

この ComPtr に関連付けられたインターフェイスに対して COM 解放操作を実行します。

unsigned long InternalRelease();

解説

このメソッドは保護されています。

ComPtr::operator&

この ComPtr オブジェクトに関連付けられているインターフェイスを解放し、ComPtr オブジェクトのアドレスを取得します。

Details::ComPtrRef<WeakRef> operator&()

const Details::ComPtrRef<const WeakRef> operator&() const

戻り値

現在の ComPtr への弱い参照。

解説

このメソッドは、このメソッドがインターフェイス ポインターへの参照を解放するという点で、 ComPtr::GetAddressOf とは異なります。 インターフェイス ポインターのアドレスは必要ですが、そのインターフェイスを解放しない場合は ComPtr::GetAddressOf を使用します。

ComPtr::operator->

現在のテンプレート パラメーターで指定された型へのポインターを取得します。

WRL_NOTHROW Microsoft::WRL::Details::RemoveIUnknown<InterfaceType>* operator->() const;

戻り値

現在のテンプレート型名で指定された型へのポインター。

解説

このヘルパー関数は、STDMETHOD マクロを使用することで発生する不要なオーバーヘッドを除去します。 この関数は、virtual の代わりに IUnknownprivate を作成します。

ComPtr::operator=

値を現在の ComPtr に割り当てます。

WRL_NOTHROW ComPtr& operator=(
   decltype(__nullptr)
);
WRL_NOTHROW ComPtr& operator=(
   _In_opt_ T *other
);
template <typename U>
WRL_NOTHROW ComPtr& operator=(
   _In_opt_ U *other
);
WRL_NOTHROW ComPtr& operator=(
   const ComPtr &other
);
template<class U>
WRL_NOTHROW ComPtr& operator=(
   const ComPtr<U>& other
);
WRL_NOTHROW ComPtr& operator=(
   _Inout_ ComPtr &&other
);
template<class U>
WRL_NOTHROW ComPtr& operator=(
   _Inout_ ComPtr<U>&& other
);

パラメーター

U
クラス。

other
型または別の ComPtr へのポインター、参照、または右辺値参照。

戻り値

現在の ComPtr への参照。

解説

この演算子の最初のバージョンでは、現在の ComPtr に空の値が割り当てられます。

2 番目のバージョンでは、割り当てインターフェイス ポインターが現在の ComPtr インターフェイス ポインターと同じでない場合、2 番目のインターフェイス ポインターが現在の ComPtr に割り当てられます。

3 番目のバージョンでは、割り当てインターフェイス ポインターが現在の ComPtr に割り当てられます。

4 番目のバージョンでは、割り当て値のインターフェイス ポインターが現在の ComPtr インターフェイス ポインターと同じでない場合、2 番目のインターフェイス ポインターが現在の ComPtr に割り当てられます。

5 番目のバージョンはコピー演算子です。ComPtr への参照が現在の ComPtr に割り当てられます。

6 番目のバージョンは、移動セマンティクスを使用するコピー演算子です。任意の型が静的キャストであり、現在の ComPtr に割り当てられる場合は、ComPtr への右辺値参照です。

7 番目のバージョンは、移動セマンティクスを使用するコピー演算子です。U型のComPtrへの右辺値参照は静的キャストされ、現在のComPtrに割り当てられます。

ComPtr::operator==

2 つの ComPtr オブジェクトが等しいかどうかを示します。

bool operator==(
   const ComPtr<T>& a,
   const ComPtr<U>& b
);

bool operator==(
   const ComPtr<T>& a,
   decltype(__nullptr)
);

bool operator==(
   decltype(__nullptr),
   const ComPtr<T>& a
);

パラメーター

a
ComPtr オブジェクトへの参照です。

b
別の ComPtr オブジェクトへの参照。

戻り値

最初の演算子は、オブジェクト aがオブジェクト bと等しい場合はtrueを生成します。それ以外の場合はfalse

2 番目と 3 番目の演算子は、オブジェクトanullptrと等しい場合はtrueを生成します。それ以外の場合はfalse

ComPtr::operator!=

2 つの ComPtr オブジェクトが等しくないかどうかを示します。

bool operator!=(
   const ComPtr<T>& a,
   const ComPtr<U>& b
);

bool operator!=(
   const ComPtr<T>& a,
   decltype(__nullptr)
);

bool operator!=(
   decltype(__nullptr),
   const ComPtr<T>& a
);

パラメーター

a
ComPtr オブジェクトへの参照です。

b
別の ComPtr オブジェクトへの参照。

戻り値

最初の演算子は、オブジェクトaがオブジェクト bと等しくない場合はtrueを生成します。それ以外の場合はfalse

オブジェクトanullptrと等しくない場合、2 番目と 3 番目の演算子はtrueを生成します。それ以外の場合はfalse

ComPtr::operator Microsoft::WRL::Details::BoolType

ComPtr でインターフェイスのオブジェクトの有効期間が管理されているかどうかを示します。

WRL_NOTHROW operator Microsoft::WRL::Details::BoolType() const;

戻り値

インターフェイスがこの ComPtrに関連付けられている場合は、 BoolStruct::Member データ メンバーのアドレス。それ以外の場合は nullptr

ComPtr::ptr_

この ComPtr に関連付けられ、管理されているインターフェイスへのポインターが含まれています。

InterfaceType *ptr_;

解説

ptr_ は、保護された内部のデータ メンバーです。

ComPtr::ReleaseAndGetAddressOf

この ComPtr に関連付けられているインターフェイスを解放し、解放されたインターフェイスへのポインターを含む ptr_ データ メンバーのアドレスを取得します。

T** ReleaseAndGetAddressOf();

戻り値

このComPtrptr_ データ メンバーのアドレス。

ComPtr::Reset

この ComPtr に関連付けられているインターフェイスを解放し、新しい参照カウントを返します。

unsigned long Reset();

戻り値

基になるインターフェイスに残っている参照の数 (存在する場合)。

ComPtr::Swap

指定された ComPtr によって管理されているインターフェイスと現在の ComPtr によって管理されるインターフェイスを交換します。

void Swap(
   _Inout_ ComPtr&& r
);

void Swap(
   _Inout_ ComPtr& r
);

パラメーター

r
ComPtr です。