Класс ComPtr
Создает тип интеллектуальный указатель , который представляет интерфейс, определяемый параметром шаблона. ComPtr
автоматически поддерживает счетчик ссылок для указателя базового интерфейса и освобождает интерфейс, когда счетчик ссылок становится равен нулю.
Синтаксис
template <typename T>
class ComPtr;
template<class U>
friend class ComPtr;
Параметры
T
Интерфейс, представляющий ComPtr
.
U
Класс, которому является текущий ComPtr
друг. (Шаблон, который использует этот параметр, защищен.)
Замечания
ComPtr<>
объявляет тип, представляющий базовый указатель интерфейса. Используется ComPtr<>
для объявления переменной и использования оператора доступа к члену со стрелкой (->
) для доступа к функции члена интерфейса.
Дополнительные сведения о смарт-указателях см. в подразделе "Интеллектуальные указатели COM" статьи о методах программирования COM.
Участники
Общедоступные определения типов
Имя | Описание |
---|---|
InterfaceType |
Синоним типа, указанного параметром шаблона T . |
Открытые конструкторы
Имя | Описание |
---|---|
ComPtr::ComPtr |
Инициализирует новый экземпляр класса ComPtr . Перегрузки предоставляют конструкторы по умолчанию, конструкторы копирования, перемещения и преобразования. |
ComPtr::~ComPtr |
Деинициализирует экземпляр ComPtr . |
Открытые методы
Имя | Описание |
---|---|
ComPtr::As |
ComPtr Возвращает объект, представляющий интерфейс, определенный указанным параметром шаблона. |
ComPtr::AsIID |
ComPtr Возвращает объект, представляющий интерфейс, определенный указанным идентификатором интерфейса. |
ComPtr::AsWeak |
Извлекает слабую ссылку на текущий объект. |
ComPtr::Attach |
Связывает это ComPtr с типом интерфейса, заданным текущим параметром типа шаблона. |
ComPtr::CopyTo |
Копирует текущий или указанный интерфейс, связанный с этим ComPtr , в указанный указатель вывода. |
ComPtr::Detach |
Отсоединяет это ComPtr от интерфейса, который он представляет. |
ComPtr::Get |
Извлекает указатель на интерфейс, связанный с этим ComPtr . |
ComPtr::GetAddressOf |
Извлекает адрес ptr_ элемента данных, который содержит указатель на интерфейс, представленный этим ComPtr элементом. |
ComPtr::ReleaseAndGetAddressOf |
Освобождает интерфейс, связанный с этим ComPtr , а затем извлекает адрес ptr_ члена данных, который содержит указатель на выпущенный интерфейс. |
ComPtr::Reset |
Освобождает интерфейс, связанный с этим ComPtr , и возвращает новое число ссылок. |
ComPtr::Swap |
Обмен интерфейсом, управляемым текущим ComPtr интерфейсом, управляемым указанным ComPtr . |
Защищенные методы
Имя | Описание |
---|---|
ComPtr::InternalAddRef |
Увеличивает число ссылок интерфейса, связанного с этим ComPtr . |
ComPtr::InternalRelease |
Выполняет операцию выпуска COM в интерфейсе, связанном с этим ComPtr . |
Открытые операторы
Имя | Описание |
---|---|
ComPtr::operator& |
Извлекает адрес текущего ComPtr . |
ComPtr::operator-> |
Извлекает указатель на тип, заданный текущим параметром шаблона. |
ComPtr::operator= |
Присваивает значение текущему ComPtr . |
ComPtr::operator== |
Определение равенства двух объектов ComPtr . |
ComPtr::operator!= |
Указывает, равны ли два 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
объект.
Замечания
Первый шаблон — это форма, которую необходимо использовать в коде. Второй шаблон является внутренней вспомогательной специализацией. Он поддерживает такие функции языка C++, как ключевое слово вычета auto
типов.
Возвращаемое значение
S_OK
в случае успешного выполнения; в противном случае — значение HRESULT
, указывающее на ошибку.
ComPtr::AsIID
ComPtr
Возвращает объект, представляющий интерфейс, определенный указанным идентификатором интерфейса.
WRL_NOTHROW HRESULT AsIID(
REFIID riid,
_Out_ ComPtr<IUnknown>* p
) const;
Параметры
riid
Идентификатор интерфейса.
p
Если объект имеет интерфейс, идентификатор которого равен 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
.
Возвращаемое значение
Замечания
Первый конструктор — это конструктор по умолчанию, который неявно создает пустой объект. Второй конструктор указывает __nullptr
, что явно создает пустой объект.
Третий конструктор создает объект из объекта, указанного указателем. Теперь ComPtr
он владеет памятью и поддерживает количество ссылок.
Четвертый и пятый конструкторы — это конструкторы копирования. Пятый конструктор копирует объект, если он преобразуется в текущий тип.
Шестые и седьмое конструкторы — конструкторы перемещения. Седьмой конструктор перемещает объект, если он преобразуется в текущий тип.
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
Идентификатор интерфейса.
Возвращаемое значение
S_OK
в случае успешного выполнения; в противном случае значение, указывающее, почему неявная HRESULT
QueryInterface
операция завершилась ошибкой.
Замечания
Первая функция возвращает копию указателя на интерфейс, связанный с этим ComPtr
. Эта функция всегда возвращается S_OK
.
Вторая функция выполняет QueryInterface
операцию в интерфейсе, связанном с этим ComPtr
для интерфейса, заданного параметром riid
.
Третья функция выполняет QueryInterface
операцию в интерфейсе, связанном с этим ComPtr
для базового интерфейса U
параметра.
ComPtr::Detach
Отменяет связь этого объекта ComPtr
с интерфейсом, который он представляет.
T* Detach();
Возвращаемое значение
Указатель на интерфейс, который был представлен этим объектом ComPtr
.
ComPtr::Get
Извлекает указатель на интерфейс, связанный с этим ComPtr
.
T* Get() const;
Возвращаемое значение
Указатель на интерфейс, связанный с этим ComPtr
.
ComPtr::GetAddressOf
Извлекает адрес ptr_
элемента данных, который содержит указатель на интерфейс, представленный этим ComPtr
элементом.
T* const* GetAddressOf() const;
T** GetAddressOf();
Возвращаемое значение
Адрес переменной.
ComPtr::InternalAddRef
Увеличивает число ссылок интерфейса, связанного с этим ComPtr
.
void InternalAddRef() const;
Замечания
Этот метод защищен.
ComPtr::InternalRelease
Выполняет операцию выпуска COM в интерфейсе, связанном с этим ComPtr
.
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. Эта функция делает IUnknown
типы private
вместо virtual
.
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
Указатель, ссылка или ссылка rvalue на тип или другой ComPtr
.
Возвращаемое значение
Ссылка на текущую ComPtr
.
Замечания
Первая версия этого оператора назначает пустое значение текущему ComPtr
.
Во второй версии, если указатель назначаемого интерфейса не совпадает с текущим ComPtr
указателем интерфейса, то второй указатель интерфейса назначается текущему ComPtr
указателю.
В третьей версии указатель интерфейса назначается текущему ComPtr
объекту.
В четвертой версии, если указатель интерфейса присваивающего значения не совпадает с текущим указателем интерфейса, то второй указатель интерфейса назначается текущему ComPtr
ComPtr
указателю.
Пятая версия — оператор копирования; Ссылка на текущую ComPtr
ComPtr
.
Шестая версия — это оператор копирования, использующий семантику перемещения; ссылка rvalue на ComPtr
тип, если какой-либо тип является статическим приведением, а затем назначается текущему ComPtr
.
Седьмая версия — это оператор копирования, использующий семантику перемещения; Ссылка rvalue на ComPtr
тип U
является статическим приведением, а затем назначается текущему ComPtr
.
ComPtr::operator==
Определение равенства двух объектов 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
объект.
Возвращаемое значение
Первый оператор возвращает true
значение, если объект равен объекту a
b
; в противном случае false
.
Второй и третий операторы дают true
значение, если объект a
равен nullptr
; в противном случае false
.
ComPtr::operator!=
Указывает, равны ли два 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
объект.
Возвращаемое значение
Первый оператор возвращает true
значение, если объект не равен объекту a
b
; в противном случае false
.
Второй и третий операторы дают true
, если объект a
не равен nullptr
; в противном случае 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();
Возвращаемое значение
Адрес ptr_
элемента данных этого ComPtr
элемента.
ComPtr::Reset
Освобождает интерфейс, связанный с этим ComPtr
, и возвращает новое число ссылок.
unsigned long Reset();
Возвращаемое значение
Количество ссылок, оставшихся в базовом интерфейсе, если таковые есть.
ComPtr::Swap
Обмен интерфейсом, управляемым текущим ComPtr
интерфейсом, управляемым указанным ComPtr
.
void Swap(
_Inout_ ComPtr&& r
);
void Swap(
_Inout_ ComPtr& r
);
Параметры
r
ComPtr
.