ComPtr Class
Creates a smart pointer type that represents the interface specified by the template parameter. ComPtr
automatically maintains a reference count for the underlying interface pointer and releases the interface when the reference count goes to zero.
Syntax
template <typename T>
class ComPtr;
template<class U>
friend class ComPtr;
Parameters
T
The interface that the ComPtr
represents.
U
A class to which the current ComPtr
is a friend. (The template that uses this parameter is protected.)
Remarks
ComPtr<>
declares a type that represents the underlying interface pointer. Use ComPtr<>
to declare a variable and then use the arrow member-access operator (->
) to access an interface member function.
For more information about smart pointers, see the "COM Smart Pointers" subsection of the COM Coding Practices article.
Members
Public Typedefs
Name | Description |
---|---|
InterfaceType |
A synonym for the type specified by the T template parameter. |
Public Constructors
Name | Description |
---|---|
ComPtr::ComPtr |
Initializes a new instance of the ComPtr class. Overloads provide default, copy, move, and conversion constructors. |
ComPtr::~ComPtr |
Deinitializes an instance of ComPtr . |
Public Methods
Name | Description |
---|---|
ComPtr::As |
Returns a ComPtr object that represents the interface identified by the specified template parameter. |
ComPtr::AsIID |
Returns a ComPtr object that represents the interface identified by the specified interface ID. |
ComPtr::AsWeak |
Retrieves a weak reference to the current object. |
ComPtr::Attach |
Associates this ComPtr with the interface type specified by the current template type parameter. |
ComPtr::CopyTo |
Copies the current or specified interface associated with this ComPtr to the specified output pointer. |
ComPtr::Detach |
Disassociates this ComPtr from the interface that it represents. |
ComPtr::Get |
Retrieves a pointer to the interface that is associated with this ComPtr . |
ComPtr::GetAddressOf |
Retrieves the address of the ptr_ data member, which contains a pointer to the interface represented by this ComPtr . |
ComPtr::ReleaseAndGetAddressOf |
Releases the interface associated with this ComPtr and then retrieves the address of the ptr_ data member, which contains a pointer to the interface that was released. |
ComPtr::Reset |
Releases the interface associated with this ComPtr and returns the new reference count. |
ComPtr::Swap |
Exchanges the interface managed by the current ComPtr with the interface managed by the specified ComPtr . |
Protected Methods
Name | Description |
---|---|
ComPtr::InternalAddRef |
Increments the reference count of the interface associated with this ComPtr . |
ComPtr::InternalRelease |
Performs a COM Release operation on the interface associated with this ComPtr . |
Public Operators
Name | Description |
---|---|
ComPtr::operator& |
Retrieves the address of the current ComPtr . |
ComPtr::operator-> |
Retrieves a pointer to the type specified by the current template parameter. |
ComPtr::operator= |
Assigns a value to the current ComPtr . |
ComPtr::operator== |
Indicates whether two ComPtr objects are equal. |
ComPtr::operator!= |
Indicates whether two ComPtr objects aren't equal. |
ComPtr::operator Microsoft::WRL::Details::BoolType |
Indicates whether a ComPtr is managing the object lifetime of an interface. |
Protected Data Members
Name | Description |
---|---|
ComPtr::ptr_ |
Contains a pointer to the interface that is associated with, and managed by this ComPtr . |
Inheritance Hierarchy
ComPtr
Requirements
Header: client.h
Namespace: Microsoft::WRL
ComPtr::~ComPtr
Deinitializes an instance of ComPtr
.
WRL_NOTHROW ~ComPtr();
ComPtr::As
Returns a ComPtr
object that represents the interface identified by the specified template parameter.
template<typename U>
HRESULT As(
_Out_ ComPtr<U>* p
) const;
template<typename U>
HRESULT As(
_Out_ Details::ComPtrRef<ComPtr<U>> p
) const;
Parameters
U
The interface to be represented by parameter p
.
p
A ComPtr
object that represents the interface specified by parameter U
. Parameter p
must not refer to the current ComPtr
object.
Remarks
The first template is the form that you should use in your code. The second template is an internal, helper specialization. It supports C++ language features such as the auto
type deduction keyword.
Return Value
S_OK
if successful; otherwise, an HRESULT
that indicates the error.
ComPtr::AsIID
Returns a ComPtr
object that represents the interface identified by the specified interface ID.
WRL_NOTHROW HRESULT AsIID(
REFIID riid,
_Out_ ComPtr<IUnknown>* p
) const;
Parameters
riid
An interface ID.
p
If the object has an interface whose ID equals riid
, a doubly indirect pointer to the interface specified by the riid
parameter. Otherwise, a pointer to IUnknown
.
Return Value
S_OK
if successful; otherwise, an HRESULT
that indicates the error.
ComPtr::AsWeak
Retrieves a weak reference to the current object.
HRESULT AsWeak(
_Out_ WeakRef* pWeakRef
);
Parameters
pWeakRef
When this operation completes, a pointer to a weak reference object.
Return Value
S_OK if successful; otherwise, an HRESULT that indicates the error.
ComPtr::Attach
Associates this ComPtr
with the interface type specified by the current template type parameter.
void Attach(
_In_opt_ InterfaceType* other
);
Parameters
other
An interface type.
ComPtr::ComPtr
Initializes a new instance of the ComPtr
class. Overloads provide default, copy, move, and conversion constructors.
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 *>
);
Parameters
U
The type of the other
parameter.
other
An object of type U
.
Return Value
Remarks
The first constructor is the default constructor, which implicitly creates an empty object. The second constructor specifies __nullptr
, which explicitly creates an empty object.
The third constructor creates an object from the object specified by a pointer. The ComPtr
now owns the pointed-to memory and maintains a reference count to it.
The fourth and fifth constructors are copy constructors. The fifth constructor copies an object if it's convertible to the current type.
The sixth and seventh constructors are move constructors. The seventh constructor moves an object if it's convertible to the current type.
ComPtr::CopyTo
Copies the current or specified interface associated with this ComPtr
to the specified pointer.
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;
Parameters
U
A type name.
ptr
When this operation completes, a pointer to the requested interface.
riid
An interface ID.
Return Value
S_OK
if successful; otherwise, an HRESULT
that indicates why the implicit QueryInterface
operation failed.
Remarks
The first function returns a copy of a pointer to the interface associated with this ComPtr
. This function always returns S_OK
.
The second function performs a QueryInterface
operation on the interface associated with this ComPtr
for the interface specified by the riid
parameter.
The third function performs a QueryInterface
operation on the interface associated with this ComPtr
for the underlying interface of the U
parameter.
ComPtr::Detach
Disassociates this ComPtr
object from the interface that it represents.
T* Detach();
Return Value
A pointer to the interface that was represented by this ComPtr
object.
ComPtr::Get
Retrieves a pointer to the interface that is associated with this ComPtr
.
T* Get() const;
Return Value
Pointer to the interface that is associated with this ComPtr
.
ComPtr::GetAddressOf
Retrieves the address of the ptr_
data member, which contains a pointer to the interface represented by this ComPtr
.
T* const* GetAddressOf() const;
T** GetAddressOf();
Return Value
The address of a variable.
ComPtr::InternalAddRef
Increments the reference count of the interface associated with this ComPtr
.
void InternalAddRef() const;
Remarks
This method is protected.
ComPtr::InternalRelease
Performs a COM Release operation on the interface associated with this ComPtr
.
unsigned long InternalRelease();
Remarks
This method is protected.
ComPtr::operator&
Releases the interface associated with this ComPtr
object and then retrieves the address of the ComPtr
object.
Details::ComPtrRef<WeakRef> operator&()
const Details::ComPtrRef<const WeakRef> operator&() const
Return Value
A weak reference to the current ComPtr
.
Remarks
This method differs from ComPtr::GetAddressOf
in that this method releases a reference to the interface pointer. Use ComPtr::GetAddressOf
when you require the address of the interface pointer but don't want to release that interface.
ComPtr::operator->
Retrieves a pointer to the type specified by the current template parameter.
WRL_NOTHROW Microsoft::WRL::Details::RemoveIUnknown<InterfaceType>* operator->() const;
Return Value
Pointer to the type specified by the current template type name.
Remarks
This helper function removes unnecessary overhead caused by using the STDMETHOD macro. This function makes IUnknown
types private
instead of virtual
.
ComPtr::operator=
Assigns a value to the current 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
);
Parameters
U
A class.
other
A pointer, reference, or rvalue reference to a type or another ComPtr
.
Return Value
A reference to the current ComPtr
.
Remarks
The first version of this operator assigns an empty value to the current ComPtr
.
In the second version, if the assigning interface pointer isn't the same as the current ComPtr
interface pointer, the second interface pointer is assigned to the current ComPtr
.
In the third version, the assigning interface pointer is assigned to the current ComPtr
.
In the fourth version, if the interface pointer of the assigning value isn't the same as the current ComPtr
interface pointer, the second interface pointer is assigned to the current ComPtr
.
The fifth version is a copy operator; a reference to a ComPtr
is assigned to the current ComPtr
.
The sixth version is a copy operator that uses move semantics; an rvalue reference to a ComPtr
if any type is static cast and then assigned to the current ComPtr
.
The seventh version is a copy operator that uses move semantics; an rvalue reference to a ComPtr
of type U
is static cast then and assigned to the current ComPtr
.
ComPtr::operator==
Indicates whether two ComPtr
objects are equal.
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
);
Parameters
a
A reference to a ComPtr
object.
b
A reference to another ComPtr
object.
Return Value
The first operator yields true
if object a
is equal to object b
; otherwise, false
.
The second and third operators yield true
if object a
is equal to nullptr
; otherwise, false
.
ComPtr::operator!=
Indicates whether two ComPtr
objects aren't equal.
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
);
Parameters
a
A reference to a ComPtr
object.
b
A reference to another ComPtr
object.
Return Value
The first operator yields true
if object a
isn't equal to object b
; otherwise, false
.
The second and third operators yield true
if object a
isn't equal to nullptr
; otherwise, false
.
ComPtr::operator Microsoft::WRL::Details::BoolType
Indicates whether a ComPtr
is managing the object lifetime of an interface.
WRL_NOTHROW operator Microsoft::WRL::Details::BoolType() const;
Return Value
If an interface is associated with this ComPtr
, the address of the BoolStruct::Member
data member; otherwise, nullptr
.
ComPtr::ptr_
Contains a pointer to the interface that is associated with, and managed by this ComPtr
.
InterfaceType *ptr_;
Remarks
ptr_
is an internal, protected data member.
ComPtr::ReleaseAndGetAddressOf
Releases the interface associated with this ComPtr
and then retrieves the address of the ptr_
data member, which contains a pointer to the interface that was released.
T** ReleaseAndGetAddressOf();
Return Value
The address of the ptr_
data member of this ComPtr
.
ComPtr::Reset
Releases the interface associated with this ComPtr
and returns the new reference count.
unsigned long Reset();
Return Value
The number of references remaining to the underlying interface, if any.
ComPtr::Swap
Exchanges the interface managed by the current ComPtr
with the interface managed by the specified ComPtr
.
void Swap(
_Inout_ ComPtr&& r
);
void Swap(
_Inout_ ComPtr& r
);
Parameters
r
A ComPtr
.