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
の代わりに IUnknown
型 private
を作成します。
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
。
オブジェクトa
がnullptr
と等しくない場合、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();
戻り値
このComPtr
のptr_
データ メンバーのアドレス。
ComPtr::Reset
この ComPtr
に関連付けられているインターフェイスを解放し、新しい参照カウントを返します。
unsigned long Reset();
戻り値
基になるインターフェイスに残っている参照の数 (存在する場合)。
ComPtr::Swap
指定された ComPtr
によって管理されているインターフェイスと現在の ComPtr
によって管理されるインターフェイスを交換します。
void Swap(
_Inout_ ComPtr&& r
);
void Swap(
_Inout_ ComPtr& r
);
パラメーター
r
ComPtr
です。