Поделиться через


Класс 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.