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
ComPtrパラメーターUで指定されたインターフェイスを表すオブジェクト。 パラメーター p は、現在 ComPtr のオブジェクトを参照することはできません。

解説

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

戻り値

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

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 エラーを示す an。

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 成功した場合。それ以外の場合は HRESULT 、暗黙的な QueryInterface 操作が失敗した理由を示す an。

解説

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

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

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

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 番目の演算子は、オブジェクトaが等しいnullptr場合に生成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

2 番目と 3 番目の演算子は、オブジェクトaが等しくない場合にnullptr生成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();

戻り値

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

ComPtr::Reset

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

unsigned long Reset();

戻り値

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

ComPtr::Swap

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

void Swap(
   _Inout_ ComPtr&& r
);

void Swap(
   _Inout_ ComPtr& r
);

パラメーター

r
ComPtr です。