Вы находитесь на странице: 1из 852

Оставьте отзыв о скачивании PDF-файла.

Универсальные приложения Windows


(C++)
Статья • 03.04.2023

Универсальная платформа Windows (UWP) — это современный программный


интерфейс для Windows. С помощью UWP вы создаете приложение или компонент
один раз и развертываете его на любом Windows 10 или более поздней версии
устройства. Вы можете написать компонент на C++, а приложения, написанные на
любом другом языке, совместимом с UWP, могут использовать его.

Большая часть документации по UWP находится в дереве содержимого Windows в


универсальная платформа Windows документации. Здесь вы найдете начальные
руководства, а также справочную документацию.

Для новых приложений и компонентов UWP рекомендуется использовать


C++/WinRT, новую стандартную проекцию языка C++17 для среда выполнения
Windows API. C++/WinRT доступна в Windows SDK начиная с версии 1803
(10.0.17134.0). C++/WinRT реализована полностью в файлах заголовков и
предназначена для предоставления доступа к современным API Windows через
первый класс. В отличие от реализации C++/CX, C++/WinRT не использует
нестандартный синтаксис или расширения языка Майкрософт и использует все
преимущества компилятора C++ для создания высокооптимизируемых выходных
данных. Дополнительные сведения см. в статье Введение в C++/WinRT.

Вы можете использовать конвертер приложений мост для классических


приложений, чтобы упаковать существующее классическое приложение для
развертывания в Microsoft Store. Дополнительные сведения см. в статье
Использование среды выполнения Visual C++ в проекте Centennial и мост для
классических приложений.

Приложения UWP, использующие C++/CX


Справочник по языку C++/CX

Описывает набор расширений, которые упрощают использование api среда


выполнения Windows на C++ и обеспечивают обработку ошибок на основе
исключений.

Создание приложений и библиотек (C++/CX)

Описание создания библиотек DLL и статических библиотек, доступных из


приложения или компонента C++/CX.
Руководство. Создание приложения UWP "Hello, World" на C++/CX

Пошаговое руководство, включающее основные понятия разработки приложений


UWP в C++/CX.

Создание компонентов среда выполнения Windows в C++/CX

Описывает, как создавать библиотеки DLL, которые могут использовать другие


приложения и компоненты UWP.

Программирование игр UWP

Описывает, как использовать DirectX и C++/CX для создания игр.

Приложения UWP, использующие


библиотеку шаблонов C++ среда
выполнения Windows (WRL)
Библиотека шаблонов среда выполнения Windows C++ предоставляет
низкоуровневые COM-интерфейсы, с помощью которых код ISO C++ может
получить доступ к среда выполнения Windows в среде без исключений. В
большинстве случаев рекомендуется использовать C++/WinRT или C++/CX вместо
библиотеки шаблонов среда выполнения Windows C++ для разработки
приложений UWP. Сведения о библиотеке шаблонов среда выполнения Windows
C++ см. в среда выполнения Windows библиотеке шаблонов C++ (WRL).

См. также раздел


C++ в Visual Studio

Общие сведения о программировании Windows на C++

Справочник по языку C++/CX


Статья • 03.04.2023

C++/CX — это набор расширений языка C++, которые позволяют создавать


приложения Для Windows и среда выполнения Windows компоненты в идиоме,
которая максимально приближена к современному C++. Используйте C++/CX для
написания приложений и компонентов Windows в машинном коде, которые легко
взаимодействуют с Visual C#, Visual Basic, JavaScript и другими языками,
поддерживающими среда выполнения Windows. В тех редких случаях, когда
требуется прямой доступ к необработанным COM-интерфейсам или коду, можно
использовать библиотеку шаблонов среда выполнения Windows C++ (WRL).

7 Примечание

/WinRT является рекомендуемой альтернативой C++для/CX. C++ Это новая


стандартная проекция языка C++17 для API-интерфейсов среда выполнения
Windows, доступная в последней версии windows SDK с версии 1803
(10.0.17134.0). C++/WinRT полностью реализован в файлах заголовков и
предназначен для предоставления первоклассного доступа к современному
API Windows.

C++/WinRT позволяет использовать и создавать API среда выполнения


Windows с помощью любого компилятора C++17, соответствующего
стандартам. C++/WinRT обычно работает лучше и создает меньшие двоичные
файлы, чем любой другой языковой параметр для среда выполнения Windows.
Мы продолжим предоставлять поддержку C++/CX и WRL, но в новых
приложениях настоятельно рекомендуется использовать C++/WinRT. См.
дополнительные сведения о C++/WinRT.

С помощью C++/CX можно создавать:

C++ универсальная платформа Windows приложения (UWP), которые


используют XAML для определения пользовательского интерфейса и
использования собственного стека. Дополнительные сведения см. в статье
Создание приложения hello world на C++ (UWP).

C++ среда выполнения Windows компоненты, которые могут использоваться


приложениями Windows на основе JavaScript. Для получения дополнительной
информации см. Creating Windows Runtime Components in C++.
Игры Windows на базе DirectX и приложения, активно использующие графику.
Дополнительные сведения см. в статье Создание простой игры UWP с
помощью DirectX.

Похожие статьи
Ссылка Описание

Краткий справочник Таблица ключевых слов и операторов для C++/CX.

Система типов Описание базовых типов C++/CX и программных конструкций,


а также способы использования C++/CX для использования и
создания типов среда выполнения Windows.

Построение приложений Описывается использование интегрированной среды


и библиотек разработки для создания приложений и связывания со
статическими библиотеками и библиотеками DLL.

Взаимодействие с другими Описывает, как компоненты, написанные с помощью C++/CX,


языками можно использовать с компонентами, написанными на
JavaScript, любом управляемом языке или библиотеке
шаблонов среда выполнения Windows C++.

Потоки и маршалинг Принципы указания поведения при использовании потоков и


маршалинга в создаваемых компонентах.

Справочник по Справочная документация по следующим пространствам имен:


пространствам имен по умолчанию, Platform, Platform::Collections и другим
связанным с ними пространствам имен.

Функции CRT, которые не Список функций CRT, недоступных для использования в


поддерживаются в приложениях среды выполнения Windows.
приложениях
универсальной
платформы Windows

Начало работы с Предоставляет общие рекомендации по приложениям UWP


приложениями для для Windows и ссылки на дополнительные сведения.
Windows
Ссылка Описание

C++/CX: часть 0 из [n]. Вводная серия блогов о C++/CX.


Введение

C++/CX, часть 1 из [n]:


простой класс

C++/CX: часть 2 из [n].


Типы с крышками

C++/CX: часть 3 из [n]. В


разработке

C++/CX: часть 4 из [n].


Статические функции-
члены
Краткий справочник (C++/CX)
Статья • 03.04.2023

Среда выполнения Windows поддерживает приложения универсальная платформа


Windows (UWP). Эти приложения выполняются только в надежной среде
операционной системы, используют авторизованные функции, типы данных и
устройства и распространяются через Microsoft Store. C++/CX упрощает написание
приложений для среда выполнения Windows. Эта статья является кратким
справочником; более полную документацию см. в разделе Система типов.

При сборке в командной строке используйте параметр компилятора /ZW , чтобы


создать приложение UWP или компонент среда выполнения Windows. Чтобы
получить доступ к объявлениям среда выполнения Windows, которые определены
в файлах метаданных среда выполнения Windows (WINMD), укажите директиву
#using или параметр компилятора /FU . При создании проекта для приложения
UWP Visual Studio по умолчанию задает эти параметры и добавляет ссылки на все
библиотеки среда выполнения Windows.

Краткий справочник
Концепция Стандартная C++/CX Комментарии
C++

Фундаментальные Базовые типы Основные типы C++/CX, Пространство


типы C++. реализующие default имен
фундаментальные типы, содержит
определенные в среда встроенные
выполнения Windows. базовые типы
C++/CX.
Компилятор неявно
сопоставляет
фундаментальные
типы C++/CX со
стандартными
типами C++.

Семейство Platform
пространств имен
содержит типы,
реализующие
базовые типы среда
выполнения
Windows.
Концепция Стандартная C++/CX Комментарии
C++

bool bool 8-битовое


логическое
значение.

wchar_t , char16 16-битовое


char16_t нечисловое
значение,
представляющее
кодовую точку
Юникода (UTF-16).

short
int16
16-разрядное
знаковое целое
unsigned short uint16 число.

16-разрядное целое
число без знака.

int
int
32-разрядное
знаковое целое
unsigned int uint32 число.

32-разрядное целое
число без знака.

long long -или- int64


64-разрядное целое
__int64
число со знаком.

uint64
unsigned long 64-разрядное целое
long число без знака.

float , double float32 , float64 32-битовое число с


плавающей запятой
или 64-битовое
число IEEE 754 с
плавающей запятой.

enum enum class


32-битовое
перечисление.
-или-

enum struct
Концепция Стандартная C++/CX Комментарии
C++

(Не Platform::Guid 128-битовое


применяется) нечисловое
значение (GUID) в
пространстве имен
Platform .

std::time_get Windows::Foundation::DateTime Структура даты и


времени.

(Не Windows::Foundation::TimeSpan Структура


применяется) интервала времени.

(Не Platform::Object^ Базовый объект со


применяется) счетчиком ссылок в
представлении C++
системы типов
среда выполнения
Windows.

std::wstring
Platform::String^ Platform::String^ —
это неизменяемая
L"..." последовательность
символов Юникода
с подсчетом ссылок,
представляющих
текст.
Концепция Стандартная C++/CX Комментарии
C++

Указатель Указатель на Дескриптор объекта ( ^ , Все классы среда


объект ( * ):
произносится "крышка"):
выполнения
Windows
std::shared_ptr T^ identifier объявляются с
помощью
модификатора
handle-to-object.
Доступ к членам
объекта
осуществляется с
помощью
оператора доступа к
членам класса в
виде стрелки ( -> ).

Модификатор hat
означает "указатель
на объект среда
выполнения
Windows, на
который
автоматически
учитывается
ссылка". Точнее,
дескриптор -объект
объявляет, что
компилятор должен
вставлять код для
автоматического
управления числом
ссылок объекта и
удалять объект, если
число ссылок
переходит к нулю.
Концепция Стандартная C++/CX Комментарии
C++

Ссылка Ссылка на Отслеживаемая ссылка ( % ):


С помощью
объект ( & ):
модификатора
T% identifier ссылки
T& identifier отслеживания
можно объявлять
только среда
выполнения
Windows типы.
Доступ к членам
объекта
осуществляется с
помощью
оператора доступа к
членам класса в
виде точки ( . ).

Ссылка
отслеживания
означает "ссылку на
объект среда
выполнения
Windows, который
автоматически
учитывается".
Точнее, ссылка
отслеживания
объявляет, что
компилятор должен
вставлять код для
автоматического
управления
количеством ссылок
объекта. Код
удаляет объект ,
если количество
ссылок переходит к
нулю.

объявление new ref new Выделяет объект


динамического типа среда выполнения
Windows, а затем
возвращает
дескриптор для
этого объекта.
Концепция Стандартная C++/CX Комментарии
C++

управление delete (Вызывает деструктор.) Время жизни


временем жизни identifier
определяется
объекта подсчетом ссылок.
delete[] Вызов вызывает
identifier delete деструктор,
но сам по себе не
освобождает
память.

Объявление T identifier[]
Array<T^>^ identifier( size )
Объявляет
массива одномерный
std::array -или-
изменяемый или
identifier доступный только
WriteOnlyArray<T^> для записи массив
identifier( size ) типа T^ . Сам массив
является объектом с
подсчетом ссылок,
который должен
быть объявлен с
модификатором
дескриптора
объекта.

(Объявления
массива используют
класс заголовка
шаблона, который
находится в
пространстве имен
Platform .)

объявление класса class identifier ref class identifier {}


Объявляет класс
{}
среды выполнения
ref struct identifier {} со специальными
struct возможностями по
identifier {} умолчанию private
.

Объявляет класс
среды выполнения
со специальными
возможностями по
умолчанию public .
Концепция Стандартная C++/CX Комментарии
C++

объявление struct value class identifier {}


Объявляет
структуры identifier {}
структуру POD,
value struct identifier {} которая имеет
(т.е. простой специальные
структуры возможности по
данных (POD)) умолчанию private
.

Объект value class


может быть
представлен в
метаданных
Windows, а
стандартный C++
class — нет.

Объявляет
структуру POD,
которая имеет
специальные
возможности по
умолчанию public .

Объект value
struct может быть
представлен в
метаданных
Windows, а
стандартный C++
struct — нет.

объявление абстрактный interface class identifier {}


Объявляет
интерфейса класс, который интерфейс со
содержит только interface struct identifier специальными
чистые {} возможностями по
виртуальные умолчанию private
функции. .

Объявляет
интерфейс со
специальными
возможностями по
умолчанию public .
Концепция Стандартная C++/CX Комментарии
C++

Делегат std::function public delegate return-type Объявляет объект,


delegate-type-identifier ( [ который может
параметры ] ); вызываться, как
вызов функции.
Концепция Стандартная C++/CX Комментарии
C++

Событие (Не event delegate-type- event Объявляет


применяется) identifier event-identifier;
объект , в котором
хранится коллекция
delegate-type-identifier обработчиков
delegate-identifier = ref new событий (делегатов),
delegate-type-identifier( которые
this [, параметры] );
вызываются при
возникновении
event-identifier += события.

*delegate-identifier;

Создает обработчик
-или-
событий.

EventRegistrationToken token-
Добавляет
identifier = object.event-
обработчик
событий.

identifier += delegate-
identifier;

Добавление
обработчика
-или-

событий
возвращает маркер
auto token-identifier =
события ( token-
object.event-identifier::add(
identifier ). Если
delegate-identifier );

планируется явно
удалить обработчик
object.event-identifier -=
событий, следует
token-identifier;

сохранить токен
события для
-или-

последующего
использования.

object.event-
identifier::remove( token-
Удаляет обработчик
identifier );
событий.

Чтобы удалить
обработчик
событий,
необходимо указать
токен события,
который был
сохранен при
добавлении
обработчика
событий.
Концепция Стандартная C++/CX Комментарии
C++

Свойство (Не property T identifier;


Объявляет, что
применяется) доступ к функции-
property T identifier[ index члену класса или
];
объекта
осуществляется с
property T default[ index ]; помощью того же
синтаксиса, который
используется для
доступа к элементу
данных или
индексированному
элементу массива.

Объявляет свойство
функции-члена
класса или объекта.

Объявляет
индексированное
свойство функции-
члена объекта.

Объявляет
индексированное
свойство функции-
члена класса.

Параметризованный шаблоны generic <typename T> Объявляет


тип interface class identifier {}
параметризованный
класс интерфейса.

generic <typename T >


delegate [ return- Объявляет
type ] delegate-identifier() {} параметризованный
делегат.

Типы значений, std::optional<T> Platform::IBox <T> Позволяет


допускающие переменным
значение NULL скалярных типов и
value структур
иметь значение
nullptr .

См. также раздел


Справочник по языку C++/CX
Обзор системы типов (C++/CX)
Статья • 03.04.2023

С помощью архитектуры среда выполнения Windows можно использовать


C++/WinRT, C++/CX, Visual Basic, Visual C# и JavaScript для написания приложений и
компонентов. Они могут напрямую обращаться к API Windows и
взаимодействовать с другими среда выполнения Windows приложениями и
компонентами. приложения универсальная платформа Windows (UWP),
написанные на языке C++, компилируются в машинный код, который выполняется
непосредственно на ЦП. Приложения UWP, написанные на C# или Visual Basic
компилируются на промежуточный язык Майкрософт (MSIL) и выполняются в
среде CLR. Приложения UWP, написанные на JavaScript, выполняются в среде
выполнения JavaScript. Сами компоненты операционной системы среда
выполнения Windows написаны на C++ и запускаются как машинный код. Все эти
компоненты и приложения UWP взаимодействуют напрямую через двоичный
интерфейс приложения среда выполнения Windows (ABI).

Чтобы включить поддержку среда выполнения Windows в современной идиоме


C++, корпорация Майкрософт создала расширение языка C++/CX. C++/CX
предоставляет встроенные базовые типы и реализации базовых среда выполнения
Windows типов. Эти типы позволяют приложениям и компонентам C++
взаимодействовать между ABI с приложениями, написанными на других языках.
Приложения C++/CX могут использовать любой тип среда выполнения Windows.
Они также могут создавать классы, структуры, интерфейсы и другие определяемые
пользователем типы, которые могут использовать другие приложения и
компоненты UWP. Приложение UWP, написанное на языке C++/CX, также может
использовать обычные классы и структуры C++, если они не имеют открытых
специальных возможностей.

Подробное рассмотрение проекции языка C++/CX и принципов его работы


приведено в следующих записях блогов:

C++/CX: часть 0 из [n]. Введение

C++/CX, часть 1 [n]: простой класс

C++/CX: часть 2 из [n]. Типы с крышками

C++/CX: часть 3 из [n]. В разработке

C++/CX: часть 4 из [n]. Статические функции-члены


7 Примечание

Хотя C++/CX по-прежнему поддерживается, мы рекомендуем использовать


C++/WinRT для новых приложений и компонентов среда выполнения
Windows. Он предназначен для предоставления первого класса доступа к
современному API Windows. Несмотря на имя, C++/WinRT использует только
стандартный C++17 без расширений. Она использует библиотеку только для
заголовков для реализации проекции языка C++ для среда выполнения
Windows API. C++/WinRT доступна в Windows SDK начиная с версии 1803
(10.0.17134.0).

Файлы метаданных Windows (WINMD-


файлы)
При компиляции приложения UWP, написанного на C++, компилятор создает
исполняемый файл в машинном коде, а также создает отдельный файл метаданных
Windows ( .winmd ), содержащий описания общедоступных среда выполнения
Windows типов, включая классы, структуры, перечисления, интерфейсы,
параметризованные интерфейсы и делегаты. Формат метаданных напоминает
формат, используемый в сборках .NET Framework. В компоненте .winmd C++ файл
содержит только метаданные; исполняемый код находится в отдельном файле.
Компоненты среда выполнения Windows, включенные в состав Windows,
используют эту схему. .winmd Имя файла должно совпадать или быть префиксом
корневого пространства имен в исходном коде. (Для языков .winmd платформа
.NET Framework файл содержит код и метаданные, как сборка платформа .NET
Framework.)

Метаданные .winmd в файле представляют опубликованную поверхность кода.


Опубликованные типы видны другим приложениям UWP независимо от того, на
каком языке написаны другие приложения. Метаданные или опубликованный код
могут содержать только типы, указанные системой типов среда выполнения
Windows. Нельзя публиковать специальные языковые конструкции C++, такие как
обычные классы, массивы, шаблоны или контейнеры стандартной библиотеки C++.
Клиентское приложение JavaScript или C# не будет знать, что делать с ними.

Видимость типа или метода в метаданных зависит от применяемых к ним


модификаторов доступа. Чтобы быть видимым, тип должен быть объявлен в
пространстве имен и должен быть объявлен как public . public ref class Не
допускается как внутренний вспомогательный тип в коде; он просто не
отображается в метаданных. Даже в public ref class , не все члены обязательно
видны. В следующей таблице перечислены связи между описателями доступа C++
и public ref class среда выполнения Windows видимости метаданных:

Опубликован в метаданных Не опубликован в метаданных

public private

protected internal

public protected private protected

Обозреватель объектов можно использовать для просмотра содержимого .winmd


файлов. Компоненты среда выполнения Windows, включенные в Windows,
находятся в Windows.winmd файле. Файл default.winmd содержит основные типы,
используемые в C++/CX, и platform.winmd содержит типы из Platform пространства
имен. По умолчанию эти три .winmd файла включаются в каждый проект C++ для
приложений UWP.

 Совет

Типы в пространстве имен не отображаются в Platform::Collections .winmd


файле, так как они не открыты. Они являются частными реализациями
интерфейсов, определенных в Windows::Foundation::Collections C++.
Приложение среда выполнения Windows, написанное на JavaScript или C#, не
знает, что Platform::Collections::Vector такое класс, но он может использовать
Windows::Foundation::Collections::IVector . Platform::Collections Типы

определены в collection.h .

система типов среда выполнения Windows в


C++/CX
В следующих разделах описываются основные функции системы типов среда
выполнения Windows и способы их поддержки в C++/CX.

Пространства имен
Все типы среда выполнения Windows должны объявляться в пространстве имен;
сам API Windows организован по пространству имен. Файл .winmd должен иметь то
же имя, что и корневое пространство имен. Например, именованный
A.B.C.MyClass класс можно создать только в том случае, если он определен в

файле метаданных с именем A.winmd или A.B.winmd A.B.C.winmd . Имя библиотеки


DLL не требуется для сопоставления .winmd имени файла.

Сам интерфейс API Windows был переработан как хорошо организованная


библиотека классов, упорядоченная по пространствам имен. Все компоненты
среда выполнения Windows объявляются в Windows.* пространствах имен.

Дополнительные сведения см. в разделе "Пространства имен" и видимость типов.

Фундаментальные типы
Среда выполнения Windows определяет следующие основные типы: UInt8 ,
UInt16 Int64 Int16 Int32 UInt32 , UInt64 , , Single и . Double Char16 Boolean String
C++/CX поддерживает основные числовые типы в своем пространстве имен по
умолчанию как uint16 , uint32 , , uint64 , int16 , , int32 int64 , float32 и
float64 char16 . Boolean и String также определяются в Platform пространстве

имен.

C++/CX также определяет uint8 эквивалент, который unsigned char не


поддерживается в среда выполнения Windows и не может использоваться в
общедоступных API.

Фундаментальный тип можно сделать допускающим значение NULL, упаковав его в


Platform::IBox интерфейс. Дополнительные сведения см. в разделе Классы и
структуры значения.

Дополнительные сведения о фундаментальных типах см. в разделе Базовые типы

Строки
Строка среда выполнения Windows — это неизменяемая последовательность 16-
разрядных символов ЮНИКОДа. Строка среда выполнения Windows проецируется
как Platform::String^ . Этот класс предоставляет методы для создания, обработки
строк, а также для их преобразования в тип wchar_t и из этого типа.

Дополнительные сведения см. в разделе Строки.

Массивы
Среда выполнения Windows поддерживает одномерные массивы любого типа.
Массивы массивов не поддерживаются. В C++/CX среда выполнения Windows
массивы проецируются как Platform::Array класс.

Дополнительные сведения см. в разделеArray и WriteOnlyArray.

ref class и ref struct типы

Класс среда выполнения Windows проецируется в C++/CX как или ref class ref
struct тип, так как он копируется по ссылке. Управление памятью для ref class

объектов ref struct прозрачно обрабатывается с помощью подсчета ссылок.


Когда последняя ссылка на объект выходит из области, объект ликвидируется. A
ref class или ref struct type can:

может содержать такие члены, как конструкторы, методы, свойства и события.


Эти члены могут иметь public специальные private protected возможности
или internal специальные возможности.

Может содержать закрытые вложенные enum или struct class определения.

могут напрямую наследовать от одного базового класса и реализовать любое


число интерфейсов. Все ref class объекты неявно преобразуются в
Platform::Object класс и могут переопределять свои виртуальные методы,
Object::ToStringнапример.

Объект ref class с открытым конструктором должен быть объявлен как sealed ,
чтобы предотвратить дальнейшее наследование.

Дополнительные сведения см. в разделе "Классы и структуры ссылок"

value class и value struct типы

Или value class представляет базовую структуру данных и содержит только поля,
которые могут быть value class типами, value struct типами или
типами Platform::String^ . value struct value struct и value class объекты
копируются по значению.

Можно value struct сделать значение NULL, упаковав его в IBox интерфейс.

Дополнительные сведения см. в разделе Классы и структуры значения.

Разделяемые классы
Функция разделяемого класса позволяет определять один класс на несколько
файлов. Это позволяет средствам создания кода, таким как редактор XAML,
изменять один файл без касания другого файла, который вы редактируете.

Дополнительные сведения см. в разделе Разделяемые классы

Свойства
Свойство — это открытый элемент данных любого типа среда выполнения
Windows. Он объявляется и определяется с помощью ключевого property слова.
Свойство реализуется как get / set пара методов. Клиентский код обращается к
свойству, как если бы он был открытым полем. Свойство, которое не требует
пользовательского get или set кода, называется тривиальным свойством и
может быть объявлено без явных get или set методов.

Дополнительные сведения см. в разделе Свойства.

коллекции среда выполнения Windows в C++/CX


В среда выполнения Windows определяется набор интерфейсов для типов
коллекций, которые каждый язык реализует по-своему. C++/CX предоставляет
реализации в Platform::Collections::Vector классах, Platform::Collections::Map классах и
других связанных конкретных типах коллекций, совместимых со своими аналогами
стандартной библиотеки C++.

Дополнительные сведения см. в разделе "Коллекции".

Типы шаблонов ref class


private и internal типы доступа ref class могут быть шаблонными и

специализированными.

Дополнительные сведения см. в разделе Классы ссылки шаблонов.

Интерфейсы
Интерфейс среда выполнения Windows определяет набор открытых свойств,
методов и событий, которые должен реализовывать или ref class ref struct тип,
если он наследуется от интерфейса.

Дополнительные сведения см. в статье Интерфейсы.


Перечисления
Тип enum class в среда выполнения Windows похож на область enum в C++.
Базовый тип имеет значение int32 , если атрибут [Flags] не применяется, в этом
случае базовый тип имеет тип uint32 .

Дополнительные сведения см. в разделе Перечисления.

Делегаты
Делегат в среда выполнения Windows аналогичен объекту std::function в C++. Это
особый ref class тип, используемый для вызова функций, предоставляемых
клиентом, имеющих совместимые сигнатуры. Делегаты чаще всего используются в
среда выполнения Windows в качестве типа события.

Дополнительные сведения см. в разделе Делегаты.

Исключения
В C++/CX можно перехватывать пользовательские типы исключений, std::exception
типы и Platform::Exception типы.

Дополнительные сведения см. в разделе Исключения.

События
Событие является общедоступным членом в типе ref class делегата или ref
struct типом которого является делегат. Событие может вызываться — или

инициироваться — только классом-владельцем. Однако клиентский код может


предоставлять собственные функции обработчика событий, которые вызываются
при срабатывании события классом-владельцем.

Дополнительные сведения см. в статье Events (Visual Basic) (События в Visual Basic).

Приведение
C++/CX поддерживает стандартные операторы static_castdynamic_castприведения
C++, а reinterpret_castтакже safe_cast операторы, относящиеся к C++/CX.

Дополнительные сведения см. в разделе Приведение.


Упаковка-преобразование
Упакованая переменная — это тип значения, который упаковывается в ссылочный
тип. Используйте готовые переменные в ситуациях, когда требуется семантика
ссылок.

Дополнительные сведения см. в разделе Упаковка.

Атрибуты
Атрибут — это значение метаданных, которое можно применить к любому среда
выполнения Windows типу или члену типа. Атрибуты можно проверить во время
выполнения. Среда выполнения Windows определяет набор общих атрибутов в
Windows::Foundation::Metadata пространстве имен. Пользовательские атрибуты в

общедоступных интерфейсах не поддерживаются среда выполнения Windows в


этом выпуске.

Прекращение поддержки API


Общедоступные API можно пометить как нерекомендуемые с помощью того же
атрибута, который используется среда выполнения Windows системными типами.

Дополнительные сведения см. в разделе "Нерекомендуемые типы и члены".

См. также раздел


Справочник по языку C++/CX
Пространства имен и видимость
типов (C++/CX)
Статья • 03.04.2023

Пространство имен — стандартная конструкция C++, которая предназначена для


группирования типов, имеющих связанную функциональность, и для
предотвращения конфликтов имен в библиотеках. Система типов среда
выполнения Windows требует, чтобы все общедоступные типы среда выполнения
Windows, включая типы в собственном коде, объявлялись в пространстве имен в
области пространства имен. Объявление открытых типов в глобальной области
видимости или вложенными в другой класс приведет к ошибке времени
компиляции.

WINMD-файл должен иметь одно имя с корневым пространством имен. Например,


экземпляр класса с именем A.B.C.MyClass может быть создан, только если он
определен в файле метаданных с именем A.winmd, A.B.winmd или A.B.C.winmd. Имя
исполняемого файла не обязательно должно соответствовать имени WINMD-
файла.

Видимость типов
В пространстве имен среда выполнения Windows типы, в отличие от стандартных
типов C++, имеют либо частные, либо общедоступные специальные возможности.
По умолчанию типы являются закрытыми. Только открытые типы являются
видимыми для метаданных и поэтому могут использоваться из приложений и
компонентов, которые написаны на языках, отличных от C++. В общем случае
правила для видимых типов являются более жесткими, чем правила для
невидимых типов, поскольку видимые типы не могут предоставлять доступ к
характерным для C++ возможностям, не поддерживаемым в языках .NET или
JavaScript.

7 Примечание

Метаданные используются языками .NET и JavaScript только во время


выполнения. Когда приложение или компонент C++ взаимодействуют с
другим приложением или компонентом C++ (включая компоненты Windows,
написанные на C++), во время выполнения метаданные не требуются.
Режим доступа и видимость членов
В закрытых ссылочных классах, интерфейсах или делегатах никакие члены не
передаются в метаданные, даже если эти члены являются открытыми. В открытых
ссылочных классах можно управлять видимостью членов в метаданных
независимо от доступности этих членов в исходном коде. Как и в стандартном C++,
здесь действует принцип минимальных полномочий; члены не следует делать
видимыми в метаданных, если нет явной потребности в этом.

Используйте следующие модификаторы доступа для управления видимостью в


метаданных и доступностью в исходном коде.

Модификатор Значение Передается в


метаданные?

private Режим доступа по умолчанию. То же значение, что Нет


и в стандартном C++.

protected То же значение, что и в стандартном C++, как в Да


приложении или компоненте, так и в метаданных.

public То же значение, что и в стандартном C++. Да

public protected Защищенный доступ в метаданных, открытый в Да


-или- protected приложении или компоненте.
public

protected private Невидим в метаданных; защищенный доступ в


или private приложении или компоненте.
protected

internal или Член открыт в приложении или компоненте, но Нет


private public невидим в метаданных.

среда выполнения Windows пространства


имен
API Windows состоит из типов, которые объявлены в пространствах имен
Windows::*. Эти пространства имен зарезервированы для Windows, и в них нельзя
добавлять типы. В Обозреватель объектовможно просмотреть эти пространства
имен в файле windows.winmd. Документацию по этим пространствам имен см. в
разделе API Windows.
пространства имен C++/CX
C++/CX определяет определенные типы в этих пространствах имен как часть
проекции системы типов среда выполнения Windows.

Пространство имен Описание

default Содержит встроенные числовые типы и типы char16. Эти типы


находятся в области видимости каждого пространства имен, и для
них не требуется оператор using .

Platform Содержит в основном открытые типы, соответствующие среда


выполнения Windows типам, таким как Array<T> , String , Guid и
Boolean . Также включает специальные вспомогательные типы, такие
как Platform::Agile<T> и Platform::Box<T> .

Platform::Collections Содержит конкретные классы коллекций, реализующие интерфейсы


IVector коллекции среда выполнения Windows , IMap и т. д. Эти типы
определены в файле заголовка collection.h, а не в файле
platform.winmd.

Platform::Details Содержит типы, используемые компилятором; они не


предназначены для общедоступного потребления.

См. также раздел


Система типов (C++/CX)
Фундаментальные типы (C++/CX)
Статья • 03.04.2023

В дополнение к стандартным встроенным типам C++, C++/CX поддерживает


систему типов, определяемую архитектурой среда выполнения Windows,
предоставляя определения типов для среда выполнения Windows
фундаментальных типов, которые соответствуют стандартным типам C++. C++/CX
реализует логические, символьные и числовые фундаментальные типы. Эти typedef
определены в пространстве имен default , которое никогда не требуется
указывать явным образом. Кроме того, C++/CX предоставляет оболочки и
конкретные реализации для определенных типов и интерфейсов среда
выполнения Windows.

Логические и символьные типы


В следующей таблице перечислены встроенные логические и символьные типы, а
также их стандартные эквиваленты C++.

Пространство Имя Определение Имя в Диапазон


имен C++/CX Standard значений
C++

Платформа Логическое 8-битовое логическое значение. bool true (не


равно нулю) и
false (ноль)

default char16 16-битовое нечисловое wchar_t


(Определяется
значение, представляющее стандартом
кодовую точку Юникода (UTF- -или-
Юникода)
16).
L'c'

Числовые типы
В следующей таблице перечислены встроенные числовые типы. Числовые типы
объявляются в пространстве имен default и являются определениями typedef для
соответствующих встроенных типов C++. Не все встроенные типы C++ (например,
long) поддерживаются в среда выполнения Windows. Для согласованности и
ясности рекомендуется использовать имя C++/CX.
Имя Определение Имя в Standard Диапазон значений
C++/CX C++

int8 8-разрядное числовое signed char От -128 до 127


значение со знаком.

uint8 8-разрядное числовое unsigned char от 0 до 255


значение без знака.

int16 16-разрядное знаковое short От -32 768 до 32 767


целое число.

uint16 16-разрядное целое число unsigned short от 0 до 65 535


без знака.

int32 32-разрядное знаковое INT От -2 147 483 648 до 2 147


целое число. 483 647

uint32 32-разрядное целое число unsigned int от 0 до 4 294 967 295


без знака.

int64 64-разрядное целое число со long long или -9 223 372 036 854, 775 808
знаком. __int64 до 9 223 372 036 854 775
807

uint64 64-разрядное целое число unsigned long long от 0 до 18 446 744 073 709
без знака. или unsigned 551 615
__int64

float32 32-битовое число с FLOAT 3,4E +/- 38 (7 знаков)


плавающей запятой
стандарта IEEE 754.

float64 64-битовое число с double 1,7E +/- 308 (15 знаков)


плавающей запятой
стандарта IEEE 754.

Типы среда выполнения Windows


В следующей таблице перечислены некоторые дополнительные типы,
определенные архитектурой среда выполнения Windows и встроенные в C++/CX.
Object и String являются ссылочными типами. Другие типы являются типами
значений. Все эти типы объявляются в пространстве имен Platform . Полный
список см. в разделе Platform namespace.

Имя Определение

Объект Представляет любой тип среда выполнения Windows.


Имя Определение

Строковый Последовательность символов, представляющая текст.


тип

Rect Набор из четырех чисел с плавающей запятой, определяющих расположение и


размер прямоугольника.

SizeT Упорядоченная пара чисел с плавающей запятой, которые определяют высоту


и ширину.

Точка Упорядоченная пара координат Х и Y в виде чисел с плавающей запятой,


которые определяют точку на двумерной плоскости.

Guid 128-битовое нечисловое значение, используемое в качестве уникального


идентификатора.

UIntPtr (Только для внутреннего использования.) 64-разрядное значение без знака,


используемое в качестве указателя.

IntPtr (Только для внутреннего использования.) 64-разрядное значение со знаком,


используемое в качестве указателя.

См. также раздел


Система типов
Строки (C++/CX)
Статья • 03.04.2023

Текст в среда выполнения Windows представлен в C++/CX классом Platform::String.


Используйте при Platform::String Class передаче строк взад и вперед методам в
среда выполнения Windows классах или при взаимодействии с другими
компонентами среда выполнения Windows через границу двоичного интерфейса
приложения (ABI). Platform::String Class предоставляет методы для некоторых
типичных операций над строками, но он является полнофункциональным классом
строки. При разработке модуля в C++ используйте стандартные строковые типы
C++ (такие как wstring ) для сложной обработки строк и преобразуйте конечный
результат в тип Platform::String^ , прежде чем передать его открытому интерфейсу
или получить его из такого интерфейса. Операция преобразования между типом
wstring или wchar_t* и типом Platform::String проста и эффективна.

Быстрая передача

В некоторых случаях компилятор может удостовериться, что есть возможность


безопасно создать экземпляр класса Platform::String или передать объект String
функции, не копируя основные данные строки. Эти операции называются быстрой
передачей , и их выполнение прозрачно.

Создание строк
Значение объекта String — неизменяемая (доступная только для чтения)
последовательность символов char16 (16-разрядных символов Юникода).
Поскольку объект String является неизменяемым, присвоение нового строкового
литерала переменной String фактически заменяет исходный объект String новым
объектом String . При операции объединения исходный объект String
разрушается, и создается новый объект.

Литералы

Символ-литерал — это символ, заключенный в одиночные кавычки, а строка-


литерал — это последовательность символов, заключенная в двойные кавычки.
Если для инициализации переменной String^ используется литерал, компилятор
предполагает, что литерал состоит из символов char16 . Таким образом, нет
необходимости указывать перед литералом модификатор строки "L" или заключать
литерал в макрос _T() или TEXT() . Дополнительные сведения о поддержке
Юникода в C++ см. в разделах Unicode Programming Summary.
В следующем примере показаны различные способы создания объектов String .

C++

// Initializing a String^ by using string literals

String^ str1 = "Test"; // ok for ANSI text only. uses current code page

String^ str2("Test");

String^ str3 = L"Test";

String^ str4(L"Test");

//Initialize a String^ by using another String^

String^ str6(str1);

auto str7 = str2;

// Initialize a String from wchar_t* and wstring

wchar_t msg[] = L"Test";

String^ str8 = ref new String(msg);

std::wstring wstr1(L"Test");

String^ str9 = ref new String(wstr1.c_str());

String^ str10 = ref new String(wstr1.c_str(), wstr1.length());

Операции обработки строк


Класс String предоставляет методы и операторы для объединения и сравнения
строк и других простейших операций со строками. Для более сложных
манипуляций со строками используйте функцию-член String::Data() для
получения значения объекта String^ в виде объекта const wchar_t* . Затем с
помощью этого значения инициализируйте класс std::wstring , имеющий более
богатый набор функций по обработке строк.

C++

// Concatenation

auto str1 = "Hello" + " World";

auto str2 = str1 + " from C++/CX!";

auto str3 = String::Concat(str2, " and the String class");

// Comparison

if (str1 == str2) { /* ... */ }

if (str1->Equals(str2)) { /* ... */ }

if (str1 != str2) { /* ... */ }

if (str1 < str2 || str1 > str2) { /* ... */};

int result = String::CompareOrdinal(str1, str2);

if(str1 == nullptr) { /* ...*/};

if(str1->IsEmpty()) { /* ...*/};

// Accessing individual characters in a String^

auto it = str1->Begin();

char16 ch = it[0];

Преобразование строк
Объект Platform::String может содержать только символы char16 или символ
NULL . Если приложение работает с 8-разрядными символами, используйте String::D

ata для извлечения текста в виде const wchar_t* . Затем можно воспользоваться
соответствующими функциям Windows или стандартной библиотеки для
выполнения операций с данными и преобразовать их обратно в объект wchar_t*
или wstring, из которого можно создать новый объект Platform::String .

В приведенном ниже фрагменте кода демонстрируется, как преобразовать


переменную String^ в переменную wstring и обратно. Дополнительные сведения
об операциях со строками, используемых в этом примере, см. в разделе
basic_string::replace.

C++

// Create a String^ variable statically or dynamically from a literal


string.

String^ str1 = "AAAAAAAA";

// Use the value of str1 to create the ws1 wstring variable.

std::wstring ws1( str1->Data() );

// The value of ws1 is L"AAAAAAAA".

// Manipulate the wstring value.

std::wstring replacement( L"BBB" );

ws1 = ws1.replace ( 1, 3, replacement );

// The value of ws1 is L"ABBBAAAA".

// Assign the modified wstring back to str1.

str1 = ref new String( ws1.c_str() );

Длина строки и значения NULL внутри строк


String::Length возвращает количество символов в строке, а не число байтов.
Символ NULL, означающий конец строки, не учитывается, если вы не указали
обратное при создании строки с помощью семантики стека.
Объект Platform::String может содержать значения NULL внутри строки, но только
если они получены в результате операции объединения. Значения NULL внутри
строки не поддерживаются в строковых литералах, поэтому из нельзя использовать
для инициализации объектов Platform::String таким способом. Значения NULL в
объектах Platform::String игнорируются при отображении строки, например когда
она присваивается свойству TextBlock::Text . Когда строковое значение
возвращается свойством Data , значения NULL внутри строки удаляются.

StringReference
В некоторых случаях код (а) получает std::wstring или wchar_t строковый литерал
или L"" и просто передает его другому методу, который принимает String^ в
качестве входного параметра. Если исходный строковый буфер остается
допустимым и не изменяется до возвращения результата функцией, строку
wchar_t* или строковый литерал можно преобразовать в Platform::StringReference,

а затем передать вместо Platform::String^ . Это допустимо, поскольку в


StringReference имеется определенное пользователем преобразование в тип

Platform::String^ . Благодаря StringReference можно избежать создания


дополнительной копии строковых данных. В циклах, включающих передачу
большого количества строк или передачу очень длинных строк, с помощью
StringReference можно теоретически добиться значительного выигрыша в
производительности. Но поскольку StringReference фактически занимает исходный
строковый буфер, необходимо соблюдать осторожность, чтобы не повредить
память. Не следует передавать StringReference в асинхронный метод, если нет
гарантии, что исходная строка будет находиться в области видимости, когда
выполнение метода закончится. При инициализации String^ из StringReference
происходит принудительное выделение памяти и копирование содержимого
строки, если имеется второй оператор присваивания. В этом случае выигрыш в
производительности StringReference теряется.

Обратите внимание, что StringReference является типом класса стандартного языка


C++, а не ссылочным классом; его нельзя использовать в определяемых
пользователем открытых интерфейсах ссылочных классов.

В следующем примере показано, как использовать StringReference.

C++

void GetDecodedStrings(std::vector<std::wstring> strings)

using namespace Windows::Security::Cryptography;

using namespace Windows::Storage::Streams;

for (auto&& s : strings)

// Method signature is IBuffer^


CryptographicBuffer::DecodeFromBase64String (Platform::String^)

// Call using StringReference:

IBuffer^ buffer =
CryptographicBuffer::DecodeFromBase64String(StringReference(s.c_str()));

//...do something with buffer

Классы Array и WriteOnlyArray


(C++/CX)
Статья • 03.04.2023

Вы можете свободно использовать обычные массивы В стиле C или std::array в


программе C++/CX (хотя std::vector часто это лучший выбор), но в любом API,
публикуемом в метаданных, необходимо преобразовать массив или вектор
Platform::Array В стиле C в тип или Platform::WriteOnlyArray в зависимости от того,
как они используются. Тип Platform::Array не является ни эффективным, ни
мощным, как std::vector, поэтому в качестве общего руководства следует избегать
его использования во внутреннем коде, который выполняет множество операций с
элементами массива.

Следующие типы массивов могут передаваться через ABI:

1. const Platform::Array^

2. Platform::Array^*

3. Platform::WriteOnlyArray

4. возвращаемое значение Platform::Array^

Эти типы массивов используются для реализации трех типов шаблонов массивов,
определенных среда выполнения Windows.

PassArray

Используется, когда вызывающий объект передает массив методу. Тип входного


параметра C++ — const Platform::Array<T>.

FillArray

Используется, когда вызывающий объект передает массив методу для заполнения.


Тип входного параметра C++ — Platform::WriteOnlyArray<T>.

ReceiveArray

Используется, когда вызывающий объект получает массив, выделяемый методом. В


C++/CX массив можно вернуть в возвращаемом значении в виде Array^ или в
качестве выходного параметра типа Array^*.

Шаблон PassArray
Если клиентский код передает массив в метод C++, а метод не изменяет его, метод
принимает массив в виде const Array^ . На уровне среда выполнения Windows
двоичного интерфейса приложения (ABI) это называется PassArray. В следующем
примере показано, как передать массив, выделенный в JavaScript функции C++,
которая считывает из него.

JavaScript

//JavaScript

function button2_click() {

var obj = new JS-Array.Class1();

var a = new Array(100);

for (i = 0; i < 100; i++) {

a[i] = i;

// Notice that method names are camelCased in JavaScript.

var sum = obj.passArrayForReading(a);

document.getElementById('results').innerText

= "The sum of all the numbers is " + sum;

В следующем фрагменте кода показан метод C++:

C++

double Class1::PassArrayForReading(const Array<double>^ arr)

double sum = 0;

for(unsigned int i = 0 ; i < arr->Length; i++)

sum += arr[i];

return sum;

Шаблон ReceiveArray
В шаблоне ReceiveArray клиентский код объявляет массив и передает его методу,
который выделяет для него память и инициализирует. Тип входного параметра
C++ является указателем на шляпу: Array<T>^* . В следующем примере показано,
как объявить объект массива в JavaScript и передать его функции C++, которая
выделяет память, инициализирует элементы и возвращает массив в JavaScript.
JavaScript обрабатывает выделенный массив в качестве возвращаемого значения,
но функция C++ обрабатывает его как выходной параметр.

JavaScript
//JavaScript

function button3_click() {

var obj = new JS-Array.Class1();

// Remember to use camelCase for the function name.

var array2 = obj.calleeAllocatedDemo2();

for (j = 0; j < array2.length; j++) {

document.getElementById('results').innerText += array2[j] + " ";

В следующем фрагменте кода показаны два способа реализации метода C++:

C++

// Return array as out parameter...

void Class1::CalleeAllocatedDemo(Array<int>^* arr)

auto temp = ref new Array<int>(10);

for(unsigned int i = 0; i < temp->Length; i++)

temp[i] = i;

*arr = temp;

// ...or return array as return value:

Array<int>^ Class1::CalleeAllocatedDemo2()

auto temp = ref new Array<int>(10);

for(unsigned int i = 0; i < temp->Length; i++)

temp[i] = i;

return temp;

Заполнение массивов
Если необходимо выделить массив в вызывающем объекте, а затем
инициализировать или изменить его в вызываемом объекте, используйте массив
WriteOnlyArray . В следующем примере показано, как реализовать функцию C++,
которая использует WriteOnlyArray и вызывает его из JavaScript.

JavaScript
// JavaScript

function button4_click() {

var obj = new JS-Array.Class1();

//Allocate the array.

var a = new Array(10);

//Pass the array to C++.

obj.callerAllocatedDemo(a);

var results = document.getElementById('results');

// Display the modified contents.

for (i = 0; i < 10; i++) {

document.getElementById('results').innerText += a[i] + " ";

В следующем фрагменте кода показано, как реализовать метод C++:

C++

void Class1::CallerAllocatedDemo(Platform::WriteOnlyArray<int>^ arr)

// You can write to the elements directly.

for(unsigned int i = 0; i < arr->Length; i++)

arr[i] = i;

Преобразования массивов
В этом примере показано, как использовать для Platform::Array создания других
типов коллекций:

C++

#include <vector>

#include <collection.h>
using namespace Platform;

using namespace std;

using namespace Platform::Collections;

void ArrayConversions(const Array<int>^ arr)

// Construct an Array from another Array.

Platform::Array<int>^ newArr = ref new Platform::Array<int>(arr);

// Construct a Vector from an Array

auto v = ref new Platform::Collections::Vector<int>(arr);

// Construct a std::vector. Two options.

vector<int> v1(begin(arr), end(arr));

vector<int> v2(arr->begin(), arr->end());

// Initialize a vector one element at a time.

// using a range for loop. Not as efficient as using begin/end.

vector<int> v3;

for(int i : arr)

v3.push_back(i);

В следующем примере показано, как создать Platform::Array из массива В стиле C и


вернуть его из открытого метода.

C++

Array<int>^ GetNums()

int nums[] = {0,1,2,3,4};

//Use nums internally....

// Convert to Platform::Array and return to caller.

return ref new Array<int>(nums, 5);

Массивы массивов
Система типов среды выполнения Windows не поддерживает концепцию массивов
массивов и, таким образом, невозможно использовать IVector<Platform::Array<T>>
в качестве возвращаемого значения или параметра метода в открытом методе. Для
передачи массива массивов или последовательности массивов в ABI используйте
IVector<IVector<T>^> .

Используйте ArrayReference, чтобы избежать


копирования данных
В некоторых сценариях, когда данные передаются через ABI в Platform::Arrayи в
конечном итоге требуется обработать эти данные в массиве В стиле C для
повышения эффективности, можно использовать Platform::ArrayReference , чтобы
избежать дополнительной операции копирования. При передаче
Platform::ArrayReference в качестве аргумента параметру, принимающему
Platform::Array , ArrayReference объект будет хранить данные непосредственно в

заданном массиве В стиле C. Просто учтите, что ArrayReference не блокирует


исходные данные, и если данные изменяются или удаляются в другом потоке до
завершения вызова, результаты будут неопределенными.

В следующем фрагменте кода показано, как скопировать результаты DataReader


операции в (обычный Platform::Array шаблон), а затем заменить ArrayReference
для копирования данных непосредственно в массив В стиле C:

C++

public ref class TestReferenceArray sealed

public:

// Assume dr is already initialized with a stream

void GetArray(Windows::Storage::Streams::DataReader^ dr, int


numBytesRemaining)

// Copy into Platform::Array

auto bytes = ref new Platform::Array<unsigned char>


(numBytesRemaining);

// Fill an Array.

dr->ReadBytes(bytes);

// Fill a C-style array

uint8 data[1024];

dr->ReadBytes( Platform::ArrayReference<uint8>(data, 1024) );

};

Избегайте использования типа Array в


качестве свойства
Как правило, следует избегать предоставления доступа к типу Platform::Array как к
свойству в ссылочном классе, потому что массив возвращается целиком, даже если
код клиента пытается получить доступ только к одному элементу. Если необходимо
предоставить контейнер последовательности в качестве свойства в
общедоступном классе ссылки, Windows::Foundation::IVector лучше выбрать. В
частных или внутренних API (которые не публикуются в метаданных)
рекомендуется использовать стандартный контейнер C++, например std::vector.

См. также раздел


Система типов

Справочник по языку C++/CX

Справочник по пространствам имен


Классы и структуры ссылки (C++/CX)
Статья • 03.04.2023

C++/CX поддерживает определяемые пользователем ссылочные классы и


структуры ссылок, а также определяемые пользователем классы значений и
структуры значений. Эти структуры данных являются основными контейнерами, в
которых C++/CX поддерживает систему типов среда выполнения Windows. Их
содержимое передается в метаданные в соответствии с определенными
правилами, что позволяет передавать их между среда выполнения Windows
компонентами и универсальная платформа Windows приложениями, написанными
на C++ или других языках.

Класс ссылки и структура ссылки имеют следующие основные особенности:

они должны объявляться в пространстве имен, в области пространства имен,


и в этом пространстве имен они могут иметь режим доступа public (открытый)
или private (закрытый). Только открытые типы формируют метаданные;
Определения вложенных открытых классов не допускаются, в том числе
определения вложенных открытых классов enum . Дополнительные сведения
см. в разделах Пространства имен и Видимость типов.

Он может содержать в качестве членов C++/CX, включая ссылочные классы,


классы значений, структуры ссылок, структуры значений или структуры
значений, допускающих значение NULL. Он также может содержать
скалярные типы, такие как float64 , bool и т. д. Он также может содержать
стандартные типы C++, например std::vector , или пользовательский класс
при условии, что они не являются открытыми. Конструкции C++/CX могут
иметь специальные public возможности , protected , internal , private или
protected private . Все члены public или protected передаются в метаданные.
Стандартные типы C++ должны иметь доступность private , internal или
protected private , что не позволит им быть переданным в метаданные.

они могут реализовывать один или несколько классов интерфейсов или


структур интерфейсов;

они могут наследовать одному базовому классу, а на сами базовые классы


налагаются дополнительные ограничения. Наследование в иерархиях
открытых классов ссылок имеет больше ограничений, чем наследование
закрытых классов ссылок;
они не могут объявляться как универсальные. Если они имеют закрытый
доступ, они могут быть шаблонами;

Их время жизни управляется автоматическим подсчетом ссылок.

Объявление
В следующем фрагменте кода объявляется класс ссылки Person . Обратите
внимание, что стандартный тип C++ std::map используется в закрытых членах, а
интерфейс среда выполнения Windows IMapView используется в общедоступном
интерфейсе. Также обратите внимание, что в конце объявлений ссылочных типов
используется оператор "^".

C++

// #include <map>

namespace WFC = Windows::Foundation::Collections;

namespace WFM = Windows::Foundation::Metadata;

[WFM::WebHostHidden]

ref class Person sealed

public:

Person(Platform::String^ name);

void AddPhoneNumber(Platform::String^ type, Platform::String^ number);

property WFC::IMapView<Platform::String^, Platform::String^>^


PhoneNumbers

WFC::IMapView<Platform::String^, Platform::String^>^ get();

private:

Platform::String^ m_name;

std::map<Platform::String^, Platform::String^> m_numbers;

};

Реализация
В этом примере кода демонстрируется реализация класса ссылки Person .

C++

#include <collection.h>
using namespace Windows::Foundation::Collections;

using namespace Platform;

using namespace Platform::Collections;

Person::Person(String^ name): m_name(name) { }

void Person::AddPhoneNumber(String^ type, String^ number)

m_numbers[type] = number;

IMapView< String^, String^>^ Person::PhoneNumbers::get()

// Simple implementation.

return ref new MapView< String^, String^>(m_numbers);

Использование
В следующем примере кода показано, как клиентский код использует класс ссылки
Person .

C++

using namespace Platform;

Person^ p = ref new Person("Clark Kent");

p->AddPhoneNumber("Home", "425-555-4567");

p->AddPhoneNumber("Work", "206-555-9999");

String^ workphone = p->PhoneNumbers->Lookup("Work");

Также можно также объявить локальную переменную класса ссылки с помощью


семантики стека. Поведение такого объекта аналогично поведению стековой
переменной, несмотря на то что память все же выделяется динамически. Важное
отличие заключается в том, что нельзя присвоить отслеживаемую ссылку (%)
переменной, объявленной с использованием семантики стека: таким образом
гарантируется, что счетчик ссылок уменьшается до нуля, когда выполняется выход
из функции. В этом примере показаны базовый класс ссылки Uri и функция, в
которой он используется с семантикой стека:

C++

void DoSomething()

Windows::Foundation::Uri docs("http://docs.microsoft.com");

Windows::Foundation::Uri^ devCenter = docs.CombineUri("/windows/");

// ...

} // both variables cleaned up here.

Управление памятью
Класс ссылки размещается в динамической памяти с помощью ключевого слова
ref new .

C++

MyRefClass^ myClass = ref new MyRefClass();

Оператор ^ handle-to-object называется шляпой и по сути является


интеллектуальным указателем C++. Память, на которую он указывает,
автоматически освобождается, когда последний дескриптор оказывается вне
области или ему явно задается значение nullptr .

По определению класс ссылки имеет семантику ссылки. Когда вы присваиваете


значение переменной класса ссылки, копируется не сам объект, а его дескриптор.
В следующем примере после операции присваивания оба объекта myClass и
myClass2 указывают на одно и то же расположение в памяти.

C++

MyRefClass^ myClass = ref new MyRefClass();

MyRefClass^ myClass2 = myClass;

Когда создается экземпляр класса ссылки C++/CX, его память перед вызовом
конструктора инициализируется нулями, поэтому такая инициализация для
отдельных членов, включая свойства, не требуется. Если класс C++/CX является
производным от класса библиотеки C++ для среды выполнения Windows (WRL),
инициализация нулями осуществляется только для области производного класса
C++/CX.

Элементы
Класс ссылки может содержать функции-члены public , protected и private ; только
члены public и protected передаются в метаданные. Вложенные классы и классы
ссылок разрешены, однако они не могут быть public . Открытые поля не
допускаются; открытые члены данных должны объявляться как свойства. Закрытые
и защищенные внутренние данные-члены могут быть полями. По умолчанию в
классе ссылки доступность всех членов равна private .

Структура ссылки аналогична классу ссылки за тем исключением, что ее члены по


умолчанию имеют доступность public .
public Класс ссылки или ссылочные структуры создаются в метаданных, но для

использования из других универсальная платформа Windows приложений и среда


выполнения Windows компонентов у них должен быть по крайней мере один
открытый или защищенный конструктор. Класс ссылки, являющийся открытым и
имеющий открытый конструктор, необходимо также объявлять как sealed , чтобы
предотвратить его дальнейшее изменение через двоичный интерфейс приложений
(ABI).

Открытые члены не могут быть объявлены как , так как const система типов среда
выполнения Windows не поддерживает const. Можно использовать статическое
свойство для объявления открытого члена данных с постоянным значением.

При определении открытого класса или структуры ссылок компилятор применяет


необходимые атрибуты к классу и сохраняет эти сведения в файле WinMD
приложения. Однако при определении открытого незамеченного класса ссылки
вручную примените Windows::Foundation::Metadata::WebHostHidden атрибут , чтобы
класс не был видимым для универсальная платформа Windows приложений,
написанных на JavaScript.

Класс ссылки может содержать стандартные типы C++, включая типы const , в
любых членах private , internal или protected private .

Открытые классы ссылки, имеющие параметры-типы, не допускаются.


Определяемые пользователем универсальные классы ссылок не допускаются.
Класс ссылки с атрибутами private, internal или protected private может быть
шаблоном.

Деструкторы
В C++/CX вызов delete общедоступного деструктора вызывает деструктор
независимо от количества ссылок объекта. Это позволяет определить деструктор,
который будет выполнять пользовательскую очистку ресурсов, не относящихся к
RAII, детерминированным образом. Однако даже в этом случае сам объект не
удаляется из памяти. Память для объекта освобождается, только когда число
ссылок достигает нуля.

Если деструктор класса не является общим, он вызывается только в случае, когда


число ссылок достигает нуля. При вызове delete для объекта, имеющего частный
деструктор, компилятор выдает предупреждение C4493, в котором говорится:
"Выражение удаления не оказывает влияния, так как деструктор <имени> типа не
имеет "общедоступной" доступности".
Деструкторы классов ссылок можно объявлять только следующим образом:

открытый и виртуальный (допускается только для запечатанных и


незапечатанных типов);

защищенный закрытый и невиртуальный (допускается только для


незапечатанных типов);

закрытый и невиртуальный (допускается только для запечатанных типов).

Никакие другие сочетания режимов доступа, виртуальности и запечатанности не


допускаются. Если деструктор явно не объявлен, компилятор создает открытый
виртуальный деструктор, если у базового класса типа или любого из его членов
имеется открытый деструктор. В противном случае компилятор создает
защищенный закрытый невиртуальный деструктор для незапечатанных типов и
закрытый невиртуальный деструктор для запечатанных типов.

При попытке обращения к членам класса, для которого уже запускался деструктор,
поведение будет неопределенным; это наиболее вероятная причина сбоя
программы. При вызове delete t для типа, у которого нет открытого деструктора,
ничего не происходит. При вызове delete this для типа или базового класса, не
имеющих деструктора private или protected private в иерархии типов, также
ничего не происходит.

При объявлении открытого деструктора компилятор создает код таким образом,


чтобы класс ссылки реализовывал интерфейс Platform::IDisposable , а деструктор
реализовывал метод Dispose . Platform::IDisposable — это проекция C++/CX для
Windows::Foundation::IClosable . Никогда не следует явным образом реализовывать

эти интерфейсы.

Наследование
Platform::Object является универсальным базовым классом для всех классов ссылок.
Все классы ссылок неявно преобразуются в Platform::Object и могут
переопределять Object::ToString. Однако модель наследования среда выполнения
Windows не предназначена в качестве общей модели наследования. В C++/CX это
означает, что определяемый пользователем открытый ссылочный класс не может
служить базовым классом.

При создании пользовательского элемента управления XAML можно использовать


в качестве базового класса Windows::UI::Xaml::DependencyObject , если объект
участвует в системе свойств зависимостей.
После определения незапечатанного класса MyBase , который наследует классу
DependencyObject , другие открытые или закрытые классы ссылок в компоненте или
приложении могут наследовать этому классу MyBase . Наследование в открытых
классах ссылок должно использоваться только для поддержки переопределений
виртуальных методов, полиморфной идентичности и инкапсуляции.

Закрытый базовый класс ссылки не требуется для наследования от существующего


незапечатанного класса. Если требуется, чтобы иерархия объектов моделировала
собственную структуру программы или обеспечивала повторное использование
кода, используйте закрытые или внутренние классы ссылок, а лучше стандартные
классы C++. Доступ к функциональности закрытой иерархии объектов можно
реализовать с помощью оболочки открытого запечатанного класса ссылки.

Класс ссылки, имеющий открытый или защищенный конструктор в C++/CX, должен


быть объявлен как запечатанный. Это ограничение означает, что классы,
написанные на других языках, таких как C# или Visual Basic, не могут наследоваться
от типов, объявленных в компоненте среда выполнения Windows, написанном на
C++/CX.

Ниже приведены основные правила наследования в C++/CX:

классы ссылок могут напрямую наследовать не более чем от одного базового


класса, но могут реализовывать любое количество интерфейсов;

если у класса имеется открытый конструктор, он должен объявляться как


запечатанный, чтобы запретить его дальнейшее наследование;

можно создавать открытые незапечатанные базовые классы, которые имеют


внутренние или защищенные закрытые конструкторы, при условии что
базовый класс является производным (прямо или косвенно) от
существующего незапечатанного базового класса, такого как
Windows::UI::Xaml::DependencyObject . Наследование определяемых
пользователем классов ссылок между файлами WinMD не поддерживается;
однако класс ссылки может наследовать от интерфейса, определенного в
другом файле WinMD. Производные классы можно создавать из
определяемого пользователем базового класса ссылки только в одном
компоненте среда выполнения Windows или универсальная платформа
Windows приложении.

для классов ссылок поддерживается только открытое наследование.

C++
ref class C{};

public ref class D : private C //Error C3628

{};

В следующем примере показано, как предоставлять доступ к открытому классу


ссылки, производному от других классов ссылки в иерархии наследования.

C++

namespace InheritanceTest2

namespace WFM = Windows::Foundation::Metadata;

// Base class. No public constructor.

[WFM::WebHostHidden]

public ref class Base : Windows::UI::Xaml::DependencyObject

internal:

Base(){}

protected:

virtual void DoSomething (){}

property Windows::UI::Xaml::DependencyProperty^ WidthProperty;

};

// Class intended for use by client code across ABI.

// Declared as sealed with public constructor.

public ref class MyPublicClass sealed : Base

public:

MyPublicClass(){}

//...

};

См. также раздел


Система типов

Классы и структуры значения

Справочник по языку C++/CX

Справочник по пространствам имен


Классы и структуры значений
(C++/CX)
Статья • 01.12.2022

Структура значений или класс значений — это совместимый с среда выполнения


Windows POD ("простая старая структура данных"). Она имеет фиксированный
размер и состоит только из полей только; в отличие от класса ссылки, у нее нет
свойств.

В следующих примерах показано, как объявлять и инициализировать структуры


значений.

// in mainpage.xaml.h:

value struct TestStruct

Platform::String^ str;

int i;

};

value struct TestStruct2

TestStruct ts;

Platform::String^ str;

int i;

};

// in mainpage.cpp:

// Initialize a value struct with an int and String

TestStruct ts = {"I am a TestStruct", 1};

// Initialize a value struct that contains

// another value struct, an int and a String

TestStruct2 ts2 = {{"I am a TestStruct", 1}, "I am a TestStruct2", 2};

// Initialize value struct members individually.

TestStruct ts3;

ts3.i = 108;

ts3.str = "Another way to init a value struct.";

Когда переменная типа значения присваивается другой переменной, значение


копируется, так что каждая из двух переменных содержит собственную копию
данных. Структура значения — это структура фиксированного размера,
содержащая только открытые поля данных и объявляемая с помощью ключевого
слова value struct .
Класс значения похож на value struct за тем исключением, что его поля должны
быть явно объявлены открытыми. Он объявляется с помощью ключевого слова
value class .

Структуру значений или класс значений может содержать в виде полей только
фундаментальные числовые типы, классы перечисления или
Platform::String^ Platform::IBox <T>^ , где T является числовым типом или классом

перечисления или классом значений или структурой. Поле IBox<T>^ может иметь
значение nullptr ; таким образом в C++ реализуется концепция типов значений,
допускающих значения NULL.

Класс значения или структура значения, содержащие в качестве члена тип


Platform::String^ или IBox<T>^ , не поддерживают memcpy .

Поскольку все члены класса value class или value struct являются открытыми и
передаются в метаданные, не разрешается использовать стандартные типы C++ в
качестве членов. Это отличается от классов ссылок, которые могут содержать
стандартные типы C++ private или internal .

В следующем фрагменте кода типы Coordinates и City объявляются как структуры


значения. Обратите внимание, что один из членов данных класса City
принадлежит к типу GeoCoordinates . value struct может в качестве членов
содержать другие структуры значений.

C++

public enum class Continent

Africa,

Asia,

Australia,

Europe,

NorthAmerica,

SouthAmerica,

Antarctica

};

value struct GeoCoordinates

double Latitude; //or float64 if you prefer

double Longitude;

};

value struct City

Platform::String^ Name;

int Population;

double AverageTemperature;

GeoCoordinates Coordinates;

Continent continent;

};

Передача параметров для типов значений


Если параметром функции или метода является тип значения, он обычно
передается по значению. Для больших объектов это может вызвать проблемы с
производительностью. В Visual Studio 2013 и более ранних версиях типы значений
в C++/CX всегда передавались по значению. В Visual Studio 2015 и последующих
версиях типы значений можно передавать по значению или по ссылке.

Чтобы объявить параметр, который передает тип значения по значению,


используйте код, аналогичный приведенному ниже:

C++

void Method1(MyValueType obj);

Чтобы объявить параметр, который передает тип значения по ссылке, используйте


символ ссылки (&), как показано ниже:

C++

void Method2(MyValueType& obj);

Тип в Method2 является ссылкой на MyValueType и работает так же, как ссылочный
тип в стандартном C++.

При вызове Method1 из другого языка, например C#, не требуется использовать


ключевое слово ref или out . При вызове Method2 используйте ключевое слово
ref .

Method2(ref obj);

Также можно использовать символ указателя (*) для передачи типа значения по
ссылке. Поведение по отношению к вызывающим объектам в других языках
совпадает (вызывающие объекты в C# используют ключевое слово ref ), но в
методе тип является указателем на тип значения.
Типы значений, допускающие значение
NULL
Как упоминалось ранее, класс значений или структуру значений может иметь поле
типа Platform::IBoxT<>^, IBox<int>^ например. Это поле может иметь любое
числовое значение, допустимое для типа int , или значение nullptr . Поле,
допускающее значение NULL, можно передать в качестве аргумента методу,
параметр которого объявлен как необязательный, или в любой другой объект, в
котором тип значения не обязательно должен иметь значение.

В следующем примере показано, каким образом выполняется инициализация


структуры с полем, допускающим значение null.

public value struct Student

Platform::String^ Name;

int EnrollmentYear;

Platform::IBox<int>^ GraduationYear; // Null if not yet graduated.

};

//To create a Student struct, one must populate the nullable type.

MainPage::MainPage()

InitializeComponent();

Student A;

A.Name = "Alice";

A.EnrollmentYear = 2008;

A.GraduationYear = ref new Platform::Box<int>(2012);

Student B;

B.Name = "Bob";

B.EnrollmentYear = 2011;

B.GraduationYear = nullptr;

IsCurrentlyEnrolled(A);

IsCurrentlyEnrolled(B);

bool MainPage::IsCurrentlyEnrolled(Student s)

if (s.GraduationYear == nullptr)

return true;

return false;

Саму структуру значений можно сделать допускающей значение null аналогичным


образом, как показано в следующем примере.

public value struct MyStruct

public:

int i;

Platform::String^ s;

};

public ref class MyClass sealed

public:

property Platform::IBox<MyStruct>^ myNullableStruct;

};

См. также раздел


Система типов (C++/CX)

Справочник по языку C++/CX

Справочник по пространствам имен

Классы и структуры ссылки (C++/CX)


Разделяемые классы (C++/CX)
Статья • 01.12.2022

Разделяемый класс — это конструкция, предназначенная для ситуаций, когда вы


изменяете часть определения класса, и программное обеспечение для
автоматического построения кода (например, конструктор XAML) также изменяет
код в этом классе. Использование разделяемых классов позволяет предотвратить
изменение вашего кода конструктором. В проекте Visual Studio к
сгенерированному файлу автоматически применяется модификатор partial .

Синтаксис
Чтобы определить разделяемый класс, укажите ключевое слово partial
непосредственно перед ключевым словом класса, которое иначе было бы
обычным определением класса. Результирующее ключевое слово, например
partial ref class , является контекстным ключевым словом, содержащим
пробелы. Определения разделяемых классов поддерживаются в следующих
конструкциях.

class либо struct

ref class или ref struct

value class или value struct

enum или enum class

ref interface , interface class , interface struct или __interface

union

В этом примере представлен разделяемый класс ref class :

C++

partial ref class MyClass {/* ... */};

Содержимое
Определение разделяемого класса может содержать любые конструкции, которые
могли бы содержаться в полном определении класса, если бы ключевое слово
partial не было указано. Оно может содержать любые допустимые конструкции

(за единственным исключением), такие как базовые классы, данные-члены,


функции-члены, перечисления, объявления дружественных функций и атрибуты.
Встроенные определения и статические данные-члены также допускаются.

Единственное исключение — ключевые слова, указывающие возможность доступа


к классу. Например, выражение public partial class MyInvalidClass {/* ... */};
является ошибкой. Ключевые слова в определении разделяемого класса
MyInvalidClass, указывающие возможность доступа, не влияют на возможность
доступа по умолчанию в последующем разделяемом или полном определении
класса MyInvalidClass.

В следующем фрагменте кода демонстрируются ключевые слова, указывающие


возможность доступа. В первом разделяемом классе Method1 является открытым,
поскольку для него задано ключевое слово public. Во втором разделяемом классе
Method2 является закрытым, поскольку по умолчанию класс является закрытым.

C++

partial ref class N

public:

int Method1(); // Method1 is public.

};

ref class N

void Method2(); // Method2 is private.

};

Объявление
Частичное определение класса, например MyClass только объявление MyClass. То
есть в нем вводится только имя MyClass . MyClass нельзя использовать таким
образом, чтобы требуется определение класса, например знание размера MyClass
или использования базового элемента или элемента MyClass . MyClass считается
определенным только в том случае, если компилятор обнаруживает не частичное
определение MyClass .

Следующий пример демонстрирует принципы объявления разделяемого класса.


После объявления 1 можно использовать так, MyClass как если бы оно было
записано в качестве прямого объявления. ref class MyClass; Объявление #2
эквивалентно объявлению #1. Объявление #3 допустимо, поскольку оно является
опережающим объявлением класса. Однако объявление №4 недопустимо, потому
что

MyClass не определяется полностью.

Объявление No 5 не использует ключевое partial слово, а объявление полностью


определяет MyClass . Поэтому объявление #6 допустимо.

C++

// Declaration #1

partial ref class MyClass {};

// Declaration #2

partial ref class MyClass;

// Declaration #3

MyClass^ pMc; // OK, forward declaration.

// Declaration #4

MyClass mc; // Error, MyClass is not defined.

// Declaration #5

ref class MyClass { };

// Declaration #6

MyClass mc; // OK, now MyClass is defined.

Количество и порядок указания


Для каждого полного определения класса может существовать одно определение
разделяемого класса, несколько таких определений или ни одного.

Каждое частичное определение класса класса должно лексически предшествовать


одному полному определению этого класса, но не должно предшествовать
пересылке объявлений класса. Если у класса отсутствует полное определение,
объявления разделяемого класса могут быть только опережающими
объявлениями.

Все ключевые слова объявления класса, такие как class и struct , должны
совпадать. Например, ошибкой будет создать код partial class X {}; struct X {}; .

В следующем примере демонстрируется количество и порядок указания


объявлений. Последнее объявление разделяемого класса вызывает сбой,
поскольку класс уже определен.
C++

ref class MyClass; // OK

partial ref class MyClass{}; //OK

partial ref class MyClass{}; // OK

partial ref class MyClass{}; // OK

ref class MyClass{}; // OK

partial ref class MyClass{}; // C3971, partial definition cannot appear


after full definition.

Полное определение
Когда компилятор встречает полное определение класса X, он действует, как если
бы именно в нем были объявлены все базовые классы, члены и т. п. в том порядке,
в котором они определены в разделяемых классах. Таким образом, содержимое
разделяемых классов обрабатывается так, как если бы оно находилось в полном
определении класса, и поиск имени и другие языковые правила применяются к
полному определению класса, как если бы в нем находилось содержимое
разделяемых классов.

Следующие два примера кода аналогичны и действуют одинаково. В первом


примере используется разделяемый класс, а втором — нет.

C++

ref class Base1 { public: property int m_num; int GetNumBase();};

interface class Base2 { int GetNum(); };

interface class Base3{ int GetNum2();};

partial ref class N : public Base1

public:

/*...*/

};

partial ref class N : public Base2

public:

virtual int GetNum();

// OK, as long as OtherClass is

//declared before the full definition of N

void Method2( OtherClass^ oc );

};

ref class OtherClass;

ref class N : public Base3

public:

virtual int GetNum2();

};

C++

ref class OtherClass;

ref class N : public Base1, public Base2, public Base3

public:

virtual int GetNum();

virtual int GetNum2();

private:

void Method2(OtherClass^ oc);

};

Шаблоны
Разделяемый класс не может быть шаблоном.

Ограничения
Разделяемый класс не может распространяться за пределы одной записи
преобразования.

Ключевое слово partial поддерживается только в сочетании с ключевым словом


ref class или value class .

Примеры
В следующем примере класс Address определяется в двух файлах кода.
Конструктор изменяет файл Address.details.h , а пользователь — файл Address.h .
Ключевое слово partial используется только в определении класса в первом
файле.

C++

// Address.Details.h

partial ref class Address

private:

Platform::String^ street_;

Platform::String^ city_;

Platform::String^ state_;

Platform::String^ zip_;

Platform::String^ country_;

void ValidateAddress(bool normalize = true);


};

C++

// Address.h

#include "Address.details.h"

ref class Address

public:

Address(Platform::String^ street, Platform::String^ city,


Platform::String^ state,

Platform::String^ zip, Platform::String^ country);

property Platform::String^ Street { Platform::String^ get(); }

property Platform::String^ City { Platform::String^ get(); }

property Platform::String^ State { Platform::String^ get(); }

property Platform::String^ Zip { Platform::String^ get(); }

property Platform::String^ Country { Platform::String^ get(); }

};

См. также раздел


Система типов

Справочник по языку C++/CX

Справочник по пространствам имен


Свойства (C++/CX)
Статья • 26.09.2022

среда выполнения Windows типы предоставляют общедоступные данные в


качестве свойств. Клиентский код обращается к свойству как открытым данным-
членам. Внутренне свойство реализуется в виде блока, содержащего метод доступа
get или set, или оба эти метода. С помощью методов доступа можно выполнять
дополнительные действия до или после получения значения; например, можно
вызывать события или выполнять проверки.

Комментарии
Значение свойства содержится в закрытой переменной (называемой резервным
хранилищем), принадлежащей к тому же типу, что и само свойство. Свойство
может одновременно содержать метод доступа set, присваивающий значение
резервному хранилищу, и метод доступа get, извлекающий значение резервного
хранилища. Свойство доступно только для чтения, если оно предоставляет только
метод доступа get, только для записи, если предоставляет только метод доступа set,
и для чтения и записи, если предоставляет оба метода доступа.

Тривиальное свойство — это свойство, доступное для чтения и записи, для


которого компилятор автоматически реализует методы доступа и резервное
хранилище. Доступ к реализации компилятора для вас невозможен. Впрочем, вы
можете объявить пользовательское свойство и явно объявить его методы доступа
и резервное хранилище. Внутри метода доступа можно реализовать любую
необходимую логику, например проверку входных данных метода доступа set,
вычисление значения с использованием значения свойства или вызов события при
изменении свойства.

Когда создается экземпляр класса ссылки C++/CX, его память перед вызовом
конструктора инициализируется нулями, таким образом, всем свойствам в качестве
значения по умолчанию назначается ноль или nullptr.

Примеры
В следующем примере кода показано, как объявить свойство и обратиться к нему.
Первое свойство Name является тривиальным , поскольку компилятор
автоматически создает метод доступа set , метод доступа get и резервное
хранилище.
Второе свойство Doctor доступно только для чтения, поскольку для него указан
блок property , в котором явно объявлен только метод доступа get . Поскольку
блок property объявлен, необходимо явно объявить резервное хранилище, то есть
закрытую переменную doctor_ класса String^. Обычно свойство, доступное только
для чтения, просто возвращает значение резервного хранилища. Только сам класс
может задавать значение резервного хранилища, обычно это происходит в
конструкторе.

Третье свойство Quantity доступно для чтения и записи, так как в нем объявлен
блок property, где объявлены оба метода доступа set и get .

Метод доступа set выполняет определенную пользователем проверку


допустимости присваиваемого значения. В отличие от C#, здесь имя value — это
просто идентификатор параметра в методе доступа set , оно не является
ключевым словом. Если value не больше нуля, вызывается исключение
Platform::InvalidArgumentException. В противном случае резервному хранилищу
quantity_ задается присваиваемое значение.

Обратите внимание, что свойство невозможно инициализировать в списке членов.


Хотя переменные резервного хранилища можно инициализировать в списке
членов.

C++

public ref class Prescription sealed

private:

Platform::String^ m_doctor;

int quantity;

public:

Prescription(Platform::String^ name, Platform::String^ d) : m_doctor(d)

// Trivial properties can't be initialized in member list.

Name = name;

// Trivial property

property Platform::String^ Name;

// Read-only property

property Platform::String^ Doctor

Platform::String^ get() { return m_doctor; }

// Read-write property

property int Quantity

int get() { return quantity; }

void set(int value)

if (value <= 0)

throw ref new Platform::InvalidArgumentException();

quantity = value;

};

public ref class PropertyConsumer sealed

private:

void GetPrescriptions()

Prescription^ p = ref new Prescription("Louis", "Dr. Who");

p->Quantity = 5;

Platform::String^ s = p->Doctor;

int32 i = p->Quantity;

Prescription p2("JR", "Dr. Dat");

p2.Quantity = 10;

};

См. также раздел


Система типов

Справочник по языку C++/CX

Справочник по пространствам имен


Коллекции (C++/CX)
Статья • 03.04.2023

В программе C++/CX можно бесплатно использовать контейнеры стандартной


библиотеки шаблонов (STL) или любой другой определяемый пользователем тип
коллекции. Однако при передаче коллекций взад и вперед через среда
выполнения Windows двоичный интерфейс приложения (ABI), например в элемент
управления XAML или клиент JavaScript, необходимо использовать среда
выполнения Windows типы коллекций.

Среда выполнения Windows определяет интерфейсы для коллекций и связанных


типов, а C++/CX предоставляет конкретные реализации C++ в файле заголовка
collection.h. На этой иллюстрации показаны связи между типами коллекций:

Класс Platform::Collections::Vector похож на класс std::vector.

Класс Platform::Collections::Map похож на класс std::map.

Класс Platform::Collections::VectorView икласс Platform::Collections::MapView


являются доступными только для чтения версиями Vector и Map .

Итераторы определяются в пространстве имен Platform::Collections. Эти


итераторы удовлетворяют требованиям к итераторам STL и позволяют
использовать std::find, std::count_if и другие алгоритмы STL для любого типа
интерфейса Windows::Foundation::Collections или конкретного типа
Platform::Collections . Например, это означает, что можно выполнить итерацию
коллекции в компоненте среда выполнения Windows, созданном в C#, и
применить к ней алгоритм STL.

) Важно!
Итераторы прокси-сервера VectorIterator и VectorViewIterator
используют прокси-объекты VectoryProxy<T> и ArrowProxy<T> для
включения использования с контейнерами STL. Дополнительные
сведения см. в теме "Элементы VectorProxy" далее в этой статье.

Типы коллекций C++/CX поддерживают те же гарантии потокобезопасности,


что и контейнеры STL.

Windows::Foundation::Collections::IObservableVector и
Windows::Foundation::Collections::IObservableMap определяют события,
инициируемые при разнообразных изменениях коллекции. Реализуя эти
интерфейсы, Platform::Collections::Map и Platform::Collections::Vector
поддерживают привязку данных с помощью коллекций XAML. Например, если
имеется объект Vector , данные которого связаны с Grid , то при добавлении
данных в коллекцию их изменения отражаются в пользовательском
интерфейсе таблицы.

Использование класса Vector


Если класс должен передать контейнер последовательности другому компоненту
среда выполнения Windows, используйте Windows::Foundation::Collections::
IVector<T> в качестве параметра или возвращаемого типа, а
Platform::Collections::Vector<T> — в качестве конкретной реализации. При попытке
использования типа Vector в качестве открытого возвращаемого значения или
параметра возникнет ошибка компилятора C3986. Эту ошибку можно исправить,
заменив Vector объектом IVector .

) Важно!

В случае передачи последовательности внутри разрабатываемой программы


используйте Vector или std::vector , поскольку они более эффективны по
сравнению с IVector . Используйте IVector только при передаче контейнера с
помощью ABI.

Система типов среда выполнения Windows не поддерживает концепцию


массивов, поэтому вы не можете передать IVector<Platform::Array<T>> в
качестве возвращаемого значения или параметра метода. Для передачи
массива массивов или последовательности массивов в ABI используйте
IVector<IVector<T>^> .
Класс Vector<T> предоставляет методы, необходимые для добавления и удаления
элементов коллекции и доступа к ним. Его можно неявно преобразовать в класс
IVector<T> . Алгоритмы STL также можно применять к экземплярам Vector<T> . В

следующем примере демонстрируются некоторые простейшие варианты


использования. Функция начала и функция окончания , используемые здесь, — из
пространства имен Platform::Collections , а не std .

C++

#include <collection.h>
#include <algorithm>

using namespace Platform;

using namespace Platform::Collections;

using namespace Windows::Foundation::Collections;

void Class1::Test()

Vector<int>^ vec = ref new Vector<int>();

vec->Append(1);

vec->Append(2);

vec->Append(3);

vec->Append(4);

vec->Append(5);

auto it =

std::find(begin(vec), end(vec), 3);

int j = *it; //j = 3

int k = *(it + 1); //or it[1]

// Find a specified value.

unsigned int n;

bool found = vec->IndexOf(4, &n); //n = 3

// Get the value at the specified index.

n = vec->GetAt(4); // n = 3

// Insert an item.

// vec = 0, 1, 2, 3, 4, 5

vec->InsertAt(0, 0);

// Modify an item.

// vec = 0, 1, 2, 12, 4, 5,

vec->SetAt(3, 12);

// Remove an item.

//vec = 1, 2, 12, 4, 5

vec->RemoveAt(0);

// vec = 1, 2, 12, 4

vec->RemoveAtEnd();

// Get a read-only view into the vector.

IVectorView<int>^ view = vec->GetView();

Если у вас есть код, который использует std::vector и вы хотите повторно


использовать его в компоненте среда выполнения Windows, просто используйте
один из Vector конструкторов, который принимает std::vector или пару
итераторов, чтобы создать Vector в точке передачи коллекции через ABI. В
следующем примере показано использование конструктора класса Vector для
эффективной инициализации из объекта std::vector . После операции
перемещения исходная переменная vec более не является допустимой.

C++

//#include <collection.h>

//#include <vector>

//#include <utility> //for std::move

//using namespace Platform::Collections;

//using namespace Windows::Foundation::Collections;

//using namespace std;

IVector<int>^ Class1::GetInts()

vector<int> vec;

for(int i = 0; i < 10; i++)

vec.push_back(i);

// Implicit conversion to IVector

return ref new Vector<int>(std::move(vec));

Если имеется вектор строк, которые должны будут передаваться через интерфейс
ABI, необходимо решить, следует ли изначально создавать строки как типы
std::wstring или как типы Platform::String^ . Если предполагается выполнение

большого объема операций с этими строками, используйте тип wstring . В


противном случае создайте строки типа Platform::String^ , чтобы избежать
издержек, связанных с их последующим преобразованием. Кроме того,
необходимо определить, куда лучше поместить строки для внутреннего
использования — в std:vector или в Platform::Collections::Vector . В общем
случае рекомендуется использовать объект std::vector и создавать из него
Platform::Vector только при передаче контейнера через интерфейс ABI.
Типы значений в объекте Vector
Любой элемент, который необходимо сохранить в объекте
Platform::Collections::Vector , должен поддерживать сравнение на равенство (неявно
или с помощью пользовательского алгоритма сравнения std::equal_to ). Все
ссылочные типы и все скалярные типы неявно поддерживают сравнение на
равенство. Для нескалярных типов значений, таких как
Windows::FoundationDateTime, или для пользовательских сравнений (например,
objA->UniqueID == objB->UniqueID ) необходимо предоставить специальный объект

функции.

Элементы VectorProxy
Platform::Collections::VectorIterator и Platform::Collections::VectorViewIterator
позволяют использовать range for циклы и алгоритмы, такие как std::sort , с
контейнером IVector<T> . Однако невозможно получить доступ к элементам
IVector через отмену ссылки на указатель C++; доступ к ним можно получить
только с использованием методов GetAt и SetAt . Таким образом, эти итераторы
используют прокси-классы Platform::Details::VectorProxy<T> и
Platform::Details::ArrowProxy<T> для предоставления доступа к отдельным

элементам с помощью *операторов , ->и [] в соответствии с требованиями


стандартной библиотеки. Строго говоря, при использовании IVector<Person^>
vec типом *begin(vec) является VectorProxy<Person^> . Однако прокси-объект

практически всегда прозрачен для кода. Эти прокси-объекты не документируются,


поскольку предназначены исключительно для внутреннего пользования
итераторами, однако полезно иметь представление о самом механизме работы.

При использовании цикла на основе for диапазона по контейнерам IVector


используйте auto&& , чтобы позволить переменной-итератору правильно
привязаться к VectorProxy элементам. При использовании auto& компилятора
возникает предупреждение C4239 и VectoryProxy упоминается в тексте
предупреждения.

На следующем рисунке показан цикл range for с контейнерами IVector<Person^> .


Обратите внимание, что выполнение прекращается в точке останова на строке 64.
В окне Быстрая проверка показано, что переменная итератора p , по сути,
является объектом VectorProxy<Person^> с переменными-членами m_v и m_i .
Однако при вызове GetType для этой переменной она возвращает идентичный тип
в экземпляр Person p2 . Отсюда вывод: несмотря на то что VectorProxy и ArrowProxy
могут отображаться в разделе Быстрая проверка, отладчик устраняет некоторые
ошибки в компиляторе или других местах, для которых, как правило, не нужно
явно создавать код.

Один из сценариев, в котором необходимо создать код для прокси-объекта,


заключается в следующем: необходимо выполнить операцию dynamic_cast с
элементами, например при поиске объектов XAML определенного типа в
коллекции элементов UIElement . В этом случае необходимо сначала привести
элемент к Platform::Object^, а затем выполнить динамическое приведение.

C++

void FindButton(UIElementCollection^ col)

// Use auto&& to avoid warning C4239

for (auto&& elem : col)

Button^ temp = dynamic_cast<Button^>(static_cast<Object^>(elem));

if (nullptr != temp)

// Use temp...

Использование класса Map


В этом примере показано, как вставлять элементы и находить их в объекте
Platform::Collections::Map, а затем возвращать объект Map в качестве доступного
только для чтения типа Windows::Foundation::Collections::IMapView .

C++

//#include <collection.h>

//using namespace Platform::Collections;

//using namespace Windows::Foundation::Collections;

IMapView<String^, int>^ Class1::MapTest()

Map<String^, int>^ m = ref new Map<String^, int >();

m->Insert("Mike", 0);

m->Insert("Dave", 1);

m->Insert("Doug", 2);

m->Insert("Nikki", 3);

m->Insert("Kayley", 4);

m->Insert("Alex", 5);

m->Insert("Spencer", 6);

// PC::Map does not support [] operator

int i = m->Lookup("Doug");

return m->GetView();

Как правило, для реализации внутренних возможностей сопоставления


предпочтительно использовать тип std::map (из соображений
производительности). Если необходимо передать контейнер с помощью
интерфейса ABI, создайте объект Platform::Collections::Map из std::map и верните
Map в качестве Windows::Foundation::Collections::IMap. При попытке использования

типа Map в качестве открытого возвращаемого значения или параметра возникнет


ошибка компилятора C3986. Эту ошибку можно исправить, заменив Map объектом
IMap . В некоторых случаях (например, если вы не выполняете большого количества

операций поиска или вставки и часто передаете коллекцию через интерфейс ABI)
более рационально использовать класс Platform::Collections::Map с самого
начала, не затрачивая ресурсы на преобразование типа объекта std::map . В любом
случае следует избегать операций поиска и вставки в объектах IMap , поскольку из
всех трех типов он обладает самой низкой производительностью. Преобразование
в IMap следует выполнять только в момент передачи контейнера через интерфейс
ABI.

Типы значений в объекте Map


Элементы в Platform::Collections::Map упорядочены. Любой элемент, который
необходимо сохранить в объекте Map , должен поддерживать сравнение "меньше"
для строгого слабого порядка (неявно или с помощью пользовательского
алгоритма сравнения stl::less ). Скалярные типы поддерживают сравнение неявно.
Для нескалярных типов значений, таких как Windows::Foundation::DateTime , или для
пользовательских вариантов сравнения (например, objA->UniqueID < objB-
>UniqueID ) необходимо определять специальный алгоритм сравнения.

Типы коллекций
Коллекции подразделяются на четыре категории: изменяемые и доступные только
для чтения версии последовательных и ассоциативных коллекций. Кроме того,
C++/CX расширяет коллекции, предоставляя три класса итератора, упрощающие
доступ к коллекциям.

Элементы изменяемой коллекции можно изменять, тогда как к элементам


коллекции, доступной только для чтения (также называемой представлением),
можно обращаться только для чтения. Доступ к элементам коллекции
Platform::Collections::Vector илиPlatform::Collections::VectorView можно получить с
помощью итератора или vector::GetAt коллекции и индекса. Доступ к элементам
ассоциативной коллекции можно получить с помощью map::Lookup коллекции и
ключа.

Класс Platform::Collections::Map

Изменяемая ассоциативная коллекция. Элементы объекта Map представляют собой


пары "ключ-значение". Поддерживается как поиск значения по связанному с ним
ключу, так и перебор всех пар "ключ-значение".

В классах Map и MapView используется шаблон <K, V, C = std::less<K>> ; таким


образом, алгоритм сравнения можно изменять. Кроме того, в классах Vector и
VectorView используется шаблон <T, E = std::equal_to<T>> , поэтому поведение

метода IndexOf() можно изменять. Это важно в основном для объектов Vector и
VectorView , содержащих структуры значения. Например, чтобы создать

вектор<Windows::Foundation::D ateTime>, необходимо предоставить


пользовательский компаратор, так как DateTime не перегружает оператор ==.

Класс Platform::Collections::MapView

Версия объекта Map только для чтения.

Класс Platform::Collections::Vector

Изменяемая коллекция последовательностей. Класс Vector<T> поддерживает


операции произвольного доступа, занимающие фиксированное время, и операции
добавления , занимающие фиксированное время с поправкой на амортизацию.

Класс Platform::Collections::VectorView

Версия объекта Vector только для чтения.

Класс Platform::Collections::InputIterator

Итератор STL, отвечающий требованиям итератора ввода STL.

Класс Platform::Collections::VectorIterator

Итератор STL, отвечающий требованиям изменяемого итератора произвольного


доступа STL.
Класс Platform::Collections::VectorViewIterator

Итератор STL, удовлетворяющий требованиям итератора произвольного доступа


STL const .

Функции begin() и end()


Чтобы упростить использование STL для обработки Vector произвольных
Windows::Foundation::Collections объектов , VectorView , Map , MapView и, C++/CX

поддерживает перегрузки функций begin и end Function, не являющихся членами.

В следующей таблице перечислены все доступные итераторы и функции.

Iterators Функции

Platform::Collections::VectorIterator<T>
Начать/
end(Windows::Foundation::Collections::
(Внутреннее хранение IVector<T>)
Windows::Foundation::Collections:: IVector<T> и
int.)

Platform::Collections::VectorViewIterator<T>
Начать/ end (IVectorView<T>^)

(Внутренне хранит IVectorView<T>^ и int.)

Platform::Collections::InputIterator<T>
Начать/ end (IIterable<T>)

(Внутренне хранит IIterator<T>^ и T.)

Platform::Collections::InputIterator<IKeyValuePair<K, Начать/ end (IMap<K,V>.


V>^>

(Внутренне хранит IIterator<T>^ и T.)

Platform::Collections::InputIterator<IKeyValuePair<K, Начать/ end


V>^>
(Windows::Foundation::Collections::IMapView)

(Внутренне хранит IIterator<T>^ и T.)

События изменения коллекций


Классы Vector и Map поддерживают привязку данных в коллекциях XAML за счет
реализации событий, которые возникают при изменении или сбросе объекта
коллекции, а также при вставке, удалении или изменении любого элемента
коллекции. Можно разрабатывать собственные типы, поддерживающие привязку
данных, но нельзя наследовать от типов Map и Vector , так как эти типы запечатаны.
Делегаты Windows::Foundation::Collections::VectorChangedEventHandler и
Windows::Foundation::Collections::MapChangedEventHandler определяют сигнатуры
для обработчиков событий для событий изменения коллекции. Открытый класс
перечисления Windows::Foundation::Collections::CollectionChange и ссылочные
классы Platform::Collection::Details::MapChangedEventArgs и
Platform::Collections::Details::VectorChangedEventArgs хранят аргументы события,

по которым можно определить его причину. *EventArgs Типы определяются в


Details пространстве имен, так как вам не нужно создавать или использовать их

явным образом при использовании Map или Vector .

См. также раздел


Система типов

Справочник по языку C++/CX

Справочник по пространствам имен


Классы ссылки шаблонов (C++/CX)
Статья • 03.04.2023

Шаблоны C++ не публикуются в метаданных и поэтому не могут иметь быть


открытыми или защищенными в программе. Конечно внутри программы можно
использовать стандартные шаблоны C++. Кроме того, можно определить закрытый
класс ссылки в качестве шаблона и объявить явно специализированный класс
ссылки шаблона в качестве закрытого члена открытого класса ссылки.

Создание шаблонов классов ссылок


В следующем примере показано, как объявить закрытый класс ссылки в виде
шаблона, как объявить стандартный шаблон C++ и как объявить такие класс и
шаблон в качестве членов открытого класса ссылки. Обратите внимание, что
стандартный шаблон C++ может быть специализирован по типу среда выполнения
Windows, в данном случае Platform::String^.

C++

namespace TemplateDemo

// A private ref class template

template <typename T>

ref class MyRefTemplate

internal:

MyRefTemplate(T d) : data(d){}

public:

T Get(){ return data; }

private:

T data;

};

// Specialization of ref class template

template<>

ref class MyRefTemplate<Platform::String^>

internal:

//...

};

// A private derived ref class that inherits

// from a ref class template specialization

ref class MyDerivedSpecialized sealed : public MyRefTemplate<int>

internal:

MyDerivedSpecialized() : MyRefTemplate<int>(5){}
};

// A private derived template ref class

// that inherits from a ref class template

template <typename T>

ref class MyDerived : public MyRefTemplate<T>

internal:

MyDerived(){}

};

// A standard C++ template

template <typename T>

class MyStandardTemplate

public:

MyStandardTemplate(){}

T Get() { return data; }

private:

T data;

};

// A public ref class with private

// members that are specializations of

// ref class templates and standard C++ templates.

public ref class MySpecializeBoth sealed

public:

MySpecializeBoth(){}

private:

MyDerivedSpecialized^ g;

MyStandardTemplate<Platform::String^>* n;

};

См. также раздел


Система типов (C++/CX)

Справочник по языку C++/CX

Справочник по пространствам имен


Интерфейсы (C++/CX)
Статья • 03.04.2023

Хотя класс ссылки может наследовать не более чем от одного конкретного


базового класса, он может реализовывать любое количество классов интерфейсов.
Сам класс интерфейса (или структура интерфейса) может наследовать (или
требовать) несколько классов интерфейсов, может перегружать свои функции-
члены и иметь параметры-типы.

Характеристики
Интерфейс имеет следующие характеристики:

Класс интерфейса (или структура) должен быть объявлен в пространстве


имен, а также может иметь режим доступа public (открытый) или private
(закрытый). Только открытые интерфейсы формируют метаданные.

члены интерфейса могут включать в себя свойства, методы и события;

Все члены интерфейса неявно являются открытыми и виртуальными.

поля и статические члены запрещены;

Типы, используемые в качестве свойств, параметров метода или


возвращаемых значений, могут быть только среда выполнения Windows
типами; сюда входят основные типы и типы классов перечисления.

Объявление и использование
В следующем примере показан способ объявления интерфейса. Обратите
внимание, что интерфейс можно объявить или как класс, или как тип структуры.

C++

namespace InterfacesTest

public enum class PlayState {Playing, Paused, Stopped, Forward,


Reverse};

public ref struct MediaPlayerEventArgs sealed

property PlayState oldState;

property PlayState newState;

};

public delegate void OnStateChanged(Platform::Object^ sender,


MediaPlayerEventArgs^ a);

public interface class IMediaPlayer // or public interface struct


IMediaPlayer

event OnStateChanged^ StateChanged;

property Platform::String^ CurrentTitle;

property PlayState CurrentState;

void Play();

void Pause();

void Stop();

void Back(float speed);

void Forward(float speed);

};

Для реализации интерфейса класс ссылки или структура ссылки объявляет и


реализует виртуальные методы и свойства. Интерфейс и реализующий его класс
ссылки должны использовать одинаковые имена параметров методов, как
показано в следующем примере:

C++

public ref class MyMediaPlayer sealed : public IMediaPlayer

public:

//IMediaPlayer

virtual event OnStateChanged^ StateChanged;

virtual property Platform::String^ CurrentTitle;

virtual property PlayState CurrentState;

virtual void Play()

// ...

auto args = ref new MediaPlayerEventArgs();

args->newState = PlayState::Playing;

args->oldState = PlayState::Stopped;

StateChanged(this, args);
}

virtual void Pause(){/*...*/}

virtual void Stop(){/*...*/}

virtual void Forward(float speed){/*...*/}

virtual void Back(float speed){/*...*/}

private:

//...

};

Иерархии наследования интерфейсов


Интерфейс может наследовать от одного или нескольких интерфейсов. Но в
отличие от структуры и класса ссылки, интерфейс не объявляет наследуемые члены
интерфейса. Если интерфейс B наследует от интерфейса A, а класс ссылки C
наследует от интерфейса B, класс C должен реализовывать и A, и B. Это показано в
следующем примере.

C++

public interface struct A { void DoSomething(); };

public interface struct B : A { void DoSomethingMore();};

public ref struct C sealed : B

virtual void DoSomething(){}

virtual void DoSomethingMore(){}

};

Реализация свойств и событий интерфейса


Как показано в предыдущем примере, для реализации свойств интерфейса можно
использовать тривиальные виртуальные свойства. Также можно определить
пользовательские методы получения и задания в реализующем классе. Оба эти
метода должны быть открытыми в свойстве интерфейса.

C++

//Alternate implementation in MediaPlayer class of


IMediaPlayer::CurrentTitle

virtual property Platform::String^ CurrentTitle

Platform::String^ get() {return "Now playing: " + _title;}

void set(Platform::String^ t) {_title = t; }

Если интерфейс объявляет свойство, доступное только для получения или только
для задания, реализующий класс должен явно предоставить метод получения или
задания.

C++

public interface class IMediaPlayer

//...

property Platform::String^ CurrentTitle

Platform::String^ get();

};

public ref class MyMediaPlayer3 sealed : public IMediaPlayer

public:

//...

virtual property Platform::String^ CurrentTitle

Platform::String^ get() {return "Now playing: " + _title;}

private:

Platform::String^ _title;

};

Кроме того, можно реализовать пользовательские методы добавления и удаления


для событий в реализующем классе.

Явная реализация интерфейса


Если класс ссылки реализует несколько интерфейсов, и эти интерфейсы содержат
методы, имена и сигнатуры которых идентичны компилятору, можно использовать
следующий синтаксис для явного указания метода интерфейса, который
реализуется методом класса.

C++

public interface class IArtist

Platform::String^ Draw();

};

public interface class ICowboy

Platform::String^ Draw();

};

public ref class MyClass sealed : public IArtist, ICowboy

public:

MyClass(){}

virtual Platform::String^ ArtistDraw() = IArtist::Draw {return


L"Artist";}

virtual Platform::String^ CowboyDraw() = ICowboy::Draw {return


L"Cowboy";}

};

Универсальные интерфейсы
В C++/CX ключевое generic слово используется для представления
параметризованного типа среда выполнения Windows. Параметризованный тип
передается в метаданные и может использоваться кодом, который написан на
любом языке, поддерживающем параметры-типы. Среда выполнения Windows
определяет некоторые универсальные интерфейсы, например
Windows::Foundation::Collections::IVector<T>, но не поддерживает создание
общедоступных пользовательских универсальных интерфейсов в C++/CX. Однако
можно создавать закрытые универсальные интерфейсы.

Вот как можно использовать среда выполнения Windows типы для создания
универсального интерфейса:

Универсальный определяемый пользователем interface class в компоненте


не может передаваться в соответствующий файл метаданных Windows;
поэтому он не может быть открытым и не может реализовываться клиентским
кодом в других файлах WinMD. Он может быть реализован неоткрытыми
классами ссылок в том же компоненте. Открытый класс ссылки может иметь
универсальный тип интерфейса в качестве закрытого члена.

В следующем фрагменте кода показано, как объявить универсальный


interface class , а затем реализовать его в закрытом классе ссылки и
использовать класс ссылки в качестве закрытого члена открытого класса
ссылки.

C++

public ref class MediaFile sealed {};

generic <typename T>

private interface class IFileCollection

property Windows::Foundation::Collections::IVector<T>^ Files;

Platform::String^ GetFileInfoAsString(T file);

};

private ref class MediaFileCollection : IFileCollection<MediaFile^>

public:

virtual property
Windows::Foundation::Collections::IVector<MediaFile^>^ Files;

virtual Platform::String^ GetFileInfoAsString(MediaFile^ file)


{return "";}

};

public interface class ILibraryClient

bool FindTitle(Platform::String^ title);

//...

};

public ref class MediaPlayer sealed : public IMediaPlayer, public


ILibraryClient

public:

//IMediaPlayer

virtual event OnStateChanged^ StateChanged;

virtual property Platform::String^ CurrentTitle;

virtual property PlayState CurrentState;

virtual void Play()

auto args = ref new MediaPlayerEventArgs();

args->newState = PlayState::Playing;

args->oldState = PlayState::Stopped;

StateChanged(this, args);
}

virtual void Pause(){/*...*/}

virtual void Stop(){/*...*/}

virtual void Forward(float speed){/*...*/}

virtual void Back(float speed){/*...*/}

//ILibraryClient

virtual bool FindTitle(Platform::String^ title){/*...*/ return


true;}

private:

MediaFileCollection^ fileCollection;

};

Универсальный интерфейс должен следовать стандартным правилам


интерфейсов, регламентирующим возможности доступа, члены, отношения
requires (требует), базовые классы и т. д.

Универсальный интерфейс может принимать один или несколько параметров


универсальных типов, перед которыми указывается typename или class .
Параметры, не являющиеся типами, не поддерживаются.

Параметр типа может быть любым типом среда выполнения Windows. Это
означает, что параметр-тип может быть ссылочным типом, типом значения,
классом интерфейса, делегатом, основным типом или открытым
перечислимым классом.

Закрытый универсальный интерфейс — это интерфейс, наследующий от


универсального интерфейса и указывающий аргументы конкретного типа для
всех параметров-типов. Его можно использовать везде, где допускается
использовать неуниверсальный закрытый интерфейс.

Открытый универсальный интерфейс — это интерфейс, имеющий один или


несколько параметров-типов, для которых пока не предоставлено никаких
конкретных типов. Его можно использовать везде, где допускается
использовать типы, в том числе в качестве аргумента-типа другого
универсального интерфейса.

Параметризовать можно только весь интерфейс, но не отдельные методы.

Параметры-типы нельзя ограничивать.

Закрытый универсальный интерфейс имеет неявно создаваемый UUID.


Пользователь не может задать UUID.

Если в интерфейсе имеется какая-либо ссылка на текущий интерфейс (в


параметре метода, возвращаемом значении или свойстве), предполагается,
что она указывает на текущий экземпляр. Например, IMyIntf означает
IMyIntf<T>.

Если тип параметра метода является параметром типа, объявление этого


параметра или переменной использует имя параметра типа без указателя,
собственной ссылки или дескриптора дескрипторов. Иначе говоря,
невозможно написать "T^".

Шаблонные классы ссылок должны быть закрытыми. Они могут


реализовывать универсальные интерфейсы и передавать параметр шаблона T
в универсальный аргумент T. Каждый экземпляр шаблонного класса ссылок
сам по себе является классом ссылок.

См. также раздел


Система типов

Справочник по языку C++/CX

Справочник по пространствам имен


Перечисления (C++/CX)
Статья • 03.04.2023

C++/CX поддерживает ключевое public enum class слово , которое аналогично


стандартному C++ scoped enum . При использовании перечислителя, объявленного
с помощью ключевого слова public enum class , необходимо использовать
идентификатор перечисления, чтобы определить область каждого значения
перечислителя.

Комментарии
Объявление public enum class , не содержащее спецификатор доступа, например
public , обрабатывается как стандартное перечисление С++ с областью видимости.

Объявление public enum class или public enum struct может иметь базовый тип
любого целочисленного типа, хотя сам среда выполнения Windows требует, чтобы
тип был int32 или uint32 для перечисления флагов. Следующий синтаксис
описывает части объявления public enum class или public enum struct .

В этом примере показано, как определить открытый класс перечисления:

C++

// Define the enum

public enum class TrafficLight : int { Red, Yellow, Green };

// ...

В следующем примере показано, как использовать его:

C++

// Consume the enum:

TrafficLight myLight = TrafficLight::Red;

if (myLight == TrafficLight::Green)

//...

Примеры
В следующих примерах показано, как объявить перечисление.
C++

// Underlying type is int32

public enum class Enum1

Zero,

One,

Two,

Three

};

public enum class Enum2

None = 0,

First, // First == 1

Some = 5,

Many = 10

};

// Underlying type is unsigned int

// for Flags. Must be explicitly specified

using namespace Platform::Metadata;

[Flags]

public enum class BitField : unsigned int

Mask0 = 0x0,

Mask2 = 0x2,

Mask4 = 0x4,

Mask8 = 0x8

};

Enum1 e1 = Enum1::One;

int v1 = static_cast<int>(e1);

int v2 = static_cast<int>(Enum2::First);

В следующем примере показано, как выполнять приведение к числовым


эквивалентами и выполнять сравнения. Обратите внимание, что область
использования перечислителя One определяется идентификатором перечисления
Enum1 , а область использования перечислителя First — идентификатором Enum2 .

C++

if (e1 == Enum1::One) { /* ... */ }

//if (e1 == Enum2::First) { /* ... */ } // yields compile error C3063

static_assert(sizeof(Enum1) == 4, "sizeof(Enum1) should be 4");

BitField x = BitField::Mask0 | BitField::Mask2 | BitField::Mask4;

if ((x & BitField::Mask2) == BitField::Mask2) { /* */ }

См. также раздел


Система типов

Справочник по языку C++/CX

Справочник по пространствам имен


Делегаты (C++/CX)
Статья • 03.04.2023

Ключевое delegate слово используется для объявления ссылочного типа, который


является среда выполнения Windows эквивалентом объекта функции в
стандартном C++. Объявление делегата похоже на сигнатуру функции; оно
определяет тип возвращаемого значения и типы параметров, которые должна
иметь заключенная в оболочку функция. Ниже показано пользователем
объявление делегата:

C++

public delegate void PrimeFoundHandler(int result);

Делегаты наиболее часто используются в сочетании с событиями. Событие имеет


тип делегата; эта связь во многом похожа на отношения между классом и типом
интерфейса. Делегат представляет контракт, которому должны соответствовать
обработчики событий. Ниже приведен член класса событий, тип которого является
ранее определенным делегатом:

C++

event PrimeFoundHandler^ primeFoundEvent;

При объявлении делегатов, которые будут предоставляться клиентам в двоичном


интерфейсе приложения среда выполнения Windows, используйте
Windows::Foundation::TypedEventHandler<TSender, TResult>. Этот делегат имеет
предопределенные двоичные прокси и заглушки, которые позволяют его
использовать клиентами Javascript.

Использование делегатов
При создании приложения универсальная платформа Windows часто вы работаете
с делегатом в качестве типа события, предоставляемого классом среда выполнения
Windows. Чтобы подписаться на событие, создайте экземпляр типа делегата, указав
функцию (или лямбда-выражение), соответствующее сигнатуре делегата. Затем
воспользуйтесь оператором += , чтобы передать объект делегата члену события в
классе. Это называется "подписаться на событие". Когда экземпляр класса
инициирует событие, вызывается ваша функция, а также другие обработчики,
которые были добавлены данным объектом или другими объектами.
 Совет

При создании обработчика событий Visual Studio выполняет многие действия


автоматически. Например, при определении обработчика событий в разметке
XAML появляется подсказка. Если щелкнуть подсказку, Visual Studio
автоматически создаст метод обработчика событий и свяжет его с событием в
классе публикации.

В следующем примере демонстрируется использование основного подхода.


Windows::Foundation::TypedEventHandler — это тип делегата. Функция обработчика

создана с помощью именованной функции.

В файле app.h:

C++

[Windows::Foundation::Metadata::WebHostHiddenAttribute]

ref class App sealed

void InitializeSensor();

void SensorReadingEventHandler(Windows::Devices::Sensors::LightSensor^
sender,

Windows::Devices::Sensors::LightSensorReadingChangedEventArgs^
args);

float m_oldReading;

Windows::Devices::Sensors::LightSensor^ m_sensor;

};

В файле app.cpp:

C++

void App::InitializeSensor()

// using namespace Windows::Devices::Sensors;

// using namespace Windows::Foundation;

m_sensor = LightSensor::GetDefault();

// Create the event handler delegate and add

// it to the object's event handler list.

m_sensor->ReadingChanged += ref new TypedEventHandler<LightSensor^,

LightSensorReadingChangedEventArgs^>( this,

&App::SensorReadingEventHandler);

void App::SensorReadingEventHandler(LightSensor^ sender,

LightSensorReadingChangedEventArgs^
args)

LightSensorReading^ reading = args->Reading;

if (reading->IlluminanceInLux > m_oldReading)

{/*...*/}

2 Предупреждение

Как правило, для обработчика событий лучше использовать именованную


функцию, а не лямбда-выражение, чтобы не пришлось внимательно следить
за возникновением циклических ссылок. Именованная функция перехватывает
указатель this с помощью слабой ссылки, в то время как лямбда-выражение
перехватывает его с помощью строгой ссылки и создает циклическую ссылку.
Дополнительные сведения см. в разделе "Слабые ссылки" и "Критические
циклы".

По соглашению имена делегатов обработчика событий, определенные среда


выполнения Windows имеют форму *EventHandler, например RoutedEventHandler,
SizeChangedEventHandler или SuspendingEventHandler. Также общепринято, что
делегаты обработчиков событий имеют два параметра и возвращают значение
void. В делегате, у которого нет параметров-типов, первый параметр принадлежит
к типу Platform::Object^; он хранит ссылку на объект-отправитель,
инициировавший событие. Необходимо выполнить приведение обратно в
исходный тип, прежде чем использовать аргумент в методе обработчика событий.
В делегате обработчика событий, имеющем параметры-типы, первый параметр-
тип указывает тип отправителя, а второй параметр является дескриптором класса
ссылки, который содержит сведения о событии. В соответствии с общепринятой
практикой имя этого класса имеет формат *EventArgs. Например, делегат
RoutedEventHandler имеет второй параметр типа RoutedEventArgs^, и
DragEventHander имеет второй параметр типа DragEventArgs^.

В соответствии с общепринятой практикой делегаты, являющиеся оболочками для


кода, который выполняется при завершении асинхронной операции, имеют имя
*CompletedHandler. Эти делегаты определяются как свойства класса, а не как
события. Поэтому оператор += не используется, чтобы подписаться на них; вместо
этого объект делегата просто присваивается свойству.

 Совет
C++ IntelliSense не показывает полную сигнатуру делегата, а потому не
помогает определить конкретный тип параметра EventArgs. Чтобы определить
его тип, можно открыть Обозреватель объектов и просмотреть сведения о
методе Invoke делегата.

Создание пользовательских делегатов


Вы можете определить собственные делегаты, определить обработчики событий
или разрешить потребителям передавать пользовательские функции компоненту
среда выполнения Windows. Как и любой другой тип среда выполнения Windows,
открытый делегат нельзя объявить как универсальный.

Объявление
Объявление делегата похоже на объявление функции, за исключением того что
делегат — это тип. Обычно делегат объявляется в области пространства имен, хотя
также можно вложить объявление делегата внутрь объявления класса. Следующий
делегат инкапсулирует любую функцию, принимающую аргумент ContactInfo^ и
возвращающую значение Platform::String^ .

C++

public delegate Platform::String^ CustomStringDelegate(ContactInfo^ ci);

После объявления типа делегата можно объявить члены класса этого типа или
методы, принимающие в качестве параметров объекты этого типа. Метод или
функция также может возвращать тип делегата. В следующем примере метод
ToCustomString принимает делегат в качестве входного параметра. Этот метод
позволяет клиентскому коду предоставить пользовательскую функцию, которая
создает строку из некоторых или всех открытых свойств объекта ContactInfo .

C++

public ref class ContactInfo sealed

public:

ContactInfo(){}

ContactInfo(Platform::String^ saluation, Platform::String^ last,


Platform::String^ first, Platform::String^ address1);

property Platform::String^ Salutation;

property Platform::String^ LastName;

property Platform::String^ FirstName;

property Platform::String^ Address1;

//...other properties

Platform::String^ ToCustomString(CustomStringDelegate^ func)

return func(this);

};

7 Примечание

Символ "^" используется при обращении к типу делегата так же, как и с
любым ссылочным типом среда выполнения Windows.

Объявление события всегда имеет тип делегата. В этом примере показана типичная
сигнатура типа делегата в среда выполнения Windows:

C++

public delegate void RoutedEventHandler(

Platform::Object^ sender,

Windows::UI::Xaml::RoutedEventArgs^ e

);

Событие Click в классе Windows:: UI::Xaml::Controls::Primitives::ButtonBase


принадлежит к типу RoutedEventHandler . Дополнительные сведения см. в статье
Events (Visual Basic) (События в Visual Basic).

Сначала клиентский код создает экземпляр делегата, используя ref new и


предоставляя лямбда-выражение, совместимое с сигнатурой делегата, и
определяет пользовательское поведение.

C++

CustomStringDelegate^ func = ref new CustomStringDelegate([] (ContactInfo^


c)

return c->FirstName + " " + c->LastName;

});

Затем он вызывает функцию-член и передает делегат. Предположим, что ci


является экземпляром класса ContactInfo^ и textBlock является конструкцией
TextBlock^ XAML-кода.
C++

textBlock->Text = ci->ToCustomString( func );

В следующем примере клиентское приложение передает пользовательский делегат


в открытый метод в компоненте среда выполнения Windows, который выполняет
делегат для каждого элемента в: Vector

C++

//Client app

obj = ref new DelegatesEvents::Class1();

CustomStringDelegate^ myDel = ref new CustomStringDelegate([] (ContactInfo^


c)

return c->Salutation + " " + c->LastName;

});

IVector<String^>^ mycontacts = obj->GetCustomContactStrings(myDel);

std::for_each(begin(mycontacts), end(mycontacts), [this] (String^ s)

this->ContactString->Text += s + " ";

});

C++

// Public method in WinRT component.

IVector<String^>^ Class1::GetCustomContactStrings(CustomStringDelegate^ del)

namespace WFC = Windows::Foundation::Collections;

Vector<String^>^ contacts = ref new Vector<String^>();

VectorIterator<ContactInfo^> i = WFC::begin(m_contacts);

std::for_each( i ,WFC::end(m_contacts), [contacts, del](ContactInfo^ ci)

contacts->Append(del(ci));

});

return contacts;

Строительство
Делегат можно создать из любого из следующих объектов:

lambda
статическая функция;

указатель на член;

std::function.

В следующем примере показано, как создать делегат из каждого из этих объектов.


Принципы использования делегата абсолютно не зависят от типа объекта, из
которого создан его экземпляр.

C++

ContactInfo^ ci = ref new ContactInfo("Mr.", "Michael", "Jurek", "1234


Compiler Way");

// Lambda. (Avoid capturing "this" or class members.)

CustomStringDelegate^ func = ref new CustomStringDelegate([] (ContactInfo^


c)

return c->Salutation + " " + c->FirstName + " " + c->LastName;

});

// Static function.

// static Platform::String^ GetFirstAndLast(ContactInfo^ info);

CustomStringDelegate^ func2 = ref new


CustomStringDelegate(Class1::GetFirstAndLast);

// Pointer to member.

// Platform::String^ GetSalutationAndLast(ContactInfo^ info)

CustomStringDelegate^ func3 = ref new CustomStringDelegate(this,


&DelegatesEvents::Class1::GetSalutationAndLast);

// std::function

std::function<String^ (ContactInfo^)> f = Class1::GetFirstAndLast;


CustomStringDelegate^ func4 = ref new CustomStringDelegate(f);

// Consume the delegates. Output depends on the

// implementation of the functions you provide.

textBlock->Text = func(ci);

textBlock2->Text = func2(ci);

textBlock3->Text = func3(ci);

textBlock4->Text = func4(ci);

2 Предупреждение
Если используется лямбда-выражение, которое перехватывает указатель "this",
необходимо с помощью оператора -= явно отменить регистрацию в событии
до выхода из лямбда-выражения. Дополнительные сведения см. в статье
Events (Visual Basic) (События в Visual Basic).

Универсальные делегаты
Универсальные делегаты в C ++/CX имеют ограничения, аналогичные
объявлениям универсальных классов. Они не могут объявляться как открытые.
Можно объявить частный или внутренний универсальный делегат и использовать
его из C++, но клиенты .NET или JavaScript не могут использовать его, так как он не
создается в метаданные WINMD. В этом примере объявляется универсальный
делегат, который можно использовать только в коде C++:

C++

generic <typename T>

delegate void MyEventHandler(T p1, T p2);

В следующем примере объявляется специальный экземпляр делегата внутри


определения класса:

C++

MyEventHandler<float>^ myDelegate;

Делегаты и потоки
Делегат, как и объект функции, содержит код, выполняемый в некий момент в
будущем. Если код, который создает и передает делегат, и функция, которая
принимает и выполняет этот делегат, выполняются в одном и том же потоке,
действия относительно просты. Если этот поток является потоком
пользовательского интерфейса, делегат может напрямую манипулировать
объектами пользовательского интерфейса, такими как элементы управления XAML.

Если клиентское приложение загружает компонент среда выполнения Windows,


который выполняется в потоке, и предоставляет делегат для этого компонента, то
по умолчанию делегат вызывается непосредственно в потоке STA. Большинство
среда выполнения Windows компонентов могут выполняться в STA или MTA.
Если код, который выполняет делегат, выполняется в другом потоке (например, в
контексте объекта concurrency::task), вам необходимо синхронизировать доступ к
общим данным. Например, если делегат содержит ссылку на объект Vector и
элемент управления XAML содержит ссылку на тот же самый объект Vector,
необходимо принять меры, чтобы избежать взаимоблокировки и состояния гонки,
которые могут возникнуть, если делегат и элемент управления XAML попытаются
обратиться к объекту Vector одновременно. Необходимо также обеспечить, чтобы
делегат не пытался захватить с помощью ссылок локальные переменные, которые
могут оказаться вне области до того, как произойдет вызов делегата.

Если для созданного делегата требуется обеспечить возможность обратного


вызова в том же потоке, где он был создан (например, если он передается
компоненту, который выполняется в многопотоковом подразделении), и
возможность вызова в том же потоке, что и создавший его код, используйте
перегруженный метод конструктора делегата, принимающий второй параметр
CallbackContext . Используйте этот перегруженный метод только для делегатов,

имеющих зарегистрированный прокси или заглушку; не все делегаты,


определенные в Windows.winmd, являются зарегистрированными.

Если вы знакомы с обработчиками событий в .NET, вам известно, что перед


возникновением события рекомендуется создать его локальную копию. Это
позволяет избежать состояния гонки, при котором обработчик события может
быть удален непосредственно перед вызовом события. Это не нужно делать в
C++/CX, так как при добавлении или удалении обработчиков событий создается
новый список обработчиков. Поскольку объект C++ увеличивает счетчик ссылок в
списке обработчиков до вызова события, это гарантирует, что все обработчики
будут действительными. Однако это также означает, что если удалить обработчик
событий в потоке-потребителе, этот обработчик все равно может быть вызван,
если публикующий объект все еще работает со своей копией списка, которая к
этому моменту устарела. Публикующий объект не получит обновленный список до
следующего вызова события.

См. также раздел


Система типов

Справочник по языку C++/CX

Справочник по пространствам имен


Исключения (C++/CX)
Статья • 03.04.2023

Обработка ошибок в C++/CX основана на исключениях. На самом


фундаментальном уровне среда выполнения Windows компоненты сообщают об
ошибках как значения HRESULT. В C++/CX эти значения преобразуются в строго
типизированные исключения, содержащие значение HRESULT и строковое
описание, к которому можно получить доступ программным способом.
Исключения реализованы как классы ref class , производные от класса
Platform::Exception . В пространстве имен Platform определены отдельные классы

исключений для наиболее часто встречающихся значений HRESULT. Все остальные


значения передаются через класс Platform::COMException . Все классы исключений
имеют Exception::HResult , которое можно использовать для получения исходного
значения HRESULT. Вы также можете изучить сведения о стеке вызовов для
пользовательского кода в отладчике, чтобы определить исходный источник
исключения, даже если оно было создано в коде, написанном на языке, отличном
от C++.

Исключения
В программе C++ можно вызывать и перехватывать исключение, которое исходит
от операции среда выполнения Windows, исключение, производное от
std::exception , или определяемый пользователем тип. Исключение среда
выполнения Windows необходимо создавать только в том случае, если оно
пересекает границу двоичного интерфейса приложения (ABI), например, когда код,
перехватывающий исключение, написан на JavaScript. Когда исключение C++ не
среда выполнения Windows достигает границы ABI, исключение преобразуется в
Platform::FailureException исключение, представляющее E_FAIL HRESULT.
Дополнительные сведения об интерфейсе ABI см. в разделе Creating Windows
Runtime Components in C++.

Вы можете объявить Platform::Exception с помощью одного из двух конструкторов,


которые принимают параметр HRESULT или параметр HRESULT и параметр
Platform::String^, который можно передать через ABI в любое приложение среда
выполнения Windows, обрабатывающее его. Либо можно объявить исключение,
воспользовавшись одним из двух перегрузок метода Exception::CreateException ,
которые могут принимать параметр HRESULT или параметры HRESULT и
Platform::String^ .
Стандартные исключения
C++/CX поддерживает набор стандартных исключений, представляющих типичные
ошибки HRESULT. Каждое стандартное исключение наследуется от класса
Platform::COMException, который, в свою очередь, наследуется от
Platform::Exception . Если вы вызываете исключение через границы интерфейса

ABI, оно должно быть одним из стандартных исключений.

Делать собственные типы исключений производными от класса


Platform::Exception не допускается. Чтобы создать пользовательское исключение,

используйте определяемое пользователем значение HRESULT для создания объекта


COMException .

В следующей таблице перечислены стандартные исключения.

Имя Значение HRESULT Описание

COMException Определяемое Возникает при возвращении


пользователем неизвестного значения HRESULT
значение hresult после вызова метода COM.

AccessDeniedException E_ACCESSDENIED Возникает при запрете доступа к


ресурсу или функции.

ChangedStateException E_CHANGED_STATE Возникает, если метод итератора


коллекции или представления
коллекции вызван после изменения
родительской коллекции, что делает
результаты метода
недействительными.

ClassNotRegisteredException REGDB_E_CLASSNOTREG Возникает, если COM-класс не


зарегистрирован.

DisconnectedException RPC_E_DISCONNECTED Возникает, если объект отключен от


своих клиентов.

FailureException E_FAIL Возникает, если операция


завершается неудачно.

InvalidArgumentException E_INVALIDARG Вызывается, если один из


передаваемых методу аргументов
является недопустимым.

InvalidCastException E_NOINTERFACE Возникает, если тип не удается


привести к другому типу.
Имя Значение HRESULT Описание

NotImplementedException E_NOTIMPL Возникает, если метод интерфейса


не реализован в классе.

NullReferenceException E_POINTER Возникает при попытке


разыменовать ссылку на объект
NULL.

ObjectDisposedException RO_E_CLOSED Вызывается при выполнении


операции над ликвидированным
объектом.

OperationCanceledException E_ABORT Возникает при отмене операции.

OutOfBoundsException E_BOUNDS Возникает, когда операция пытается


получить доступ к данным за
пределами допустимого диапазона.

OutOfMemoryException E_OUTOFMEMORY Возникает, если недостаточно


памяти для выполнения операции.

WrongThreadException RPC_E_WRONG_THREAD Вызывается, если поток выполняет


вызов посредством указателя на
интерфейс для прокси-объекта,
который не принадлежит к
подразделению потока.

Свойства HResult и Message


Все исключения имеют свойство HResult и свойство Message . Свойство
Exception::HResult получает базовое числовое значение HRESULT соответствующего
исключения. Свойство Exception::Message получает предоставленную системой
строку с описанием исключения. В Windows 8 сообщение доступно только в
отладчике и доступно только для чтения. Это означает, что его невозможно
изменить после повторного создания исключения. В Windows 8.1 к строке
сообщения можно получить доступ программным образом и предоставить новое
сообщение, если необходимо заново создать исключение. В отладчике доступны
более подробные данные стеков вызовов, включая данные об асинхронных
вызовах методов.

Примеры
В этом примере показано, как создать исключение среда выполнения Windows для
синхронных операций:
C++

String^ Class1::MyMethod(String^ argument)

if (argument->Length() == 0)

auto e = ref new Exception(-1, "I'm Zork bringing you this message
from across the ABI.");

//throw ref new InvalidArgumentException();

throw e;

return MyMethodInternal(argument);

В следующем пример показано, как перехватить исключение.

C++

void Class2::ProcessString(String^ input)

String^ result = nullptr;


auto obj = ref new Class1();

try

result = obj->MyMethod(input);

catch (/*InvalidArgument*/Exception^ e)

// Handle the exception in a way that's appropriate

// for your particular scenario. Assume

// here that this string enables graceful

// recover-and-continue. Why not?

result = ref new String(L"forty two");

// You can use Exception data for logging purposes.

Windows::Globalization::Calendar calendar;

LogMyErrors(calendar.GetDateTime(), e->HResult, e->Message);

// Execution continues here in both cases.

//#include <string>

std::wstring ws(result->Data());

//...

Чтобы перехватывать исключения, возникающие во время асинхронной операции,


используйте класс задач и добавьте продолжение обработки ошибок.
Продолжение обработки ошибок маршалирует исключения, вызванные в других
потоках, обратно вызывающему потоку, что позволяет обрабатывать все
возможные исключения в одной структурной единице кода. Дополнительные
сведения см. в разделе Асинхронное программирование в C++.

Событие UnhandledErrorDetected
В Windows 8.1 вы можете подписаться на статическое событие
Windows::ApplicationModel::Core:CoreApplication::UnhandledErrorDetected, которое
предоставляет доступ к необработанным ошибкам, которые собираются привести
к сбою процесса. Независимо от того, где возникла ошибка, она достигнет этого
обработчика в виде объекта Windows::ApplicationModel::Core::UnhandledError ,
который передается с аргументами события. При вызове метода Propagate для
объекта он создает исключение Platform::*Exception типа, соответствующего коду
ошибки. В блоках catch можно при необходимости сохранить состояние
пользователя, а затем либо разрешить завершение процесса путем вызова throw ,
либо каким-либо образом вернуть программу в известное состояние. В следующем
примере демонстрируется использование основного подхода:

В файле app.xaml.h:

C++

void OnUnhandledException(Platform::Object^ sender,


Windows::ApplicationModel::Core::UnhandledErrorDetectedEventArgs^ e);

В app.xaml.cpp:

C++

// Subscribe to the event, for example in the app class constructor:

Windows::ApplicationModel::Core::CoreApplication::UnhandledErrorDetected +=
ref new EventHandler<UnhandledErrorDetectedEventArgs^>(this,
&App::OnUnhandledException);

// Event handler implementation:

void App::OnUnhandledException(Platform::Object^ sender,


Windows::ApplicationModel::Core::UnhandledErrorDetectedEventArgs^ e)

auto err = e->UnhandledError;

if (!err->Handled) //Propagate has not been called on it yet.

try

err->Propagate();

// Catch any specific exception types if you know how to handle them

catch (AccessDeniedException^ ex)

// TODO: Log error and either take action to recover

// or else re-throw exception to continue fail-fast

Комментарии
C++/CX не использует finally предложение .

См. также раздел


Справочник по языку C++/CX

Справочник по пространствам имен


События (C++/CX)
Статья • 26.09.2022

Тип среда выполнения Windows может объявлять события (т. е. публиковать) и


клиентский код в том же компоненте или в других компонентах может
подписываться на эти события, связывая методы, называемые обработчиками
событий с событием. С одним событием можно связать несколько обработчиков
событий. Когда публикующий объект создает событие, это вызывает срабатывание
все обработчиков событий. Таким образом, подписывающийся класс может
выполнять любые действия, зависящие от конкретной ситуации, когда
публикующий объект создает событие. Событие имеет тип делегата,
определяющего сигнатуру, которую должны иметь все обработчики событий,
чтобы подписаться на данное событие.

Использование событий в компонентах


Windows
Многие компоненты в среда выполнения Windows предоставляют события.
Например, объект LightSensor инициирует событие ReadingChanged, когда
изменяются показания датчика освещенности. При использовании в программе
объекта LightSensor можно определить метод, который будет вызываться при
возникновении события ReadingChanged. Метод может делать все, что вы хотите
сделать; единственное требование заключается в том, что его подпись должна
соответствовать подписи вызываемого делегата. Дополнительные сведения о
создании обработчика событий делегата и подписке на событие см. в разделе
"Делегаты".

Создание пользовательских событий

Объявление
Событие можно объявить в классе ссылки или интерфейсе, задав для него режим
доступа public, internal (public/private), public protected, protected, private protected
или private accessibility. При объявлении события компилятор автоматически
создает объект, имеющий два метода доступа: add и remove. Когда
подписывающиеся объекты регистрируют обработчики событий, объект события
сохраняет их в коллекции. Когда происходит событие, объект события по очереди
вызывает все обработчики в списке. Тривиальное событие (такое как в следующем
примере) имеет неявно заданное резервное хранилище, а также неявно заданные
методы доступа add и remove . Разработчик также может определять собственные
методы доступа, аналогично тому как задаются пользовательские методы доступа
get и set в случае свойств. Реализующий класс не может "вручную" перебирать
список подписчиков на событие при возникновении тривиального события.

В следующем примере показан способ объявления и инициации события.


Обратите внимание, что событие имеет тип делегата и объявлено с помощью
символа "^".

C++

namespace EventTest

ref class Class1;

public delegate void SomethingHappenedEventHandler(Class1^ sender,


Platform::String^ s);

public ref class Class1 sealed

public:

Class1(){}

event SomethingHappenedEventHandler^ SomethingHappened;

void DoSomething()

//Do something....

// ...then fire the event:

SomethingHappened(this, L"Something happened.");

};

Использование
В следующем примере показано, как подписывающийся класс с помощью
оператора += подписывается на событие и предоставляет обработчик событий,
вызываемый при возникновении этого события. Обратите внимание, что указанная
функция соответствует сигнатуре делегата, который определен на стороне издателя
в пространстве имен EventTest .

C++

namespace EventClient

using namespace EventTest;

namespace PC = Platform::Collections; //#include <collection.h>

public ref class Subscriber sealed

public:

Subscriber() : eventCount(0)

// Instantiate the class that publishes the event.

publisher= ref new EventTest::Class1();

// Subscribe to the event and provide a handler function.

publisher->SomethingHappened +=

ref new EventTest::SomethingHappenedEventHandler(

this,

&Subscriber::MyEventHandler);

eventLog = ref new PC::Map<int, Platform::String^>();

void SomeMethod()

publisher->DoSomething();

void MyEventHandler(EventTest::Class1^ mc, Platform::String^ msg)

// Our custom action: log the event.

eventLog->Insert(eventCount, msg);

eventCount++;

private:

PC::Map<int, Platform::String^>^ eventLog;

int eventCount;

EventTest::Class1^ publisher;

};

2 Предупреждение

Как правило, для обработчика событий лучше использовать именованную


функцию, а не лямбда-выражение, чтобы не пришлось внимательно следить
за возникновением циклических ссылок. Именованная функция перехватывает
указатель this с помощью слабой ссылки, в то время как лямбда-выражение
перехватывает его с помощью строгой ссылки и создает циклическую ссылку.
Дополнительные сведения см. в разделе Слабые ссылки и разрыв циклов
(C++/CX).

Пользовательские методы добавления и удаления


Изнутри у события имеются методы add(), remove() и raise(). Когда клиентский код
подписывается на событие, вызывается метод add() и переданный делегат
добавляется в список вызова события. Класс публикации вызывает событие, оно
вызывает метод raise() и по очереди вызываются все делегаты в списке. Подписчик
может удалить себя из списка делегата, в результате чего будет вызван метод
remove() события. Компилятор предоставляет версии этих методов по умолчанию,
если разработчик не определил их в своем коде; эти события называются
тривиальными. Во многих случаях тривиальных событий бывает достаточно.

Для события можно определить пользовательские методы добавления, удаления и


инициации, если требуется реализовать пользовательскую логику, выполняемую
при добавлении или удалении подписчиков. Например, если имеется
ресурсоемкий объект, который требуется только для уведомления о событиях,
можно отложить его создание до момента, когда клиент подпишется на событие.

В следующем примере показано, как добавить пользовательские методы


добавления, удаления и инициации для события.

C++

namespace EventTest2

ref class Class1;

public delegate void SomethingHappenedEventHandler(Class1^ sender,


Platform::String^ msg);

public ref class Class1 sealed

public:

Class1(){}

event SomethingHappenedEventHandler^ SomethingHappened;

void DoSomething(){/*...*/}

void MethodThatFires()

// Fire before doing something...

BeforeSomethingHappens(this, "Something's going to happen.");

DoSomething();

// ...then fire after doing something...

SomethingHappened(this, L"Something happened.");

event SomethingHappenedEventHandler^ _InternalHandler;

event SomethingHappenedEventHandler^ BeforeSomethingHappens

Windows::Foundation::EventRegistrationToken
add(SomethingHappenedEventHandler^ handler)

// Add custom logic here:

//....

return _InternalHandler += handler;

void remove(Windows::Foundation::EventRegistrationToken token)

// Add custom logic here:

//....

_InternalHandler -= token;

void raise(Class1^ sender, Platform::String^ str)

// Add custom logic here:

//....

return _InternalHandler(sender, str);

};

Удаление обработчика событий со стороны


подписчика
В некоторых редких случаях может потребоваться удалить обработчик событий для
события, на которое вы подписались ранее. Например, может потребоваться
заменить его другим обработчиком событий или удалить некоторые
удерживаемые им ресурсы. Чтобы удалить обработчик, необходим сохраненный
токен EventRegistrationToken, возвращаемый операцией += . Можно использовать
оператор -= с этим токеном для удаления обработчика событий. Однако исходный
обработчик может по-прежнему вызываться даже после его удаления. Например,
состояние гонки может возникнуть, когда источник событий получает список
обработчиков и начинает вызывать их. Если обработчик событий удаляется во
время этого, список становится устаревшим. Поэтому, если вы планируете удалить
обработчик событий, создайте флаг элемента. Установите его, если событие
удалено, а затем в обработчике событий проверьте флаг и немедленно вернитесь,
если оно задано. В следующем примере демонстрируется использование
основного шаблона.

C++

namespace EventClient2

using namespace EventTest2;

ref class Subscriber2 sealed

private:

bool handlerIsActive;

Platform::String^ lastMessage;

void TestMethod()

Class1^ c1 = ref new Class1();

handlerIsActive = true;

Windows::Foundation::EventRegistrationToken cookie =

c1->SomethingHappened +=

ref new EventTest2::SomethingHappenedEventHandler(this,


&Subscriber2::MyEventHandler);

c1->DoSomething();

// Do some other work�..then remove the event handler and set


the flag.

handlerIsActive = false;

c1->SomethingHappened -= cookie;

void MyEventHandler(Class1^ mc, Platform::String^ msg)

if (!handlerIsActive)

return;

lastMessage = msg;

};

Комментарии
С одним событием может быть связано несколько обработчиков. Источник
события поочередно вызывает все обработчики событий из одного потока. Если
приемник события выполняет блокировку в методе обработчика событий, он не
позволяет источнику события вызывать другие обработчики для этого события.

Порядок, в котором источник события вызывает обработчики событий в


приемниках события не является предопределенным и может отличаться от
вызова к вызову.

См. также раздел


Система типов

Делегаты

Справочник по языку C++/CX

Справочник по пространствам имен


Приведение (C++/CX)
Статья • 03.04.2023

Четыре разных оператора приведения применяются к типам среда выполнения


Windows: оператор static_cast, оператор dynamic_cast, оператор safe_cast и
оператор reinterpret_cast. safe_cast и static_cast создайте исключение, если
преобразование не может быть выполнено; оператор static_cast также выполняет
проверку типов во время компиляции. dynamic_cast возвращает значение nullptr ,
если не удается преобразовать тип. Хотя reinterpret_cast возвращает значение,
отличное от NULL, оно может быть неверным. По этой причине рекомендуется не
использовать reinterpret_cast , если нет уверенности, что приведение завершится
успешно. Кроме того, мы рекомендуем не использовать приведения в стиле C в
коде C++/CX, так как они идентичны reinterpret_cast .

Компилятор и среда выполнения также выполняют неявное приведение, например


в операциях упаковки, когда тип значения или встроенный тип передаются как
аргументы в метод, параметры которого имеют тип Object^ . Теоретически неявное
приведение никогда не должно вызвать исключение во время выполнения; если
компилятор не может выполнить неявное преобразование, он вызывает ошибку во
время компиляции.

среда выполнения Windows — это абстракция по протоколу COM, которая


использует коды ошибок HRESULT вместо исключений. Как правило,
Platform::InvalidCastException указывает на низкоуровневую ошибку E_NOINTERFACE
модели COM.

static_cast
static_cast проверяется во время компиляции, чтобы определить, есть ли

отношения наследования между двумя типами. Приведение вызывает ошибку


компилятора, если типы не связаны.

Применение static_cast к классу ссылки также вызывает проверку времени


выполнения. Применение static_cast к классам ссылок может пройти проверку
при компиляции, но все равно приведет к сбою во время выполнения; в этом
случае создается исключение Platform::InvalidCastException . В общем случае не
следует обрабатывать эти исключения, поскольку они почти всегда указывают на
ошибки программирования, которые можно устранить на этапах разработки и
тестирования.
Используйте static_cast , если в коде явно объявлена связь между двумя, и
поэтому вы уверены, что приведение должно работать.

C++

interface class A{};

public ref class Class1 sealed : A { };

// ...

A^ obj = ref new Class1(); // Class1 is an A

// You know obj is a Class1. The compiler verifies that this is


possible, and in C++/CX a run-time check is also performed.

Class1^ c = static_cast<Class1^>(obj);

safe_cast
Оператор safe_cast является частью среда выполнения Windows. Он выполняет
проверку типов во время выполнения и создает исключение
Platform::InvalidCastException при невозможности преобразования. Используйте
safe_cast , если сбой во время выполнения указывает на исключительное условие.
Основная цель safe_cast заключается в выявлении ошибок программирования на
этапах разработки и тестирования на момент их возникновения. Обрабатывать
исключения не следует, поскольку необработанное исключение само определяет
точку сбоя.

Используйте safe_cast, если в коде не объявлена связь, но вы уверены, что


приведение должно работать.

C++

// A and B are not related

interface class A{};

interface class B{};

public ref class Class1 sealed : A, B { };


// ...

A^ obj = ref new Class1();

// You know that obj's backing type implements A and B, but

// the compiler can't tell this by comparing A and B. The run-time type
check succeeds.

B^ obj2 = safe_cast<B^>(obj);

dynamic_cast
Используйте dynamic_cast при приведение объекта (в частности, шляпу ^) к более
производного типа, предполагается, что целевой объект иногда может быть
nullptr или что приведение может завершиться ошибкой, и вы хотите обработать

это условие как обычный путь кода вместо исключения. Например, в шаблоне
проекта пустого приложения (универсального приложения Для Windows) метод в
app.xaml.cpp используется dynamic_cast для проверки наличия OnLaunched
содержимого в окне приложения. Это не ошибка, если она не имеет содержимого;
это ожидаемое условие. Windows::Current::Content является
Windows::UI::XAML::UIElement , а преобразование выполняется в тип
Windows::UI.XAML::Controls::Frame , который в иерархии наследования является

более производным типом.

C++

void
App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventA
rgs^ args)

auto rootFrame = dynamic_cast<Frame^>(Window::Current->Content);

// Do not repeat app initialization when the window already has content,

// just ensure that the window is active

if (rootFrame == nullptr)

// Create a Frame to act as the navigation context and associate it


with

// a SuspensionManager key

rootFrame = ref new Frame();

// ...

Другое использование оператора dynamic_cast — проверка объекта Object^ ,


чтобы определить, содержит ли он тип упакованного значения. В этом случае вы
пытаетесь применить dynamic_cast<Platform::Box> или
dynamic_cast<Platform::IBox> .

dynamic_cast и отслеживание ссылок (%)


Вы также можете применить dynamic_cast ссылку на отслеживание, но в этом
случае приведение ведет себя как safe_cast. Оно создает исключение
Platform::InvalidCastException при сбое, потому что отслеживаемая ссылка не

может иметь значение nullptr .


reinterpret_cast
Не рекомендуется использовать reinterpret_cast , поскольку проверка не
выполняется ни во время компиляции, ни во время выполнения. В худшем случае
reinterpret_cast это позволяет не обнаружить ошибки программирования во
время разработки и вызвать незначительные или катастрофические ошибки в
поведении программы. Поэтому использовать reinterpret_cast рекомендуется
только в тех редких случаях, когда необходимо выполнять приведение между
несвязанными типами и известно, что такое приведение будет выполнено
успешно. Примером редкого использования является преобразование типа среда
выполнения Windows в базовый тип ABI. Это означает, что вы контролируете
подсчет ссылок для объекта. Для этого рекомендуется использовать
интеллектуальный указатель ComPtr Class . В противном случае необходимо явно
вызывать Release для интерфейса. В следующем примере показано, как класс
ссылки может быть приведен к IInspectable* .

C++

#include <wrl.h>

using namespace Microsoft::WRL;

auto winRtObject = ref new SomeWinRTType();

ComPtr<IInspectable> inspectable = reinterpret_cast<IInspectable*>


(winRtObject);

// ...

Если вы используете reinterpret_cast для преобразования из одного интерфейса


среда выполнения Windows в другой, объект будет освобожден дважды. Поэтому
используйте этот приведение только при преобразовании в интерфейс
расширений компонентов, отличных от C++.

Типы ABI
Типы ABI расположены в заголовках в Windows SDK. Для удобства имена
заголовков соответствуют именам пространств имен, например
windows.storage.h .

Типы ABI расположены в специальном пространстве имен ABI, например


ABI::Windows::Storage::Streams::IBuffer* .

Преобразования между типом интерфейса среда выполнения Windows и его


эквивалентным типом ABI всегда безопасны , то есть IBuffer^ в ABI::IBuffer* .
Класс среды выполнения среда выполнения Windows всегда следует
преобразовывать IInspectable* в интерфейс по умолчанию или его
интерфейс, если он известен.

После преобразования к типам ABI вы управляете временем жизни типа и


должны соблюдать правила модели COM. Рекомендуется использовать
WRL::ComPtr , чтобы упростить управление временем жизни указателей ABI.

В следующей таблице приведены случаи, в которых безопасно использовать


reinterpret_cast . В каждом случае приведение безопасно в обоих направлениях.

Приведение из, приведение к Приведение к, приведение из

HSTRING String^

HSTRING* String^*

IInspectable* Object^

IInspectable** Object^*

IInspectable-derived-type* same-interface-from-winmd^

IInspectable-derived-type** same-interface-from-winmd^*

IDefault-interface-of-RuntimeClass* same-RefClass-from-winmd^

IDefault-interface-of-RuntimeClass** same-RefClass-from-winmd^*

См. также раздел


Система типов
Справочник по языку C++/CX
Справочник по пространствам имен
Упаковка-преобразование (C++/CX)
Статья • 03.04.2023

Упаковка — это заключение переменной типа значения, например


Windows::Foundation::DateTime, или базового скалярного типа, например int , в
ссылочный класс при передаче переменной методу, который в качестве входного
типа принимает Platform::Object^ .

Передача типа значения параметру Object^


Хотя явным образом упаковывать переменную для ее передачи в параметр метода
типа Platform::Object^не требуется, необходимо выполнять явное приведение к
исходному типу при получении значений, которые до этого были упакованы.

C++

Object^ obj = 5; //scalar value is implicitly boxed

int i = safe_cast<int>(obj); //unboxed with explicit cast.

Использование Platform::IBox<T> для поддержки


типов значений, допускающих значение NULL
C# и Visual Basic поддерживают понятие типов значений, допускающих значения
null. В C++/CX тип можно использовать Platform::IBox<T> для предоставления
открытых методов, поддерживающих параметры типа значений, допускающие
значение NULL. В следующем примере показан открытый метод C++/CX, который
возвращает значение NULL, когда вызывающий объект C# передает значение NULL
для одного из аргументов.

C++

// A WinRT Component DLL

namespace BoxingDemo

public ref class Class1 sealed

public:

Class1(){}

Platform::IBox<int>^ Multiply(Platform::IBox<int>^ a,
Platform::IBox<int>^ b)

if(a == nullptr || b == nullptr)

return nullptr;

else

return ref new Platform::Box<int>(a->Value * b->Value);

};

В клиенте XAML C# его можно использовать следующим образом:

// C# client code

BoxingDemo.Class1 obj = new BoxingDemo.Class1();

int? a = null;

int? b = 5;

var result = obj.Multiply(a, b); //result = null

См. также раздел


Система типов (C++/CX)

Приведение (C++/CX)

Справочник по языку C++/CX

Справочник по пространствам имен


Атрибуты (C++/CX)
Статья • 03.04.2023

Атрибут — это особый тип класса ссылок, который можно добавить в квадратные
скобки к среда выполнения Windows типам и методам для указания определенных
поведений при создании метаданных. В коде C++/CX обычно используются
несколько предопределенных атрибутов, например
Windows::Foundation::Metadata::WebHostHidden. В этом примере показано, как
атрибут применяется к классу.

C++

[Windows::Foundation::Metadata::WebHostHidden]

public ref class MyClass : Windows::UI::Xaml::DependencyObject {};

Настраиваемые атрибуты
Также можно определять настраиваемые атрибуты. Настраиваемые атрибуты
должны соответствовать следующим правилам среда выполнения Windows:

настраиваемые атрибуты могут содержать только открытые поля;

поля настраиваемого атрибута можно инициализировать при применении


атрибута к классу;

поле может относиться к одному из следующих типов:

int32 (int)

uint32 (unsigned int)

bool

Platform::String^

Windows::Foundation::HResult

Platform::Type^

public enum class (включая перечисления, определяемые пользователем).

В следующем примере показано, как определить настраиваемый атрибут, а затем


инициализировать его при использовании.
C++

[Windows::Foundation::Metadata::WebHostHiddenAttribute]

public ref class MyCustomAttribute sealed : Platform::Metadata::Attribute {

public:

int Num;

Platform::String^ Msg;

};

[MyCustomAttribute(Num=5, Msg="Hello")]

public ref class Class1 sealed

public:

Class1();

};

См. также раздел


Система типов (C++/CX)

Справочник по языку C++/CX

Справочник по пространствам имен


Перевод типов и членов в разряд
нерекомендуемых (C++/CX)
Статья • 03.04.2023

C++/CX поддерживает устаревание типов и членов среда выполнения Windows для


производителей и потребителей с помощью атрибута Deprecated . Если вы
используете API с этим атрибутом, вы получите предупреждающее сообщение во
время компиляции. Он указывает, что API не рекомендуется использовать, а также
рекомендует использовать альтернативный API. В собственных открытых типах и
methodможно применить этот атрибут и предоставить собственное
пользовательское сообщение.

U Внимание!

Атрибут Deprecated предназначен только для среда выполнения Windows


типов. Для стандартных элементов И элементов C++ classиспользуйте
[[deprecated]] (C++14 и более поздних версий) или __declspec(deprecated).

Пример
В следующем примере показано, как переводить в число нерекомендуемых
собственные открытые API, например в компоненте среды выполнения Windows.
Второй параметр типа Windows:Foundation::Metadata::DeprecationType указывает,
является ли API устаревшим или удаленным. В настоящее время поддерживается
DeprecationType::Deprecated только значение . Третий параметр в атрибуте

указывает Windows::Foundation::Metadata::Platform , к которому применяется


атрибут .

C++

namespace wfm = Windows::Foundation::Metadata;

public ref class Bicycle sealed

public:

property double Speed;

[wfm::Deprecated("Use the Speed property to compute the angular speed of


the wheel", wfm::DeprecationType::Deprecate, 0x0)]

double ComputeAngularVelocity();

};

Поддерживаемые целевые объекты


В следующей таблице перечислены недостаткиstruct, к которым Deprecated может
применяться атрибут.

class

enum

event

method

property

struct field

delegate

enum field

interface

параметризованный constructили

struct

элемент управления XAML

См. также раздел


Система типов (C++/CX)

Справочник по языку C++/CX

Справочник по пространствам имен


Построение приложений и библиотек
(C++/CX)
Статья • 03.04.2023

В разделах этого раздела содержатся некоторые сведения об использовании


системы сборки для создания универсальная платформа Windows приложения или
компонента среда выполнения Windows.

В этом разделе
Параметры компилятора и компоновщика

Статические библиотеки

библиотеки DLL

7 Примечание

Visual Studio не поддерживает оптимизацию по профилям для универсальная


платформа Windows. Попытка построить проект с этими параметрами,
заданными в среде разработки, приведет к ошибке построения. Консольные
приложения не поддерживаются.
Параметры компилятора и
компоновщика (C++/CX)
Статья • 26.09.2022

Переменная среды, параметры компилятора C++/CX и параметры компоновщика


поддерживают создание приложений для среда выполнения Windows.

Путь к библиотеке
Переменная среды %LIBPATH% определяет путь по умолчанию для поиска WINMD-
файлов.

Параметры компилятора
Параметр Описание

/ZW
Включает расширения языка среда выполнения Windows.

/ZW:nostdlib Параметр nostdlib запрещает компилятору использовать стандартный


предопределенный путь поиска сборки и WINMD-файлов.

Параметр компилятора /ZW неявно задает следующие параметры


компилятора:

- /FI vccorlib.h, который обеспечивает включение файла заголовка


vccorlib.h, определяющего множество типов, необходимых для
компилятора.

- /FU Windows.winmd, который принудительно включает файл


метаданных Windows.winmd, предоставляемый операционной
системой, и определяет множество типов в среда выполнения
Windows.

- /FU Platform.winmd, который обеспечивает включение файла


метаданных Platform.winmd, предоставляемого компилятором. Этот
файл определяет большинство типов семейства пространств имен
Platform.

/AIdir Добавляет каталог, определяемый параметром каталог , в путь


поиска, который используется компилятором для поиска файлов
сборки и WINMD-файлов.
Параметр Описание

/FUфайл Принудительно включает указанный модуль или WINMD-файл. То есть


вам не нужно указывать #using файл в исходном коде. Компилятор
автоматически обеспечивает включение вашего собственного файла
метаданных Windows Platform.winmd.

/D Создает определение, позволяющее использовать подмножество


"WINAPI_FAMILY=2" пакета SDK Win32, совместимое с среда выполнения Windows.

Параметры компоновщика
Параметр Описание

/APPCONTAINER[:NO] Помечает исполняемый файл как готовый к запуску в


контейнере appcontainer (только).

/WINMD[:{NO|ONLY}] Создает WINMD-файл и соответствующий двоичный файл.


Этот параметр должен быть передан компоновщику для
создания WINMD-файла.

NO— не создает WINMD-файл, но создает двоичный файл.

ONLY— создает WINMD-файл, но не создает двоичный файл.

/WINMDFILE:имя_файла Имя создаваемого WINMD-файла вместо имени WINMD-


файла по умолчанию. Если в командной строке указывается
несколько имен файлов, используется последнее имя.

/WINMDDELAYSIGN[:NO] Частично подписывает WINMD-файл и помещает открытый


ключ в двоичный файл.

NO— WINMD-файл не подписывается (по умолчанию).

/WINMDDELAYSIGN будет иметь результат, только если также


указан параметр /WINMDKEYFILE или /WINMDKEYCONTAINER.

/WINMDKEYCONTAINER:имя Задает контейнер ключей для подписи сборки. Параметр имя


соответствует контейнеру ключей, используемому для
подписывания файла метаданных.

/WINMDKEYFILE:имя_файла Указывает ключ или пару ключей для подписи сборки.


Параметр имя_файла соответствует ключу, используемому для
подписывания файла метаданных.

Комментарии
При использовании /ZWкомпилятор автоматически выполняет компоновку с
версией библиотеки DLL среды выполнения C (CRT). Связывание с версией
статической библиотеки запрещено, и любое использование функций CRT,
которые не разрешены в приложении универсальная платформа Windows, вызовет
ошибку времени компиляции.

См. также раздел


Построение приложений и библиотек
Статические библиотеки (C++/CX)
Статья • 03.04.2023

Статическая библиотека, используемая в приложении универсальная платформа


Windows (UWP), может содержать код C++ стандарта ISO, включая типы STL, а
также вызовы API Win32, которые не исключаются из платформы приложений
среда выполнения Windows. Статическая библиотека использует среда выполнения
Windows компоненты и может создавать среда выполнения Windows компоненты с
определенными ограничениями.

Создание статических библиотек


Инструкции по созданию проекта зависят от установленной версии Visual Studio.
Чтобы ознакомиться с документацией по предпочтительной версии Visual Studio,
используйте селектор Версия. Он находится в верхней части оглавления на этой
странице.

Создание статической библиотеки UWP в Visual Studio


1. В строке меню выберите " Файл>нового>проекта ", чтобы открыть
диалоговое окно "Создать проект ".

2. В верхней части диалогового окна задайте языкC++, установите для


платформы Windows и задайте для типа проектаUWP.

3. В отфильтрованном списке типов проектов выберите статическую


библиотеку (универсальная библиотека Windows — C++/CX), а затем
нажмите кнопку "Далее". На следующей странице присвойте проекту имя и
при необходимости укажите расположение проекта.

4. Нажмите кнопку Создать, чтобы создать проект.

При компиляции новой статической библиотеки при вызове API Win32,


исключенного для приложений UWP, компилятор вызовет ошибку C3861 "
Идентификатор не найден". Чтобы найти альтернативный метод, поддерживаемый
для среда выполнения Windows, см. статью "Альтернативы API Windows" в
приложениях UWP.

При добавлении проекта статической библиотеки C++ в решение приложения


UWP может потребоваться обновить параметры свойств проекта библиотеки,
чтобы свойство поддержки UWP было установлено на "Да". Без этого параметра
код выполняет сборку и ссылки, но при попытке проверить приложение для
Microsoft Store возникает ошибка. Статическая библиотека должна
компилироваться с теми же параметрами компилятора, что и проект, в котором
она используется.

При использовании статической библиотеки, которая создает открытые классы ref


, открытые классы интерфейсов или открытые классы значений, компоновщик
выдает следующее предупреждение:

предупреждение LNK4264: архивирование файла объектов,


скомпилированного с помощью /ZW в статическую библиотеку; Обратите
внимание, что при создании среда выполнения Windows типов не
рекомендуется связываться со статической библиотекой, содержащей среда
выполнения Windows метаданные.

Предупреждение можно игнорировать только в том случае, если статическая


библиотека не создает среда выполнения Windows компоненты, которые
используются за пределами самой библиотеки. Если библиотека не использует
компонент, который он определяет, компоновщик может оптимизировать
реализацию, даже если общедоступные метаданные содержат сведения о типе. Это
означает, что открытые компоненты в статической библиотеке будут
скомпилированы, но не активируются во время выполнения. По этой причине
любой компонент среда выполнения Windows, предназначенный для
использования другими компонентами или приложениями, должен быть
реализован в библиотеке динамической компоновки (DLL).

См. также раздел


Потоковая и маршалинг
Библиотеки DLL (C++/CX)
Статья • 03.04.2023

Visual Studio можно использовать для создания стандартной библиотеки DLL Win32
или библиотеки DLL компонентов среда выполнения Windows, которую можно
использовать в приложениях универсальная платформа Windows (UWP).
Стандартная библиотека DLL, созданная с помощью версии Visual Studio или
компилятора Microsoft C++, более ранней, чем Visual Studio 2012, может
неправильно загружаться в приложение UWP и не пройти проверку приложения в
Microsoft Store.

библиотеки DLL компонентов среда


выполнения Windows
Практически во всех случаях, когда требуется создать библиотеку DLL для
использования в приложении UWP, создайте ее как компонент среда выполнения
Windows с помощью шаблона проекта этого имени. Вы можете создать проект
компонента среда выполнения Windows для библиотек DLL с общедоступными или
частными типами среда выполнения Windows. Доступ к компоненту среда
выполнения Windows можно получить из приложений, написанных на любом
среда выполнения Windows совместимом языке. По умолчанию параметры
компилятора для проекта компонента среда выполнения Windows используют
параметр /ZW. WINMD-файл должен иметь одно имя с корневым пространством
имен. Например, экземпляр класса с именем A.B.C.MyClass может быть создан,
только если он определен в файле метаданных с именем A.winmd, A.B.winmd или
A.B.C.winmd. Имя DLL-файла не обязательно должно соответствовать имени
WINMD-файла.

Для получения дополнительной информации см. Creating Windows Runtime


Components in C++.

Ссылка на двоичный файл стороннего компонента


среда выполнения Windows в проекте
1. Откройте контекстное меню для проекта, в котором будет использоваться
библиотека DLL, и выберите пункт Свойства. На странице Общие свойства
нажмите кнопку Добавить новую ссылку .
2. Компонент среда выполнения Windows состоит из DLL-файла и WINMD-
файла, содержащего метаданные. Обычно эти файлы расположены в одной и
той же папке. В левой области диалогового окна Добавление ссылки
нажмите кнопку Обзор и перейдите к расположению DLL-файла и его
WINMD-файла. Дополнительные сведения см. в пакетах SDK для расширений.

Стандартные библиотеки DLL


Вы можете создать стандартную библиотеку DLL для кода C++, который не
использует или не создает общедоступные типы среда выполнения Windows и
использует его из приложения UWP. Используйте тип проекта библиотеки
Dynamic-Link (DLL), если вы просто хотите перенести существующую библиотеку
DLL для компиляции в этой версии Visual Studio, но не преобразуйте код в проект
компонента среда выполнения Windows. При выполнении следующих действий
библиотека DLL будет развернута вместе с исполняемым файлом приложения в
APPX-пакете.

Создание стандартной библиотеки DLL в Visual Studio


1. В строке меню выберите "Файл", "Создать", " Проект", а затем выберите
шаблон библиотеки динамической компоновки (DLL ).

2. Введите имя проекта и нажмите кнопку ОК .

3. Добавьте код. Не забудьте добавить выражение __declspec(dllexport) для


функций, которые планируется экспортировать, например
__declspec(dllexport) Add(int I, in j);

4. Добавьте #include winapifamily.h этот файл заголовка из windows SDK для


приложений UWP и задайте макрос WINAPI_FAMILY=WINAPI_PARTITION_APP .

Указание ссылки на проект стандартной библиотеки


DLL из того же решения
1. Откройте контекстное меню для проекта, в котором будет использоваться
библиотека DLL, и выберите пункт Свойства. На странице Общие свойства
нажмите кнопку Добавить новую ссылку .

2. В левой области выберите Решениеи установите соответствующий флажок в


правой области.
3. В файлах исходного кода добавьте оператор #include для файла заголовков
библиотеки DLL.

Указание ссылки на двоичный файл стандартной


библиотеки DLL
1. Скопируйте DLL-файл, LIB-файл и файл заголовка и вставьте их в известное
расположение, например в папку текущего проекта.

2. Откройте контекстное меню для проекта, в котором будет использоваться


библиотека DLL, и выберите пункт Свойства. На странице Свойства
конфигурации> Компоновщик> Ввод добавьте LIB-файл в качестве
зависимости.

3. В файлах исходного кода добавьте оператор #include для файла заголовков


библиотеки DLL.

Перенос существующей библиотеки DLL Win32 для


совместимости приложений UWP
1. Создайте проект типа DLL (универсальной версии Windows) и добавьте в него
существующий исходный код.

2. Добавьте #include winapifamily.h этот файл заголовка из windows SDK для


приложений UWP и задайте макрос WINAPI_FAMILY=WINAPI_PARTITION_APP .

3. В файлах исходного кода добавьте оператор #include для файла заголовков


библиотеки DLL.
Взаимодействие с другими языками
(C++/CX)
Статья • 03.04.2023

В этой части документации описывается использование C++/CX для создания


среда выполнения Windows компонентов, которые могут использоваться другими
языками и библиотеками программирования. Можно также создавать компоненты,
которые могут использоваться не всеми языками. В этом разделе описываются
различные аспекты, которые следует учитывать при взаимодействии приложения
C++/CX с компонентами, написанными с помощью JavaScript, платформа .NET
Framework управляемого языка или библиотеки шаблонов среда выполнения
Windows C++.

Связанные темы
Интеграция с JavaScript

Интеграция со средой CLR

Интеграция с WRL

Справочник по языку C++/CX


Интеграция с JavaScript (C++/CX)
Статья • 03.04.2023

Для получения дополнительной информации см. Creating Windows Runtime


Components in C++.

См. также раздел


Взаимодействие с другими языками
Интеграция со средой CLR (C++/CX)
Статья • 03.04.2023

Некоторые среда выполнения Windows типы получают специальную обработку в


C++/CX и языках, основанных на среде CLR. В этой статье рассматривается
сопоставление определенных типов в одном языке с другим языком. Например,
среда CLR сопоставляет Windows.Foundation.IVector с System.Collections.IList,
Windows.Foundation.IMap с System.Collections.IDictionary и т. д. Аналогичным
образом C++/CX специально сопоставляет такие типы, как Platform::D elegate и
Platform::String.

Сопоставление среда выполнения Windows с


C++/CX
Когда C++/CX считывает файл метаданных Windows (WINMD), компилятор
автоматически сопоставляет распространенные среда выполнения Windows
пространства имен и типы с пространствами имен и типами C++/CX. Например,
числовой тип UInt32 среда выполнения Windows автоматически сопоставляется с
default::uint32 .

C++/CX сопоставляет несколько других типов среда выполнения Windows с


пространством имен Platform. Например, дескриптор Windows::Foundation
HSTRING, представляющий текстовую строку Юникода только для чтения,
сопоставляется с классом C++/CX Platform::String . Когда операция среда
выполнения Windows возвращает ошибку HRESULT, она сопоставляется с C++/CX
Platform::Exception .

C++/CX также сопоставляет определенные типы в среда выполнения Windows


пространствах имен для улучшения функциональности типа. Для этих типов
C++/CX предоставляет вспомогательные конструкторы и методы, относящиеся к
C++ и недоступные в стандартном WINMD-файле типа.

В следующих списках приведены структуры значений, поддерживающие новые


конструкторы и вспомогательные методы. Если ранее вы написали код,
использующий списки инициализации структуры, измените его, чтобы применить
новые конструкторы.

Windows::Foundation

Точка
Rect

Размер

Windows::UI

Цвет

Windows::UI::Xaml

CornerRadius

Duration

GridLength

Thickness

Windows::UI::Xaml::Interop

TypeName

Windows::UI::Xaml::Media

Матрица

Windows::UI::Xaml::Media::Animation

KeyTime

RepeatBehavior

Windows::UI::Xaml::Media::Media3D

Matrix3D

Сопоставление среды CLR с C++/CX


Когда компиляторы Microsoft C++ или C# считывают WINMD-файл, они
автоматически сопоставляют определенные типы в файле метаданных с
соответствующими типами C++/CX или CLR. Например, в среде CLR интерфейс
IVector<T> сопоставляется с IList<T>. Но в C++/CX интерфейс IVector<T> не
сопоставляется с другим типом.

IReference<T> в среда выполнения Windows сопоставляется с T, допускаемым


значением>< NULL в .NET.
См. также раздел
Взаимодействие с другими языками
Интеграция с WRL (C++/CX)
Статья • 03.04.2023

Вы можете свободно смешивать код WRL с среда выполнения Windows кода


библиотеки шаблонов C++ (WRL). В той же единице преобразования можно
использовать объекты, объявленные с нотацией WRL handle-to-object ( ^ ) и смарт-
указателем WRL ( ComPtr<T> ). Однако необходимо вручную обрабатывать
возвращаемые значения, коды ошибок HRESULT WRL и исключения WRL.

Разработка WRL
Дополнительные сведения о создании и использовании компонентов WRL см. в
статье среда выполнения Windows библиотеке шаблонов C++ (WRL).

Пример
В следующем фрагменте кода демонстрируется использование WRL и WRL для
использования среда выполнения Windows классов и проверки файла метаданных.

Пример взят из фрагмента кода на форуме По созданию приложений Microsoft


Store. Автор этого фрагмента кода приводит следующие замечания и оговорки:

1. C++ не предоставляет определенные API для отражения среда выполнения


Windows типов, но файлы метаданных Windows (WINMD) для типа полностью
совместимы с файлами метаданных CLR. Windows предоставляет новые API
обнаружения метаданных (RoGetMetaDataFile), позволяющие получить
WINMD-файл для указанного типа. Однако возможности применения этих API
при разработке в C++ ограничены, поскольку пользователь не может создать
экземпляр класса.

2. После компиляции кода необходимо передать файлы Runtimeobject.lib и


Rometadata.lib компоновщику.

3. Этот фрагмент предоставляется на условиях "как есть". В принципе он должен


работать правильно, однако возможность ошибок не исключена.

C++

#include <hstring.h>

#include <cor.h>

#include <rometadata.h>
#include <rometadataresolution.h>

#include <collection.h>

namespace ABI_Isolation_Workaround {

#include <inspectable.h>

#include <WeakReference.h>

using namespace ABI_Isolation_Workaround;

#include <wrl/client.h>

using namespace Microsoft::WRL;

using namespace Windows::Foundation::Collections;

IVector<String^>^ GetTypeMethods(Object^);

MainPage::MainPage()

InitializeComponent();

Windows::Foundation::Uri^ uri = ref new


Windows::Foundation::Uri("http://buildwindows.com/");

auto methods = GetTypeMethods(uri);

std::wstring strMethods;

std::for_each(begin(methods), end(methods), [&strMethods](String^


methodName) {

strMethods += methodName->Data();

strMethods += L"\n";

});

wprintf_s(L"%s\n", strMethods.c_str());

IVector<String^>^ GetTypeMethods(Object^ instance)

HRESULT hr;

HSTRING hStringClassName;

hr = instance-
>__cli_GetRuntimeClassName(reinterpret_cast<__cli_HSTRING__**>
(&hStringClassName)); // internal method name subject to change post BUILD

if (FAILED(hr))

__cli_WinRTThrowError(hr); // internal method name subject to change


post BUILD

String^ className = reinterpret_cast<String^>(hStringClassName);

ComPtr<IMetaDataDispenserEx> metadataDispenser; ComPtr<IMetaDataImport2>


metadataImport; hr = MetaDataGetDispenser(CLSID_CorMetaDataDispenser,
IID_IMetaDataDispenser, (LPVOID*)metadataDispenser.GetAddressOf());

if (FAILED(hr))

__cli_WinRTThrowError(hr); // internal method name subject to change


post BUILD

HSTRING hStringFileName;

mdTypeDef typeDefToken;

hr = RoGetMetaDataFile(hStringClassName, metadataDispenser.Get(),
&hStringFileName, &metadataImport, &typeDefToken);

if (FAILED(hr))

__cli_WinRTThrowError(hr); // internal method name subject to change


post BUILD

String^ fileName = reinterpret_cast<String^>(hStringFileName);

HCORENUM hCorEnum = 0;

mdMethodDef methodDefs[2048];

ULONG countMethodDefs = sizeof(methodDefs);

hr = metadataImport->EnumMethods(&hCorEnum, typeDefToken, methodDefs,


countMethodDefs, &countMethodDefs);

if (FAILED(hr))

__cli_WinRTThrowError(hr); // internal method name subject to change


post BUILD

wchar_t methodName[1024];

ULONG countMethodName;

std::wstring strMethods;

Vector<String^>^ retVal = ref new Vector<String^>();

for (int i = 0; i < countMethodDefs; ++i)

countMethodName = sizeof(methodName);

hr = metadataImport->GetMethodProps(methodDefs[i], nullptr,
methodName, countMethodName, &countMethodName, nullptr, nullptr, nullptr,
nullptr, nullptr);

if (SUCCEEDED(hr))

methodName[ countMethodName ] = 0;

retVal->Append(ref new String(methodName));

return retVal;

См. также раздел


Взаимодействие с другими языками
Получение указателей на буферы
данных (C++/CX)
Статья • 03.04.2023

В среде выполнения Windows интерфейс Windows::Storage::Streams::IBuffer


предоставляет не зависящий от языка и основанный на потоках механизм доступа
к буферам данных. В C++ можно получить необработанный указатель на базовый
массив байтов с помощью интерфейса IBufferByteAccess библиотеки среды
выполнения Windows, определенный в файле robuffer.h. Благодаря такому подходу
можно изменить массив байтов на месте без создания лишний копий данных.

На следующей схеме показан элемент изображения XAML, источником которого


является Windows::UI::Xaml::Media::Imaging WriteableBitmap. Клиентские
приложения, написанные на любом языке, могут передавать ссылку на
WriteableBitmap в код C++, а затем код C++ может использовать эту ссылку для

обращения к соответствующему буферу. В универсальная платформа Windows


приложении, написанном на C++, функцию в следующем примере можно
использовать непосредственно в исходном коде, не упаковывая ее в компонент
среда выполнения Windows.

GetPointerToPixelData
Следующий метод принимает Windows::Storage::Streams::IBuffer и возвращает
необработанный указатель на соответствующий массив байтов. Чтобы вызвать
функцию, передайте свойство WriteableBitmap::PixelBuffer .

C++

#include <wrl.h>

#include <robuffer.h>

using namespace Windows::Storage::Streams;

using namespace Microsoft::WRL;

typedef uint8 byte;

// Retrieves the raw pixel data from the provided IBuffer object.

// Warning: The lifetime of the returned buffer is controlled by

// the lifetime of the buffer object that's passed to this method.

// When the buffer has been released, the pointer becomes invalid

// and must not be used.

byte* Class1::GetPointerToPixelData(IBuffer^ pixelBuffer, unsigned int


*length)

if (length != nullptr)

*length = pixelBuffer ->Length;

// Query the IBufferByteAccess interface.

ComPtr<IBufferByteAccess> bufferByteAccess;

reinterpret_cast<IInspectable*>( pixelBuffer)-
>QueryInterface(IID_PPV_ARGS(&bufferByteAccess));

// Retrieve the buffer data.

byte* pixels = nullptr;

bufferByteAccess->Buffer(&pixels);

return pixels;

Полный пример
Ниже показано, как создать приложение универсальная платформа Windows C#,
которое передает в WriteableBitmap библиотеку DLL компонента C++ среда
выполнения Windows. Код C++ получает указатель на буфер пикселя,
выполняющий простое изменение изображения на месте. В качестве альтернативы
можно создать клиентское приложение на языке Visual Basic, JavaScript или C++, а
не на C#. При использовании C++ нет необходимости в компоненте DLL; можно
просто добавить эти методы непосредственно в класс MainPage или в какие-либо
другие классы.

Создание клиента
1. Используйте шаблон проекта пустого приложения для создания приложения
универсальная платформа Windows C#.

2. В файле MainPage.xaml

Используйте это XAML-файл, чтобы заменить элемент Grid :

XML
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">

<StackPanel HorizontalAlignment="Left" Margin="176,110,0,0"


VerticalAlignment="Top" Width="932">

<Image x:Name="Pic"/>

<Button Content="Process Image"


HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Height="47" Click="Button_Click_1"/>

</StackPanel>

</Grid>

3. В файле MainPage.xaml.cs

a. Добавьте следующие объявления пространств имен:

C#

using Windows.Storage;

using Windows.Storage.FileProperties;

using Windows.UI.Xaml.Media.Imaging;

using Windows.Storage.Streams;

using Windows.Storage.Pickers;

b. Добавьте переменную-член WriteableBitmap в класс MainPage и присвойте


ей имя m_bm .

C#

private WriteableBitmap m_bm;

c. С помощью следующего кода замените заглушку метода OnNavigatedTo . В


результате при запуске приложения будет открываться средство выбора
файлов. (Обратите внимание, что в сигнатуру функции добавляется
ключевое слово async ).

C#

async protected override void OnNavigatedTo(NavigationEventArgs e)

FileOpenPicker openPicker = new FileOpenPicker();

openPicker.ViewMode = PickerViewMode.Thumbnail;

openPicker.SuggestedStartLocation =
PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".jpg");

openPicker.FileTypeFilter.Add(".jpeg");

openPicker.FileTypeFilter.Add(".png");

StorageFile file = await openPicker.PickSingleFileAsync();

if (file != null)

// Get the size of the image for the WriteableBitmap


constructor.

ImageProperties props = await


file.Properties.GetImagePropertiesAsync();

m_bm = new WriteableBitmap((int)props.Height,


(int)props.Width);

m_bm.SetSource(await file.OpenReadAsync());

Pic.Source = m_bm;

else

// Handle error...

d. Добавьте обработчик событий для нажатия кнопки. (Так как ссылка на


пространство имен ImageManipCPP еще не создана, он может быть
подчеркнут волнистой линией в окне редактора).

C#

async private void Button_Click_1(object sender, RoutedEventArgs e)

ImageManipCPP.Class1 obj = new ImageManipCPP.Class1();

await obj.Negativize(m_bm);

Pic.Source = m_bm;

Создание компонента C++

1. Добавьте новый компонент среда выполнения Windows C++ в существующее


решение и назовите его ImageManipCPP . Добавьте ссылку на него в проект C#,
щелкнув этот проект правой кнопкой мыши в Обозревателе решений и
выбрав Добавить, Ссылка.

2. В файле Class1.h

a. Добавьте определение typedef во вторую строку сразу после #pragma once .

C++

typedef uint8 byte;

b. Добавьте атрибут WebHostHidden перед началом объявления Class1 .


C++

[Windows::Foundation::Metadata::WebHostHidden]

c. Добавьте следующую сигнатуру открытого метода в Class1 :

C++

Windows::Foundation::IAsyncAction^
Negativize(Windows::UI::Xaml::Media::Imaging::WriteableBitmap^ bm);

d. Добавьте сигнатуру из метода GetPointerToPixelData , показанного в


предыдущем фрагменте кода. Убедитесь, что этот метод является закрытым.

3. В файле Class1.cpp

a. Добавьте следующие директивы #include и объявления пространств имен:

C++

#include <ppltasks.h>

#include <wrl.h>

#include <robuffer.h>

using namespace Windows::Storage;

using namespace Windows::UI::Xaml::Media::Imaging;

using namespace Windows::Storage::Streams;

using namespace Microsoft::WRL;

b. Добавьте реализацию GetPointerToPixelData из расположенного выше


фрагмента кода.

c. Добавьте реализацию Negativize . Этот метод создает эффект, похожий на


фотонегатив, инвертируя каждое RGB-значение пикселя. Этот метод сделан
асинхронным, поскольку на больших изображениях его выполнение может
занять много времени.

C++

IAsyncAction^ Class1::Negativize(WriteableBitmap^ bm)

unsigned int length;

byte* sourcePixels = GetPointerToPixelData(bm->PixelBuffer,


&length);

const unsigned int width = bm->PixelWidth;

const unsigned int height = bm->PixelHeight;

return create_async([this, width, height, sourcePixels]

byte* temp = sourcePixels;

for(unsigned int k = 0; k < height; k++)

for (unsigned int i = 0; i < (width * 4); i += 4)

int pos = k * (width * 4) + (i);

temp[pos] = ~temp[pos];

temp[pos + 1] = ~temp[pos + 1] / 3;

temp[pos + 2] = ~temp[pos + 2] / 2;

temp[pos + 3] = ~temp[pos + 3];

});

7 Примечание

Этот метод может выполняться быстрее, если для параллелизации


операции используется AMP или библиотека параллельных шаблонов.

4. Убедитесь, что в папке рисунков есть по крайней мере одно изображение, а


затем нажмите клавишу F5, чтобы компилировать и выполнить программу.
Работа с потоками и маршалинг
(C++/CX)
Статья • 03.04.2023

В большинстве случаев доступ к экземплярам классов среда выполнения Windows,


таких как стандартные объекты C++, можно получить из любого потока. Такие
классы называются "гибкими". Однако небольшое количество классов среда
выполнения Windows, которые поставляются с Windows, не являются гибкими и
должны использоваться больше, чем com-объекты, чем стандартные объекты C++.
Для работы с негибкими классами не нужно быть специалистом по COM, однако
нужно учитывать модель потоков классов и их механизмы маршалинга. В этой
статье приведены общие сведения и инструкции по реализации редких сценариев,
в которых приходится использовать экземпляры негибких классов.

Модель потоков и механизмы маршалинга


Класс среда выполнения Windows может поддерживать одновременный доступ к
потокам различными способами, как указано двумя атрибутами, которые
применяются к нему:

Атрибут ThreadingModel может иметь одно из следующих значений: STA, MTA


или Both, которые определены в перечислении ThreadingModel .

Атрибут MarshallingBehavior может иметь одно из следующих значений: Agile,


None или Standard, которые определены в перечислении MarshallingType .

Атрибут ThreadingModel определяет, где загружается класс при активации: только в


контексте потока пользовательского интерфейса (STA), только в контексте
фонового потока (MTA) или в контексте потока, создающего объект (Both).
MarshallingBehavior Значения атрибутов ссылаются на поведение объекта в
различных контекстах потоков. В большинстве случаев эти значения не нужно
понимать подробно. Среди классов, предоставляемых API Windows, около 90
процентов имеют значения атрибутов ThreadingModel =Both и
MarshallingType =Agile. Это означает, что они могут обрабатывать низкоуровневые

сведения потоков прозрачно и эффективно. Если создать гибкий класс с помощью


ключевого слова ref new , его методы можно из основного потока приложения
или из одного или нескольких рабочих потоков. Иначе говоря, гибкий класс можно
использовать из любого места в коде, независимо от того, предоставляется ли он
Windows или сторонними разработчиками. Вам не нужно беспокоиться о
потоковой модели класса или поведении маршалинга.

Использование компонентов среда


выполнения Windows
При создании приложения универсальная платформа Windows вы можете
взаимодействовать как с гибкими, так и с негибкими компонентами. При работе с
негибкими компонентами может возникнуть следующее предупреждение.

Предупреждение компилятора C4451 при


использовании негибких классов
По различным причинам некоторые классы не могут быть гибкими. Если вы
обращаетесь к экземплярам негибких классов и из потока пользовательского
интерфейса, и из фонового потока, необходимо уделить особое внимание тому,
чтобы обеспечить правильное поведение во время выполнения. Компилятор
Microsoft C++ выдает предупреждения при создании экземпляра негибкого класса
среды выполнения в приложении в глобальной области или объявлении негибкого
типа в качестве члена класса в классе ссылок, который сам помечается как гибкий.

Из негибких классов проще всего работать с теми, у которых ThreadingModel =Both


и MarshallingType =Standard. Эти классы можно сделать гибкими с помощью
вспомогательного класса Agile<T> . В следующем примере показано объявление
негибкого объекта типа
Windows::Security::Credentials::UI::CredentialPickerOptions^ и результирующее

предупреждение компилятора.

ref class MyOptions

public:

property
Windows::Security::Credentials::UI::CredentialPickerOptions^ Options

Windows::Security::Credentials::UI::CredentialPickerOptions^
get()

return _myOptions;

private:

Windows::Security::Credentials::UI::CredentialPickerOptions^
_myOptions;

};

Выдается следующее предупреждение:

Warning 1 warning C4451: 'Platform::Agile<T>::_object' : Usage of ref class


'Windows::Security::Credentials::UI::CredentialPickerOptions' inside this

context can lead to invalid marshaling of object across contexts. Consider

using
'Platform::Agile<Windows::Security::Credentials::UI::CredentialPickerOptions>'

instead

При добавлении ссылки (в области членов или глобальной области) на объект,


имеющий поведение маршалинга "Standard", компилятор выдает предупреждение,
рекомендующее заключить этот тип в оболочку Platform::Agile<T> : Consider using
'Platform::Agile<Windows::Security::Credentials::UI::CredentialPickerOptions>'

instead Если воспользоваться типом Agile<T> , класс можно будет использовать как
любой другой гибкий класс. Используйте Platform::Agile<T> в следующих
ситуациях:

Негибкая переменная объявляется в глобальной области.

Негибкая переменная объявляется в области класса, и существует


возможность того, что код использует указатель в другом подразделении без
надлежащего маршалинга.

Если ни одно из этих условий не выполняется, можно пометить содержащий класс


как негибкий. Другими словами, следует напрямую хранить негибкие объекты
только в негибких классах и хранить негибкие объекты с помощью
Platform::Agile<T> в гибких классах.

В следующем примере показано, как благодаря Agile<T> можно пропустить это


предупреждение без последствий.

#include <agile.h>

ref class MyOptions

public:

property
Windows::Security::Credentials::UI::CredentialPickerOptions^ Options

Windows::Security::Credentials::UI::CredentialPickerOptions^
get()

return m_myOptions.Get();

private:

Platform::Agile<Windows::Security::Credentials::UI::CredentialPickerOptions^
> m_myOptions;

};

Обратите внимание, что Agile нельзя передавать в качестве возвращаемого


значения или параметра в классе ссылки. Метод Agile<T>::Get() возвращает
дескриптор объекта (^), который можно передать через границу интерфейса ABI в
открытом методе или свойстве.

При создании ссылки на встроенный класс среда выполнения Windows с


маршалингом none компилятор выдает предупреждение C4451, но не рекомендует
использовать Platform::Agile<T> . Компилятор не может ничем помочь помимо
этого предупреждения, поэтому вам необходимо самостоятельно обеспечить
надлежащую работу класса и убедиться, что код вызывает компоненты
однопотокового подразделения (STA) только из потока пользовательского
интерфейса, а компоненты многопотокового подразделения (MTA) — только из
фонового потока.

Разработка компонентов гибкой среда


выполнения Windows
При определении класса ссылок в C++/CX она гибка по умолчанию, то есть имеет
ThreadingModel значение =Оба и MarshallingType =Agile. Если вы используете

библиотеку шаблонов среда выполнения Windows C++, вы можете сделать класс


гибким, наследуя от FtmBase этого FreeThreadedMarshaller . Создавая класс с
атрибутами ThreadingModel =Both или ThreadingModel =MTA, убедитесь, что он
является потокобезопасным.

Потоковую модель и поведение маршалинга класса ссылки можно изменять.


Однако если внести изменения, которые делают класс негибким, необходимо четко
понимать их последствия.
В следующем примере показано, как применить MarshalingBehavior и
ThreadingModel атрибуты к классу среды выполнения в библиотеке классов среда
выполнения Windows. Если приложение использует библиотеку DLL и в нем
активируется объект класса ref new с помощью ключевого слова MySTAClass , этот
объект активируется в однопотоковом подразделении и не поддерживает
маршалинг.

using namespace Windows::Foundation::Metadata;

using namespace Platform;

[Threading(ThreadingModel::STA)]

[MarshalingBehavior(MarshalingType::None)]

public ref class MySTAClass

};

Незапечатанный класс должен иметь атрибуты маршалинга и потоковой модели,


чтобы компилятор мог проверить, что производные классы имеют такие же
значения этих атрибутов. Если эти параметры не заданы для класса явным образом,
компилятор выдает ошибку и не выполняет компиляцию. Любой класс,
производный от незапечатанного класса, выдает ошибку компилятора в каждом из
следующих случаев:

Атрибуты ThreadingModel и MarshallingBehavior не определены в производном


классе.

Значения атрибутов ThreadingModel и MarshallingBehavior в производном


классе не соответствуют аналогичным атрибутам базового класса.

Сведения о потоках и маршалинге, необходимые стороннему компоненту среда


выполнения Windows, указываются в сведениях о регистрации манифеста
приложения для компонента. Рекомендуется сделать все компоненты среда
выполнения Windows гибкими. Это гарантирует, что клиентский код сможет
вызывать компонент из любого потока приложения, и улучшает
производительность таких вызовов, поскольку они являются прямыми вызовами
без маршалирования. Если создать класс таким образом, клиентскому коду не
придется применять Platform::Agile<T> , чтобы использовать этот класс.

См. также раздел


ThreadingModel

MarshallingBehavior
Слабые ссылки и устранение циклов
(C++/CX)
Статья • 07.11.2022

В любой системе типов, которая основана на подсчете ссылок, ссылки на типы


могут сформировать циклы, т. е. может возникнуть ситуация, когда один объект
ссылается на второй объект, второй объект ссылается на третий объект, и так далее
до тех пор, пока некоторый последний объект не будет ссылаться на первый
объект. В цикле объекты невозможно правильно удалить, если количество ссылок
одного из объектов становится равным нулю. Чтобы помочь решить эту проблему,
C++/CX предоставляет класс Platform::WeakReference Class . Объект WeakReference
поддерживает метод Resolve , который возвращает значение NULL, если объект
больше не существует, или исключение Platform::InvalidCastException , если объект
существует, но его тип отличается от T .

Одна из ситуаций, в которой следует использовать WeakReference , — когда


указатель this перехватывается в лямбда-выражении, используемом для
определения обработчика событий. Рекомендуется использовать при определении
обработчиков событий именованные методы, но если необходимо использовать
для обработчика событий лямбда-выражения или если необходимо нарушить цикл
подсчета ссылок, используйте класс WeakReference . Ниже приведен пример:

using namespace Platform::Details;

using namespace Windows::UI::Xaml;

using namespace Windows::UI::Xaml::Input;

using namespace Windows::UI::Xaml::Controls;

Class1::Class1()

// Class1 has a reference to m_Page

m_Page = ref new Page();

// m_Page will have a reference to this Class1

// so create a weak reference to this

WeakReference wr(this);

m_Page->DoubleTapped += ref new DoubleTappedEventHandler(

[wr](Object^ sender, DoubleTappedRoutedEventArgs^ args)

// Use the weak reference to get the object

Class1^ c = wr.Resolve<Class1>();

if (c != nullptr)

c->m_eventFired = true;

else

// Inform the event that this handler should be removed

// from the subscriber list

throw ref new DisconnectedException();

});

Когда обработчик событий создает исключение DisconnectedException , событие


удаляет обработчик из списка подписчиков.
Справочник по пространствам имен
(C++/CX)
Статья • 03.04.2023

В статьях в этом разделе документации описываются пространства имен,


поддерживающие компилятор для C++/CX.

Пространства имен, предоставляемые


компилятором
Чтобы упростить написание кода программ, предназначенных для среда
выполнения Windows, компилятор C++/CX и его вспомогательные файлы
заголовков предоставляют пространства имен, определяющие широкий спектр
типов. Пространства имен определяют встроенные числовые типы; строки,
массивы и коллекции; Исключения C++, представляющие среда выполнения
Windows ошибки, а также улучшения для конкретных языков в стандартных типах
среда выполнения Windows.

См. также
Заголовок Описание

пространство имен по Содержит описания встроенных основных типов.


умолчанию

Пространство имен Platform Содержит описания типов, которые можно использовать,


а также внутренних типов, которые используются только
инфраструктурой компилятора.

Пространство имен Содержит описания улучшений и расширений


Windows::Foundation::Collections пространства имен среда выполнения
Windows Windows::Foundation::Collections .

См. также раздел


Справочник по языку C++/CX
Пространство имен default
Статья • 03.04.2023

Пространство default имен определяет встроенные типы, поддерживаемые


C++/CX.

Синтаксис

namespace default;

Члены
Все встроенные типы наследуют следующие члены.

Имя Описание

default::(имя_типа)::Equals Определяет, равен ли указанный объект текущему


объекту.

default:: Возвращает хэш-код данного экземпляра.


(имя_типа)::GetHashCode

default::(имя_типа)::GetType Возвращает строку, которая представляет текущий тип.

default::(имя_типа)::ToString Возвращает строку, которая представляет текущий тип.

Встроенные типы

Имя Описание

char16 16-битовое нечисловое значение, представляющее кодовую точку Юникода (UTF-


16).

float32 32-битовое число с плавающей запятой стандарта IEEE 754.

float64 64-битовое число с плавающей запятой стандарта IEEE 754.

int16 16-разрядное знаковое целое число.

int32 32-разрядное знаковое целое число.


Имя Описание

int64 64-разрядное целое число со знаком.

int8 8-разрядное числовое значение со знаком.

uint16 16-разрядное целое число без знака.

uint32 32-разрядное целое число без знака.

uint64 64-разрядное целое число без знака.

uint8 8-разрядное числовое значение без знака.

Требования
Заголовок: vccorlib.h

См. также раздел


Справочник по языку C++/CX
Метод default::(type_name)::Equals
Статья • 03.04.2023

Определяет, равен ли указанный объект текущему объекту.

Синтаксис
C++

bool Equals(

Object^ obj

Параметры
obj

Объект для сравнения.

Возвращаемое значение
Значение true , если объекты равны; в противном случае — значение false .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: по умолчанию

Заголовок: vccorlib.h

См. также раздел


пространство имен по умолчанию
Метод default::
(имя_типа)::GetHashCode
Статья • 03.04.2023

Возвращает хэш-код данного экземпляра.

Синтаксис
C++

public:int GetHashCode();

Возвращаемое значение
Хэш-код данного экземпляра.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: по умолчанию

Заголовок: vccorlib.h

См. также раздел


пространство имен по умолчанию
Метод default::(type_name)::GetType
Статья • 03.04.2023

Возвращает объект Platform::Type^, которая представляет текущий тип.

Синтаксис
C++

Platform::Type^ GetType();

Возвращаемое значение
Объект Platform::Type^, представляющий текущий объект.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: по умолчанию

Заголовок: vccorlib.h

См. также раздел


пространство имен по умолчанию
Метод default::(имя_типа)::ToString
Статья • 03.04.2023

Возвращает строку, которая представляет текущий тип.

Синтаксис
C++

String^ ToString();

Возвращаемое значение
Строка, представляющая текущий объект.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: по умолчанию

Заголовок: vccorlib.h

См. также раздел


пространство имен по умолчанию
Пространство имен Platform (C++/CX)
Статья • 03.04.2023

Содержит встроенные типы, совместимые со средой выполнения Windows.

Синтаксис
C++

using namespace Platform;

Члены
Атрибуты

Пространство имен Platform содержит атрибуты, классы, перечисления,


интерфейсы и структуры. Platform также содержит вложенные пространства имен.

attribute Описание

Флаги Указывает, что перечисление может обрабатываться как битовое поле (т. е.
набор флагов).

MTAThread Указывает, что потоковая модель для приложения является многопотоковым


подразделением (MTA).

STAThread Указывает, что потоковая модель для приложения является однопотоковым


подразделением (STA).

Классы

Пространство имен Platform содержит следующие классы.

Класс Описание

Класс Возникает при запрете доступа к ресурсу или


Platform::AccessDeniedException функции.

Класс Platform::Agile Представляет объект, отличный от Agile, как объект


Agile.

Класс Platform::Array Представляет одномерный изменяемый массив.


Класс Описание

Класс Platform::ArrayReference Представляет массив, инициализация которого


оптимизирована, чтобы свести к минимуму число
операций копирования.

Класс Platform::Box Используется для объявления упакованного типа,


который инкапсулирует тип значений, например
Windows::Foundation::DateTime или int64, когда этот
тип передается через двоичный интерфейс
приложения (ABI) или сохраняется в переменной
типа Platform::Object^.

Класс Возникает, если метод итератора коллекции или


Platform::ChangedStateException представления коллекции вызван после изменения
родительской коллекции, что делает результаты
метода недействительными.

Класс Возникает, если COM-класс не зарегистрирован.


Platform::ClassNotRegisteredException

Класс Platform::COMException Представляет исключение, создаваемое при


возвращении нераспознанного значения после
вызова метода COM.

Класс Platform::D elegate Представляет сигнатуру функции обратного вызова.

Класс Platform::D Объект отключен от своих клиентов.


isconnectedException

Класс Platform::Exception Представляет ошибки, которые происходят во время


выполнения приложения. Базовый класс для
исключений.

Класс Platform::FailureException Вызывается, если операция вызвала сбой.


Эквивалентно E_FAIL HRESULT.

Класс значения Platform::Guid Представляет идентификатор GUID в системе типов


среды выполнения Windows.

Класс Вызывается, если один из передаваемых методу


Platform::InvalidArgumentException аргументов является недопустимым.

Класс Platform::InvalidCastException Возникает в случаях недопустимого приведения или


явного преобразования.

Класс Platform::MTAThreadAttribute Указывает, что потоковая модель для приложения


является многопотоковым подразделением (MTA).

Класс Возникает, если метод интерфейса не реализован в


Platform::NotImplementedException классе.
Класс Описание

Класс Возникает при попытке разыменовать ссылку на


Platform::NullReferenceException объект NULL.

Класс Platform::Object Базовый класс, который обеспечивает общее


поведение.

Класс Вызывается при выполнении операции над


Platform::ObjectDisposedException ликвидированным объектом.

Класс Возникает при отмене операции.


Platform::OperationCanceledException

Класс Возникает, когда операция пытается получить доступ


Platform::OutOfBoundsException к данным за пределами допустимого диапазона.

Класс Возникает, если недостаточно памяти для


Platform::OutOfMemoryException выполнения операции.

Класс Platform::STAThreadAttribute Указывает, что потоковая модель для приложения


является однопотоковым подразделением (STA).

Класс Platform::String Упорядоченная коллекция символов Юникода,


используемая для представления текста.

Класс Platform::StringReference Обеспечивает доступ к буферам строк с


минимальной нагрузкой копирования.

Класс Platform::Type Указывает встроенный тип посредством


перечисления категорий.

Класс Platform::ValueType Базовый класс для экземпляров типов значений.

Класс Platform::WeakReference Предоставляет гибкую ссылку на объекты


ссылочного класса, которая не увеличивает число
ссылок.

Класс Platform::WriteOnlyArray Представляет доступный только для записи


одномерный массив, используемый в качестве
входного параметра в методах, реализующих шаблон
FillArray.

Класс Вызывается, если поток выполняет вызов


Platform::WrongThreadException посредством указателя на интерфейс для прокси-
объекта, который не принадлежит к подразделению
потока.

Реализации интерфейса

Пространство имен Platform определяет следующие интерфейсы.


Интерфейс Описание

Интерфейс Используется для передачи типов значений в функции, параметры


Platform::IBox которых имеют тип Platform::Object^.

Интерфейс Интерфейс, используемый для передачи массивов типов значений в


Platform::IBoxArray функции, параметры которых имеют тип Platform::Array.

Интерфейс Используется для освобождения неуправляемых ресурсов.


Platform::IDisposable

Перечисления

Пространство имен Platform содержит следующие перечисления.

Интерфейс Описание

Перечисление Перечисление, используемое в качестве параметра конструктора


Platform::CallbackContext делегата. Определяет, следует ли маршалировать обратный вызов
в исходный поток или в поток вызывающего объекта.

Перечисление Указывает категорию чисел, представляющую встроенный тип.


Platform::TypeCode

Структуры

Пространство имен Platform содержит следующие структуры.

Структура Описание

Класс Platform::Enum Представляет константу с именем.

Класс значения Представляет идентификатор GUID.


Platform::Guid

Класс значения Указатель со знаком, размер которого соответствует платформе (32-


Platform::IntPtr разрядной или 64-разрядной).

Класс значения Тип данных без знака, используемый для представления размера
Platform::SizeT объекта.

Класс значений Указатель без знака, размер которого соответствует платформе (32-
Platform::UIntPtr разрядной или 64-разрядной).

См. также раздел


Пространство имен Platform::Collections

Пространство имен Platform::Runtime::CompilerServices

Пространство имен Platform::Runtime::InteropServices

Пространство имен Platform::Metadata


Класс Platform::AccessDeniedException
Статья • 03.04.2023

Возникает при запрете доступа к ресурсу или функции.

Синтаксис
C++

public ref class AccessDeniedException : COMException, IException,


IPrintable, IEquatable

Remarks
Если возникло это исключение, проверьте, что вы запросили соответствующую
возможность и указали необходимые объявления в манифесте пакета приложения.
Дополнительные сведения см. в статье COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс Platform::Agile
Статья • 03.04.2023

Представляет объект, имеющий MashalingBehavior = Standard, как объект Agile,


который значительно снижает вероятность возникновения в среде выполнения
исключений, связанных с потоками. Agile<T> позволяет объекту, отличному от
Agile, вызывать тот же или другой поток или быть вызванным из этих потоков.
Дополнительные сведения см. в разделе Потоки и маршалинг.

Синтаксис
C++

template <typename T>

class Agile;

Параметры

Имя типа для класса, отличного от Agile.

Комментарии
Большинство классов в среда выполнения Windows являются гибкими. Объект
Agile может вызывать внутрипроцессный или внепроцессный объект либо быть
вызванным таким объектом в том же или другом потоке. Если объект не является
объектом гибкой разработки, заключите его в объект Agile<T> , который является
объектом гибкой разработки. После этого объект Agile<T> можно маршалировать,
используя таким образом базовый объект, отличный от Agile.

Класс Agile<T> — это стандартный класс неуправляемого кода C++, для которого
требуется включаемый файл agile.h . Он представляет объект, отличный от Agile, и
контекстобъекта Agile. Контекст задает потоковую модель объекта Agile и
поведение маршалинга. Операционная система использует контекст для
определения способа маршалирования объекта.

Члены
Открытые конструкторы

name Описание

Agile::Agile Инициализирует новый экземпляр класса Agile.

Деструктор Agile::~Agile Ликвидирует текущий экземпляр класса Agile.

Открытые методы

name Описание

Agile::Get Возвращает дескриптор объекта, представленного текущим


объектом Agile.

Agile::GetAddressOf Повторно инициализирует текущий объект Agile и возвращает


адрес дескриптора для объекта типа T .

Agile::GetAddressOfForInOut Возвращает адрес дескриптора объекта, представленного


текущим объектом Agile.

Agile::Release Отменяет базовый объект и контекст текущего объекта Agile.

Открытые операторы

Имя Описание

Agile::operator-> Извлекает дескриптор объекта, представленного текущим объектом Agile.

Agile::operator= Присваивает указанное значение текущему объекту Agile.

Иерархия наследования
Object

Agile

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform


Заголовок: agile.h

Конструктор Agile::Agile
Инициализирует новый экземпляр класса Agile.

Синтаксис
C++

Agile();

Agile(T^ object);

Agile(const Agile<T>& object);

Agile(Agile<T>&& object);

Параметры

Тип, указанный в параметре имени типа шаблона.

object

Во второй версии данного конструктора: объект, используемый для инициализации


нового экземпляра класса Agile. В третьей версии: объект, который копируется в
новый экземпляр класса Agile. В четвертой версии: объект, который перемещается
в новый экземпляр класса Agile.

Комментарии
Первая версия этого конструктора является конструктором по умолчанию. Вторая
версия инициализирует новый экземпляра класса Agile из объекта, указанного
параметром object . Третья версия является конструктором копирования.
Четвертая версия является конструктором перемещения. Этот конструктор не
может вызывать исключения.

Деструктор Agile::~Agile
Ликвидирует текущий экземпляр класса Agile.

Синтаксис
C++

~Agile();

Remarks
Этот деструктор также освобождает объект, представленный текущим объектом
Agile.

Метод Agile::Get
Возвращает дескриптор объекта, представленного текущим объектом Agile.

Синтаксис
C++

T^ Get() const;

Возвращаемое значение
Дескриптор объекта, представленного текущим объектом Agile.

Тип возвращаемого значения фактически является скрытым внутренним типом.


Для хранения возвращаемого значения удобно присвоить его переменной,
объявленной с ключевым словом вычета auto типа. Например, auto x =
myAgileTvariable->Get(); .

Метод Agile::GetAddressOf
Повторно инициализирует текущий объект Agile и возвращает адрес дескриптора
для объекта типа T .

Синтаксис
C++

T^* GetAddressOf() throw();

Параметры
T

Тип, указанный в параметре имени типа шаблона.

Возвращаемое значение
Адрес дескриптора для объекта типа T .

Комментарии
Эта операция освобождает текущее представление объекта типа T при его
наличии, повторно инициализирует данные-члены объекта Agile, получает
текущий контекст потока, а затем возвращает адрес переменной дескриптора для
объекта, который может представлять объект, отличный от Agile. Чтобы экземпляр
класса Agile представлял объект, используйте оператор присваивания
(Agile::operator=), чтобы назначить объект экземпляру класса Agile.

Метод Agile::GetAddressOfForInOut
Возвращает адрес дескриптора объекта, представленного текущим объектом Agile.

Синтаксис
C++

T^* GetAddressOfForInOut() throw();

Параметры

Тип, указанный в параметре имени типа шаблона.

Возвращаемое значение
Адрес дескриптора объекта, представленного текущим объектом Agile.

Комментарии
Эта операция получает текущий контекст потоков, затем возвращает адрес
дескриптора основного объекта.

Метод Agile::Release
Отменяет базовый объект и контекст текущего объекта Agile.

Синтаксис
C++

void Release() throw();

Remarks
Выполняется отмена базового объекта и контекста текущего объекта Agile, если
они существуют, а затем значению объекта Agile присваивается NULL.

Оператор Agile::operator->
Извлекает дескриптор объекта, представленного текущим объектом Agile.

Синтаксис
C++

T^ operator->() const throw();

Возвращаемое значение
Дескриптор объекта, представленного текущим объектом Agile.

Этот оператор фактически возвращает скрытый внутренний тип. Для хранения


возвращаемого значения удобно присвоить его переменной, объявленной с
помощью ключевого слова вычета auto типа.

Оператор Agile::operator=
Присваивает указанный объект текущему объекту Agile.
Синтаксис
C++

Agile<T> operator=( T^ object ) throw();

Agile<T> operator=( const Agile<T>& object ) throw();

Agile<T> operator=( Agile<T>&& object ) throw();

T^ operator=( IUnknown* lp ) throw();

Параметры
T

Тип, указанный в имени типа шаблона.

object

Объект или дескриптор объекта, который копируется или перемещается в текущий


объект Agile.

Lp

Указатель интерфейса IUnknown объекта.

Возвращаемое значение
Дескриптор для объекта типа T

Комментарии
Первая версия оператора присваивания копирует дескриптор ссылочного типа в
текущий объект Agile. Вторая версия копирует ссылку на тип Agile в текущий
объект Agile. Третья версия перемещает тип Agile в текущий объект Agile.
Четвертая версия перемещает указатель на COM-объект в текущий объект Agile.

Операция присваивания автоматически сохраняет контекст текущего объекта Agile.

См. также раздел


Пространство имен платформы
Класс Platform::Array
Статья • 03.04.2023

Представляет изменяемый одномерный массив, который можно получать и


передавать через двоичный интерфейс приложений (ABI).

Синтаксис
C++

template <typename T>

private ref class Array<TArg, 1> :

public WriteOnlyArray<TArg, 1>,

public IBoxArray<TArg>

Члены
Platform::Array наследует все свои методы от класса Platform::WriteOnlyArray и
реализует Value свойство интерфейса Platform::IBoxArray.

Открытые конструкторы

name Описание

Конструкторы Инициализирует изменяемый одномерный массив типов, заданный


массивов параметром шаблона класса T.

Методы
См . раздел Класс Platform::WriteOnlyArray.

Свойства

Имя Описание

Array::Value Получает дескриптор текущего массива.

Комментарии
Класс Array является запечатанным и наследовать его нельзя.

Система типов среда выполнения Windows не поддерживает концепцию массивов


с массивами, поэтому нельзя передать в IVector<Platform::Array<T>> качестве
возвращаемого значения или параметра метода. Для передачи массива массивов
или последовательности массивов в ABI используйте IVector<IVector<T>^> .

Дополнительные сведения о том, когда и как использовать Platform::Array, см. в


разделе Array и WriteOnlyArray.

Этот класс определен в заголовке vccorlib.h, который автоматически включается


компилятором. Он отображается в IntelliSense, но не в обозревателе объектов, так
как он не является общедоступным типом, определенным в platform.winmd.

Требования
Параметр компилятора: /ZW

Конструкторы массивов
Инициализирует изменяемый одномерный массив типов, заданный параметром
шаблона класса T.

Синтаксис
C++

Array(unsigned int size);

Array(T* data, unsigned int size);

Параметры
T

Параметр шаблона класса.

size

Количество элементов в массиве.

data

Указатель на массив данных типа T , используемый для инициализации данного


объекта Array.
Комментарии
Дополнительные сведения о создании экземпляров Platform::Array см. в разделе
Array и WriteOnlyArray.

Array::get - метод
Извлекает ссылку на элемент массива с указанным индексом.

Синтаксис
C++

T& get(unsigned int index) const;

Параметры
index

Отсчитываемый от нуля индекс, указывающий на элемент в массиве. Минимальный


индекс равен 0, а максимальный — значение, заданное параметром size в
конструкторе Array.

Возвращаемое значение
Элемент массива, заданный параметром index .

Array::Value - свойство
Получает дескриптор текущего массива.

Синтаксис
C++

property Array^ Value;

Возвращаемое значение
Дескриптор текущего массива.
См. также раздел
Пространство имен Platform

Классы Array и WriteOnlyArray


Класс Platform::ArrayReference
Статья • 03.04.2023

ArrayReference — тип оптимизации, который можно заменить на Platform::Array^


во входных параметрах, если требуется заполнить входными данными массив в
стиле языка C.

Синтаксис
C++

class ArrayReference

Члены

Открытые конструкторы

name Описание

ArrayReference::ArrayReference Инициализирует новый экземпляр класса ArrayReference .

Открытые операторы

Имя Описание

Оператор Преобразует этот объект ArrayReference в


ArrayReference::operator() Platform::Array<T>^* .

Оператор Назначает содержимое другой ссылки ArrayReference этому


ArrayReference::operator= экземпляру.

Исключения

Remarks
Использование ArrayReference для заполнения массива в стиле языка C позволяет
избежать дополнительной операции копирования, которая потребовалось бы при
копировании сначала в переменную Platform::Array , а затем в массив в стиле
языка C. При использовании ArrayReference выполняется только одна операция
копирования. Пример кода см. в разделах Array и WriteOnlyArray.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Заголовок: vccorlib.h

Конструктор ArrayReference::ArrayReference
Инициализирует новый экземпляр класса Platform::ArrayReference .

Синтаксис
C++

ArrayReference(TArg* ataArg, unsigned int sizeArg, bool needsInitArg =


false);

ArrayReference(ArrayReference&& otherArg)

Параметры
dataArg

Указатель на данные массива.

sizeArg

Количество элементов в исходном массиве.

otherArg

Объект ArrayReference , данные которого будут перемещены для инициализации


нового экземпляра.

Комментарии

Оператор ArrayReference::operator=
Назначает указанный объект текущему объекту Platform::ArrayReference с помощью
семантики перемещения.

Синтаксис
C++

ArrayReference& operator=(ArrayReference&& otherArg);

Параметры
otherArg

Присваивает перемещенный объект текущему объекту ArrayReference .

Возвращаемое значение
Ссылка на объект типа ArrayReference .

Комментарии
Platform::ArrayReference — это стандартный шаблон класса C++, а не ссылочный

класс.

Оператор ArrayReference::operator()
Преобразует текущий объект Platform::ArrayReference обратно в класс
Platform::Array .

Синтаксис
C++

Array<TArg>^ operator ();

Возвращаемое значение
Дескриптор для объекта типа Array<TArg>^
Комментарии
Platform::ArrayReference — это стандартный шаблон класса C++, а Platform::Array —
класс ссылки.

См. также раздел


Пространство имен Platform
Класс значений Platform::Boolean
Статья • 03.04.2023

Представляет логическое значение. Эквивалент bool .

Синтаксис
C++

public value struct Boolean

Члены
Класс Boolean имеет методы Equals(), GetHashCode() и ToString(), наследуемые от
Platform::Object Class, и метод GetTypeCode(), наследуемый от Platform::Type Class.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Пространство имен Platform
Класс Platform::Box
Статья • 26.09.2022

Позволяет сохранять тип значения, такой как Windows::Foundation::DateTime , или


скалярный тип, такой как int , в типе Platform::Object . Как правило, нет
необходимости использовать Box явным образом, так как процесс упаковки
выполняется неявно при приведении значения типа к Object^ .

Синтаксис
C++

ref class Box abstract;

Требования
Заголовок: vccorlib.h

Пространство имен: Platform

Члены

Член Описание

Box Создает объект Box , который может инкапсулировать значение


указанного типа.

operator Позволяет осуществлять преобразования-упаковки класса значений


Box<const T>^ const T или enum класса T в Box<T> .

operator Позволяет осуществлять преобразования-упаковки из класса значений


Box<const volatile const volatile T или enum типа T в Box<T> .
T>^

operator Box<T>^ Позволяет осуществлять преобразования-упаковки класса значений T


в Box<T> .

operator Позволяет осуществлять преобразования-упаковки из класса значений


Box<volatile T>^ volatile T или enum типа T в Box<T> .

Box:: оператор T Позволяет осуществлять преобразования-упаковки класса значений T


или enum класса T в Box<T> .
Член Описание

Value - свойство Возвращает значение, которое инкапсулируется в объекте Box .

Конструктор Box::Box
Создает объект Box , который может инкапсулировать значение указанного типа.

Синтаксис
C++

Box(T valueArg);

Параметры
валуеарг

Тип упаковываемого значения — например, int , bool , float64 , DateTime .

Оператор Box::operator Box<const T>^


Позволяет осуществлять преобразования-упаковки класса значений const T или
enum класса T в Box<T> .

Синтаксис
C++

operator Box<const T>^(const T valueType);

Параметры
T

Любой класс значений, структура значений или тип перечисления. Включает


встроенные типы в пространство имен по умолчанию.

Возвращаемое значение
Platform::Box<T>^ Экземпляр, представляющий исходное значение, упакованное в

класс ссылки.

Оператор Box::operator Box<const volatile


T>^
Позволяет осуществлять преобразования-упаковки из класса значений const
volatile T или enum типа T в Box<T> .

Синтаксис
C++

operator Box<const volatile T>^(const volatile T valueType);

Параметры
T

Любой тип перечисления, класс значений или структура значений. Включает


встроенные типы в пространство имен по умолчанию.

Возвращаемое значение
Platform::Box<T>^ Экземпляр, представляющий исходное значение, упакованное в

класс ссылки.

Оператор Box::operator Box<T>^


Позволяет осуществлять преобразования-упаковки класса значений T в Box<T> .

Синтаксис
C++

operator Box<const T>^(const T valueType);

Параметры
T

Любой тип перечисления, класс значений или структура значений. Включает


встроенные типы в пространство имен по умолчанию.

Возвращаемое значение
Platform::Box<T>^ Экземпляр, представляющий исходное значение, упакованное в
класс ссылки.

Оператор Box::operator Box<volatile T>^


Позволяет осуществлять преобразования-упаковки из класса значений volatile T
или enum типа T в Box<T> .

Синтаксис
C++

operator Box<volatile T>^(volatile T valueType);

Параметры
T

Любой тип перечисления, класс значений или структура значений. Включает


встроенные типы в пространство имен по умолчанию.

Возвращаемое значение
Platform::Box<T>^ Экземпляр, представляющий исходное значение, упакованное в

класс ссылки.

Оператор Box::operator T
Позволяет осуществлять преобразования-упаковки класса значений T или enum
класса T в Box<T> .

Синтаксис
C++

operator Box<T>^(T valueType);

Параметры
T

Любой тип перечисления, класс значений или структура значений. Включает


встроенные типы в пространство имен по умолчанию.

Возвращаемое значение
Platform::Box<T>^ Экземпляр, представляющий исходное значение, упакованное в

класс ссылки.

Свойство Box::Value
Возвращает значение, которое инкапсулируется в объекте Box .

Синтаксис
C++

virtual property T Value{

T get();

Возвращаемое значение
Возвращает упакованное значение с тем же типом, который у него был до
упаковки.

См. также
Пространство имен Platform

Упаковка-преобразование
Platform::CallbackContext -
перечисление
Статья • 03.04.2023

Указывает контекст потока, в котором выполняется функция обратного вызова


(обработчик события).

Синтаксис
C++

enum class CallbackContext {};

Члены

Код типа Описание

Любой Функция обратного вызова может выполняться в любом контексте потока.

Аналогично Функция обратного вызова может выполняться в контексте потока,


запустившего асинхронную операцию.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd
Класс Platform::ChangedStateException
Статья • 03.04.2023

Создается, если внутреннее состояние объекта было изменено, тем самым делая
недействительными результаты метода.

Синтаксис
C++

public ref class ChangedStateException : COMException, IException,


IPrintable, IEquatable

Remarks
Один из примеров ситуаций, когда создается это исключение: метод итератора
коллекции или представления коллекции вызван после изменения родительской
коллекции, что делает результаты метода недействительными.

Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс
Platform::ClassNotRegisteredException
Статья • 03.04.2023

Возникает, если COM-класс не зарегистрирован.

Синтаксис
C++

public ref class ClassNotRegisteredException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс Platform::COMException
Статья • 03.04.2023

Представляет ошибки COM, возникающие при выполнении приложения.


COMException — базовый класс для набора предопределенных стандартных
исключений.

Синтаксис
C++

public ref class COMException : Exception, IException, IPrintable,


IEquatable

Члены
Класс COMException наследует от класса Object и интерфейсов IException, IPrintable
и IEquatable.

Класс COMException также имеет следующие типы членов.

Конструкторы

Член Описание

COMException Инициализирует новый экземпляр класса COMException.

Методы

Класс COMException наследует методы Equals(), Finalize(), GetHashCode(), GetType(),


MemberwiseClose() и ToString() от класса Platform::Object Class.

Свойства

Класс COMException имеет следующие свойства.

Член Описание

Исключение::HResult Значение HRESULT, соответствующее исключению.

Исключение::Message Сообщение с описанием исключения.


Производные исключения
Следующие предопределенные исключения наследуются от класса COMException.
Они отличаются от класса COMException только своими именами, именами своих
конструкторов и значениями HRESULT.

Имя Значение HRESULT Описание

COMException Определяемое Возникает при возвращении


пользователем неизвестного значения HRESULT
значение hresult после вызова метода COM.

AccessDeniedException E_ACCESSDENIED Возникает при запрете доступа к


ресурсу или функции.

ChangedStateException E_CHANGED_STATE Возникает, если метод итератора


коллекции или представления
коллекции вызван после изменения
родительской коллекции, что делает
результаты метода
недействительными.

ClassNotRegisteredException REGDB_E_CLASSNOTREG Возникает, если COM-класс не


зарегистрирован.

DisconnectedException RPC_E_DISCONNECTED Возникает, если объект отключен от


своих клиентов.

FailureException E_FAIL Возникает, если операция


завершается неудачно.

InvalidArgumentException E_INVALIDARG Вызывается, если один из


передаваемых методу аргументов
является недопустимым.

InvalidCastException E_NOINTERFACE Возникает, если тип не удается


привести к другому типу.

NotImplementedException E_NOTIMPL Возникает, если метод интерфейса


не реализован в классе.

NullReferenceException E_POINTER Возникает при попытке


разыменовать ссылку на объект
NULL.

OperationCanceledException E_ABORT Возникает при отмене операции.

OutOfBoundsException E_BOUNDS Возникает, когда операция пытается


получить доступ к данным за
пределами допустимого диапазона.
Имя Значение HRESULT Описание

OutOfMemoryException E_OUTOFMEMORY Возникает, если недостаточно


памяти для выполнения операции.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

COMException::COMException - конструктор
Инициализирует новый экземпляр класса COMException.

Синтаксис
C++

COMException( int hresult )

Параметры
Hresult

HRESULT ошибки, представляемый этим исключением.

COMException::HResult - свойство
Значение HRESULT, соответствующее исключению.

Синтаксис
C++

public:

property int HResult { int get();}

Значение свойства
Значение HRESULT, задающее ошибку.

Комментарии
Дополнительные сведения о том, как интерпретировать значение HRESULT, см. в
разделе Структура кодов ошибок COM.

COMException::Message - свойство
Сообщение с описанием исключения.

Синтаксис
C++

public:property String^ Message { String^ get();}

Значение свойства
Описание исключения.

См. также раздел


Пространство имен Platform
Platform::Delegate - класс
Статья • 03.04.2023

Представляет объект функции.

Синтаксис
C++

public delegate void delegate_name();

Члены
Класс Delegate имеет методы Equals(), GetHashCode() и ToString(), производные от
Platform::Object Class.

Комментарии
Для создания делегатов используйте ключевое слово delegate ; не используйте
Platform::Delegate явным образом. Дополнительные сведения см. в разделе
Делегаты. Пример создания и использования делегата см. в разделе Creating
Windows Runtime Components in C++.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Пространство имен Platform
Класс Platform::DisconnectedException
Статья • 03.04.2023

Вызывается, если прокси-объект COM пытается выполнить ссылку на сервер COM,


которые больше не существует

Синтаксис

public ref class DisconnectedException : COMException, IException,


IPrintable, IEquatable

Remarks
Если класс A ссылается на другой класс (класс B) в отдельном процессе, то классу A
требуется прокси-объект для связи с находящимся вне процесса сервером COM,
который содержит класс B. Иногда серверу может не хватать памяти, а класс A об
этом не знает. В этом случае вызывается исключение RPC_E_DISCONNECTED и
преобразуется в исключение Platform::DisconnectedException. Один из сценариев, в
котором это происходит, связан с ситуацией, когда источник события вызывает
предоставленного ему делегата, но делегат был удален в некоторой точке после
своей подписки на событие. Когда это происходит, источник события удаляет
делегата из своего списка вызова.

Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс Platform::Enum
Статья • 03.04.2023

Класс значений, представляющий набор именованных констант.

Синтаксис
C++

public class Enum

Члены
Класс Enum наследует методы Equals(), GetHashCode() и ToString() от Platform::Object
Class.

Комментарии
Используйте ключевое слово public enum class для создания перечислений. Не
используйте тип Platform::Enum в явном виде. Дополнительные сведения см. в
разделе Перечисления.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Пространство имен Platform
Класс Platform::Exception
Статья • 03.04.2023

Представляет ошибки, которые происходят во время выполнения приложения.


Пользовательские классы исключений не могут быть производными от класса
Platform::Exception . Если требуется пользовательское исключение, можно
использовать класс Platform::COMException и указать относящееся к приложению
значение HRESULT.

Синтаксис
C++

public ref class Exception : Object, IException, IPrintable,


IEquatable

Члены
Класс Exception наследуется от класса Object и интерфейсов IException ,
IPrintable и IEquatable .

Класс Exception имеет также следующие типы членов.

Конструкторы

Член Описание

Исключение::Исключение Инициализирует новый экземпляр класса Exception .

Методы
Класс Exception наследует методы Equals() ,
Finalize() , GetHashCode() , GetType() , MemberwiseClose() и ToString() из

Platform::Object Class. Класс Exception содержит также следующий метод.

Член Описание

Исключение::CreateException Создает исключение, представляющее указанное значение


HRESULT.
Свойства
Класс Exception также содержит следующие свойства.

Член Описание

Исключение::HResult Значение HRESULT, соответствующее исключению.

Исключение::Message Сообщение, описывающее исключение. Это значение доступно


только для чтения, его нельзя изменить после создания Exception .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

Exception::CreateException - метод
Создает Platform::Exception^ из указанного значения HRESULT.

Синтаксис
C++

Exception^ CreateException(int32 hr);

Exception^ CreateException(int32 hr, Platform::String^ message);

Параметры
ч

Значение HRESULT, которое, как правило, получается из вызова метода COM. Если
значение равно 0, равное S_OK, этот метод вызывает исключение
Platform::InvalidArgumentException , так как успешные COM-методы не должны
вызывать исключения.

message

Строка с описанием ошибки.


Возвращаемое значение
Исключение, представляющее HRESULT ошибки.

Комментарии
Используйте этот метод для создания исключения из значения HRESULT,
возвращаемого, например, из вызова интерфейса COM. Можно использовать
перегруженный метод, принимающий параметр String^, чтобы предоставить
пользовательское сообщение.

Настоятельно рекомендуется использовать CreateException для создания строго


типизированного исключения, а не создания класса Platform::COMException ,
содержащего только HRESULT.

Exception::Exception - конструктор
Инициализирует новый экземпляр класса Exception.

Синтаксис
C++

Exception(int32 hresult);

Exception(int32 hresult, ::Platform::String^ message);

Параметры
Hresult

HRESULT ошибки, представляемый этим исключением.

message

Задаваемое пользователем сообщение (например, текст рекомендаций), связанное


с исключением. В общем случае следует выбирать вторую перегрузку, чтобы
предоставить максимально подробное описание того, как и почему произошла
конкретная ошибка.

Exception::HResult - свойство
Значение HRESULT, соответствующее исключению.
Синтаксис
C++

public:

property int HResult { int get(); }

Значение свойства
Значение HRESULT.

Комментарии
Большинство исключений создаются как ошибки модели COM, которые
возвращаются в виде значений HRESULT. C++/CX преобразует эти значения в
объекты Platform::Exception^, и это свойство сохраняет значение исходного кода
ошибки.

Свойство Exception::Message
Сообщение с описанием ошибки.

Синтаксис
C++

public:property String^ Message;

Значение свойства
В исключениях, создаваемых в среде выполнения Windows, это предоставляемое
системой описание ошибки.

Комментарии
В Windows 8 это свойство доступно только для чтения, так как исключения в этой
версии среда выполнения Windows передаются через ABI только как HRESULTS. В
Windows 8.1 через интерфейс ABI передается более подробная информация об
исключениях, и можно задать пользовательское сообщение, к которому другие
компоненты могут обращаться программным образом. Дополнительные сведения
см. в разделе Исключения (C++/CX)..

См. также раздел


Пространство имен Platform
Класс Platform::FailureException
Статья • 03.04.2023

Вызывается, если операция вызвала сбой. Эквивалентно E_FAIL HRESULT.

Синтаксис
C++

public ref class FailureException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс значения Platform::Guid
Статья • 03.04.2023

Представляет тип [GUID](/windows/win32/api/guiddef/ns-guiddef-guid в системе


типов среда выполнения Windows.

Синтаксис
C++

public value struct Guid

Члены
Platform::Guid Equals() содержит методы , и ToString() , GetHashCode() производные

от класса Platform::Object, и GetTypeCode() метод, производный от класса


Platform::Type. Platform::Guid также имеет следующие элементы.

Член Описание

Guid Инициализирует новый экземпляр Platform::Guid .

operator== Оператор «равно».

operator!= Оператор «не равно».

operator< Оператор «меньше».

operator() Преобразует Platform::Guid в GUID .

Комментарии
Для создания нового Platform::Guid используйте статический метод
Windows::Foundation::GuidHelper::CreateNewGuid .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012


Пространство имен: Platform

Метаданные: platform.winmd

Конструкторы Guid::Guid
Инициализирует новый экземпляр Platform::Guid .

Синтаксис
C++

Guid(

unsigned int a,

unsigned short b,

unsigned short c,

unsigned char d,

unsigned char e,

unsigned char f,

unsigned char g,

unsigned char h,

unsigned char i,

unsigned char j,

unsigned char k );

Guid(GUID m);

Guid(

unsigned int a,

unsigned short b,

unsigned short c,

Array<unsigned char>^ n );

Параметры
a

Первые 4 байта GUID .

Следующие 2 байта GUID .

Следующие 2 байта GUID .

Следующий байт структуры GUID .


e

Следующий байт структуры GUID .

Следующий байт структуры GUID .

Следующий байт структуры GUID .

Следующий байт структуры GUID .

Следующий байт структуры GUID .

Следующий байт структуры GUID .

Следующий байт структуры GUID .

Объект GUID в виде структуры GUID.

Оставшиеся 8 байт объекта GUID .

Оператор Guid::operator==
Сравнивает два экземпляра Platform::Guid на предмет их равенства.

Синтаксис
C++

static bool Platform::Guid::operator==(Platform::Guid guid1, Platform::Guid


guid2);

Параметры
guid1

Первый экземпляр Platform::Guid для сравнения.


guid2

Второй экземпляр Platform::Guid для сравнения.

Возвращаемое значение
Значение true, если два Platform::Guid экземпляра равны.

Комментарии
Предпочитать использовать == оператор вместо статического метода
Windows::Foundation::GuidHelper::Equals .

Оператор Guid::operator!=
Сравнивает два экземпляра Platform::Guid на неравенство.

Синтаксис
C++

static bool Platform::Guid::operator!=(Platform::Guid guid1, Platform::Guid


guid2);

Параметры
guid1

Первый экземпляр Platform::Guid для сравнения.

guid2

Второй экземпляр Platform::Guid для сравнения.

Возвращаемое значение
Значение true, если два Platform::Guid экземпляра не равны.

Оператор Guid::operator<
Сравнивает два Platform::Guid экземпляра для упорядочения.
Синтаксис
C++

static bool Platform::Guid::operator<(Platform::Guid guid1, Platform::Guid


guid2);

Параметры
guid1

Первый экземпляр Platform::Guid для сравнения.

guid2

Второй экземпляр Platform::Guid для сравнения.

Возвращаемое значение
Значение true, если guid1 упорядочен до guid2. Порядок является
лексикографическим после того, как каждый из них Platform::Guid обрабатывается
как массив из четырех 32-разрядных значений без знака. Это не упорядочение,
используемое SQL Server или платформа .NET Framework, и не то же самое, что
лексикографическое упорядочение по строкового представления.

Этот оператор предоставляется для Guid упрощения использования объектов


стандартной библиотекой C++.

Оператор Guid::operator()
Неявно преобразует в Platform::Guid структуру GUID.

Синтаксис
C++

const GUID& Platform::Guid::operator();

Возвращаемое значение
Структура GUID.
См. также раздел
Пространство имен Platform
Интерфейс Platform::IBox
Статья • 03.04.2023

Platform::IBox — это имя C++ для интерфейса Windows::Foundation::IReference .

Синтаксис
C++

template <typename T>

interface class IBox

Параметры
T

Введите запакованное значение.

Комментарии
Интерфейс IBox<T> в основном используется внутри кода для представления типов
значений, допускающих значение null, как описано в разделе Классы и структуры
значения (C++/CX). Этот интерфейс также используется для упаковки типов
значений, передаваемых в методы C++, которые принимают параметры типа
Object^ . Можно в явном виде определить входной параметр как
IBox<SomeValueType> . Пример см. в разделе Boxing.

Требования

Элементы
Интерфейс Platform::IBox наследуется от интерфейса Platform::IValueType .
Интерфейс IBox содержит следующие члены:

Свойства

Метод Описание

Значение Возвращает распакованное значение, которое ранее хранилось в этом


экземпляре IBox .
Свойство IBox::Value
Возвращает значение, которое было изначально сохранено в этом объекте.

Синтаксис
C++

property T Value {T get();}

Параметры
T

Введите запакованное значение.

Значение свойства/возвращаемое значение


Возвращает значение, которое было изначально сохранено в этом объекте.

Комментарии
Пример см. в разделе Boxing.

См. также раздел


Пространство имен Platform
Интерфейс Platform::IBoxArray
Статья • 03.04.2023

IBoxArray является оболочкой для массивов типов значений, передаваемых через


двоичный интерфейс приложений (ABI) или хранящихся в коллекциях элементов
Platform::Object^ , таких как коллекции в элементах управления XAML.

Синтаксис
C++

template <typename T>

interface class IBoxArray

Параметры
T

Тип упакованного значение в каждом элементе массива.

Комментарии
IBoxArray — это имя C++/CX для Windows::Foundation::IReferenceArray .

Элементы
Интерфейс IBoxArray наследует от интерфейса IValueType . Интерфейс IBoxArray
также содержит следующие члены:

Метод Описание

Значение Возвращает распакованный массив, который ранее хранился в этом экземпляре


IBoxArray .

Свойство IBoxArray::Value
Возвращает значение, которое было изначально сохранено в этом объекте.

Синтаксис
C++

property T Value {T get();}

Параметры
T

Введите запакованное значение.

Значение свойства/возвращаемое значение


Возвращает значение, которое было изначально сохранено в этом объекте.

Комментарии
Пример см. в разделе Boxing.

См. также раздел


Классы Array и WriteOnlyArray
Platform::IDisposable - интерфейс
Статья • 03.04.2023

Используется для освобождения неуправляемых ресурсов.

Синтаксис
C++

public interface class IDisposable

Атрибуты
GuidAttribute("de0cbaea-8065-4a45-b196-c9d443f9bab3")

VersionAttribute(NTDDI_WIN8)

Элементы
Интерфейс IDisposable наследует от интерфейса IUnknown. Интерфейс IDisposable
также имеет следующие типы членов.

Методы

Интерфейс IDisposable содержит следующие методы.

Метод Описание

Dispose Используется для освобождения неуправляемых ресурсов.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform


Класс значения Platform::IntPtr
Статья • 03.04.2023

Представляет указатель или дескриптор числа со знаком, размер которого зависит


от платформы (32-разрядная или 64-разрядная).

Синтаксис
C++

public value struct IntPtr

Члены
Класс IntPtr имеет следующие члены:

Член Описание

IntPtr::IntPtr Инициализирует новый экземпляр класса IntPtr.

Оператор Преобразует указанный параметр в объект IntPtr или указатель на


IntPtr::op_explicit значение IntPtr.

IntPtr::ToInt32 Преобразует текущий объект IntPtr в 32-разрядное целое число.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

IntPtr::IntPtr - конструктор
Инициализирует новый экземпляр класса IntPtr, используя указанное значение.

Синтаксис
C++

IntPtr( __int64 handle-or-pointer ); IntPtr( void* value ); IntPtr( int


32-bit_value );

Параметры
value

64-разрядный дескриптор или указатель, указатель на 64-разрядное значение или


32-разрядное значение, которое можно преобразовать в 64-разрядное.

Оператор IntPtr::op_explicit
Преобразует указанный параметр в объект IntPtr или указатель на значение IntPtr.

Синтаксис
C++

static IntPtr::operator IntPtr( void* value1); static IntPtr::operator


IntPtr( int value2); static IntPtr::operator void*( IntPtr value3 );

Параметры
value1

Указатель на дескриптор или IntPtr.

value2

32-битовое целое число, которое можно преобразовать в IntPtr.

value3

Объект IntPtr.

Возвращаемое значение
Первый и второй операторы возвращают IntPtr. Третий оператор возвращает
указатель на значение, представленное текущим объектом IntPtr.

Метод IntPtr::ToInt32
Преобразует текущее значение IntPtr в 32-битовое целое число.

Синтаксис
C++

int32 IntPtr::ToInt32();

Возвращаемое значение
32-битное целое число.

См. также раздел


Пространство имен Platform
Класс
Platform::InvalidArgumentException
Статья • 03.04.2023

Вызывается, если один из передаваемых методу аргументов является


недопустимым.

Синтаксис
C++

public ref class InvalidArgumentException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс Platform::InvalidCastException
Статья • 03.04.2023

Вызывается, когда приведение или явное преобразование является недопустимым.

Синтаксис
C++

public ref class InvalidCastException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Интерфейс Platform::IValueType
Статья • 03.04.2023

Platform::IValueType — это интерфейс инфраструктуры, реализуемый классами и


структурами значений. Не должен использоваться в коде явным образом.

Синтаксис
C++

interface class IValueType

См. также раздел


Пространство имен Platform
Класс Platform::MTAThreadAttribute
Статья • 03.04.2023

Указывает, что потоковая модель для приложения является многопотоковым


подразделением (MTA).

Синтаксис

public ref class MTAThreadAttribute sealed : Attribute

Члены

Открытые конструкторы

name Описание

Конструктор MTAThreadAttribute 1 Инициализирует новый экземпляр класса.

Открытые методы
Атрибут MTAThreadAttribute наследуется от класса Platform::Object. Атрибут
MTAThreadAttribute также перегружает или имеет следующие члены:

Имя Описание

MTAThreadAttribute::Equals Определяет, равен ли указанный объект текущему


объекту.

MTAThreadAttribute::GetHashCode Возвращает хэш-код данного экземпляра.

MTAThreadAttribute::ToString Возвращает строку, представляющую текущий объект.

Иерархия наследования
Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform

Конструктор MTAThreadAttribute
Инициализирует новый экземпляр класса MTAThreadAttribute.

Синтаксис
C++

public:MTAThreadAttribute();

MTAThreadAttribute::Equals
Определяет, равен ли указанный объект текущему объекту.

Синтаксис
C++

public:virtual override bool Equals( Object^ obj );

Параметры
obj

Объект для сравнения.

Возвращаемое значение
Значение true , если объекты равны, в противном случае — значение false .

MTAThreadAttribute::GetHashCode
Возвращает хэш-код данного экземпляра.

Синтаксис
C++

public:int GetHashCode();

Возвращаемое значение
Хэш-код данного экземпляра.

MTAThreadAttribute::ToString
Возвращает строку, представляющую текущий объект.

Синтаксис
C++

public:String^ ToString();

Возвращаемое значение
Строка, представляющая текущий объект.

См. также раздел


Пространство имен платформы
Класс
Platform::NotImplementedException
Статья • 03.04.2023

Вызывается, если член интерфейса не реализован в производном типе.

Синтаксис
C++

public ref class NotImplementedException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс Platform::NullReferenceException
Статья • 03.04.2023

Возникает при попытке разыменовать ссылку на объект NULL.

Синтаксис
C++

public ref class NullReferenceException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс Platform::Object
Статья • 03.04.2023

Обеспечивает общее поведение для ссылочных классов и ссылочных структур в


приложениях среда выполнения Windows. Все экземпляры классов ссылок и
структур ссылок могут неявно преобразовываться в Platform::Object^ и
переопределять его виртуальный метод ToString.

Синтаксис
C++

public ref class Object : Object

Члены

Открытые конструкторы

name Описание

Object::Object Инициализирует новый экземпляр класса Object.

Открытые методы

name Описание

Object::Equals Определяет, равен ли указанный объект текущему объекту.

Object::GetHashCode Возвращает хэш-код данного экземпляра.

Object::ReferenceEquals Определяет, являются ли указанные экземпляры класса Object


одним и тем же экземпляром.

ToString Возвращает строку, представляющую текущий объект. Может быть


переопределен.

GetType Получает объект Platform::Type , описывающий текущий экземпляр.

Иерархия наследования
Object

Object

Требования
Заголовок: vccorlib.h

Пространство имен: Platform

Метод Object::Equals
Определяет, равен ли указанный объект текущему объекту.

Синтаксис
C++

bool Equals(

Object^ obj

Параметры
obj

Объект для сравнения.

Возвращаемое значение
Значение true , если объекты равны; в противном случае — значение false .

Метод Object::GetHashCode
Возвращает значение идентификатора IUnknown * для этого экземпляра, если это
COM-объект, или вычисляемое хэш-значение, если это не COM-объект.

Синтаксис
C++
public:int GetHashCode();

Возвращаемое значение
Числовое значение, которое однозначно идентифицирует этот объект.

Комментарии
Можно использовать GetHashCode для создание ключей объектов в
сопоставлениях. Вы можете сравнить хэш-коды с помощью object::Equals. Если эта
ветвь выполнения кода очень важна, а GetHashCode и Equals работают
недостаточно быстро, можно перейти вниз на соответствующий уровень COM и
выполнять сравнение указателей IUnknown в неуправляемом коде.

Метод Object::GetType
Возвращает объект Platform::Type , описывающий тип среды выполнения объекта.

Синтаксис
C++

Object::GetType();

Значение свойства/возвращаемое значение


Объект Platform::Type , описывающий тип среды выполнения объекта.

Комментарии
Статический Type::GetTypeCode можно использовать для получения значения
перечисления Platform::TypeCode , представляющего текущий тип. Это наиболее
полезно для встроенных типов. Код типа для любого класса ссылки, кроме
Platform::String , имеет значение Object (1).

Класс Windows::UI::Xaml::Interop::TypeName используется в API Windows как


независимый от языка способ передачи сведений о типе между компонентами и
приложениями Windows. Класс T Platform::Type имеет операторы для
преобразования между Type и TypeName .

Используйте оператор typeid , чтобы вернуть Platform::Type объект для имени


класса, например при переходе между страницами XAML:

rootFrame->Navigate(TypeName(MainPage::typeid), e->Arguments);

Конструктор Object::Object
Инициализирует новый экземпляр класса Object.

Синтаксис
C++

public:Object();

Метод Object::ReferenceEquals
Определяет, являются ли указанные экземпляры класса Object одним и тем же
экземпляром.

Синтаксис
C++

public:static bool ReferenceEquals( Object^ obj1, Object^ obj2);

Параметры
obj1

Первый из сравниваемых объектов.

obj2

Второй из сравниваемых объектов.


Возвращаемое значение
Значение true , если два объекта совпадают, в противном случае — значение
false .

Метод Object::ToString (C++/CX)


Возвращает строку, представляющую текущий объект.

Синтаксис
C++

public:

virtual String^ ToString();

Возвращаемое значение
Строка, представляющая текущий объект. Этот метод можно переопределить,
чтобы ссылочный класс или структура содержали пользовательскую строку
сообщения:

C++

public ref class Tree sealed

public:

Tree(){}

virtual Platform::String^ ToString() override

return "I'm a Tree";

};

};

См. также раздел


Пространство имен платформы

Класс Platform::Type

Система типов
Класс
Platform::ObjectDisposedException
Статья • 03.04.2023

Вызывается при выполнении операции над ликвидированным объектом.

Синтаксис
C++

public ref class ObjectDisposedException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс
Platform::OperationCanceledException
Статья • 03.04.2023

Возникает при отмене операции.

Синтаксис
C++

public ref class OperationCanceledException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс Platform::OutOfBoundsException
Статья • 03.04.2023

Возникает, когда операция пытается получить доступ к данным за пределами


допустимого диапазона.

Синтаксис
C++

public ref class OutOfBoundsException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Класс
Platform::OutOfMemoryException
Статья • 03.04.2023

Возникает, если недостаточно памяти для выполнения операции.

Синтаксис
C++

public ref class OutOfMemoryException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Метод Platform::ReCreateException
Статья • 03.04.2023

Этот метод предназначен только для внутреннего использования и не


предназначен для пользовательского кода. Вместо него используйте метод
Exception::CreateException.

Синтаксис
C++

static Exception^ ReCreateException(int hr)

Параметры
ч

Значение свойства/возвращаемое значение


Возвращает новый Platform::Exception^, основываясь на указанном значении
HRESULT.
Класс значения Platform::SizeT
Статья • 03.04.2023

Представляет размер объекта. SizeT — беззнаковый тип данных.

Синтаксис
C++

public ref class SizeT sealed : ValueType

Элементы

Член Описание

Конструктор Инициализирует новый экземпляр класса, используя указанное


SizeT::SizeT значение.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

SizeT::SizeT - конструктор
Инициализирует новый экземпляр класса SizeT указанным значением.

Синтаксис
C++

SizeT( uint32 value1 ); SizeT( void* value2 );

Параметры
value1

32-битовое значение без знака.

value2

Указатель на 32-разрядное значение без знака.

См. также раздел


Пространство имен Platform
Класс Platform::STAThreadAttribute
Статья • 03.04.2023

Указывает, что потоковая модель для приложения является однопотоковым


подразделением (STA).

Синтаксис

public ref class STAThreadAttribute sealed : Attribute

Члены

Открытые конструкторы

name Описание

Конструктор STAThreadAttribute 1 Инициализирует новый экземпляр класса.

Открытые методы
Атрибут STAThreadAttribute наследуется от класса Platform::Object. Атрибут
STAThreadAttribute также перегружает или имеет следующие члены:

Имя Описание

STAThreadAttribute::Equals Определяет, равен ли указанный объект текущему


объекту.

STAThreadAttribute::GetHashCode Возвращает хэш-код данного экземпляра.

STAThreadAttribute::ToString Возвращает строку, представляющую текущий объект.

Иерархия наследования
Platform

Требования
Заголовок: collection.h

Пространство имен: Platform

STAThreadAttribute - конструктор
Инициализирует новый экземпляр класса STAThreadAttribute.

Синтаксис
C++

public:STAThreadAttribute();

STAThreadAttribute::Equals
Определяет, равен ли указанный объект текущему объекту.

Синтаксис
C++

public:virtual override bool Equals( Object^ obj );

Параметры
obj

Объект для сравнения.

Возвращаемое значение
Значение true , если объекты равны, в противном случае — значение false .

STAThreadAttribute::GetHashCode
Возвращает хэш-код данного экземпляра.

Синтаксис
C++

public:int GetHashCode();

Возвращаемое значение
Хэш-код данного экземпляра.

STAThreadAttribute::ToString
Возвращает строку, представляющую текущий объект.

Синтаксис
C++

public:String^ ToString();

Возвращаемое значение
Строка, представляющая текущий объект.

См. также раздел


Пространство имен платформы
Класс Platform::String
Статья • 03.04.2023

Представляет упорядоченную коллекцию символов Юникода, используемую для


представления текста. Дополнительные сведения и примеры см. в разделе
"Строки".

Синтаксис
C++

public ref class String sealed : Object,

IDisposable,

IEquatable,

IPrintable

Iterators
Две функции итератора, которые не являются членами класса String, можно
использовать с шаблоном std::for_each функции для перечисления символов в
объекте String.

Член Описание

const char16* Возвращает указатель на начало указанного объекта String.


begin(String^ s)

const char16* Возвращает указатель на позицию после окончания указанного


end(String^ s) объекта String.

Элементы
Класс String наследует от класса Object и интерфейсов IDisposable, IEquatable и
IPrintable.

Класс String имеет также следующие типы членов.

Конструкторы

Член Описание
Член Описание

String::String Инициализирует новый экземпляр класса String.

Методы
Класс String наследует методы Equals(), Finalize(), GetHashCode(), GetType(),
MemberwiseClose() и ToString() от класса Platform::Object Class. Класс String содержит
также следующие методы.

Метод Описание

String::Begin Возвращает указатель на начало текущей строки.

String::CompareOrdinal Сравнивает два объекта String , оценивая числовые значения


соответствующих символов в двух строковых значениях,
представленных объектами.

String::Concat Объединяет значения двух объектов String.

String::D ata Возвращает указатель на начало текущей строки.

String::D ispose Высвобождает ресурсы.

String::End Возвращает указатель на позицию после конца текущей строки.

String::Equals Указывает, равен ли указанный объект текущему объекту.

String::GetHashCode Возвращает хэш-код данного экземпляра.

String::IsEmpty Указывает, является ли объект String пустым.

String::IsFastPass Указывает, участвует ли текущий объект String в быстрой операции


передачи . В операции быстрой передачи подсчет ссылок
приостанавливается.

String::Length Получает длину текущего объекта String.

String::ToString Возвращает объект String, значение которого совпадает со


значением текущей строки.

Операторы
Класс String имеет следующие операторы.

Член Описание
Член Описание

Оператор Указывает, имеют ли два указанных объекта String одно и то же


String::operator== значение.

Оператор Сцепляет два объекта String в новый объект String.


operator+

Оператор Указывает, является ли значение одного объекта String большим, чем


String::operator> значение второго объекта String.

Оператор Указывает, является ли значение одного объекта String больше или


String::operator>= равным значению второго объекта String.

Оператор Указывает, имеют ли два указанных объекта String разные значения.


String::operator!=

Оператор Указывает, является ли значение одного объекта String меньшим, чем


String::operator< значение второго объекта String.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Заголовок vccorlib.h (включается по умолчанию)

Метод String::Begin
Возвращает указатель на начало текущей строки.

Синтаксис
C++

char16* Begin();

Возвращаемое значение
Указатель на начало текущей строки.
Метод String::CompareOrdinal
Статический метод, сравнивающий два String объекта путем вычисления
числовых значений соответствующих символов в двух строковых значениях,
представленных объектами.

Синтаксис
C++

static int CompareOrdinal( String^ str1, String^ str2 );

Параметры
str1

Первый объект String.

str2

Второй объект String.

Возвращаемое значение
Целое число, выражающее лексическое соотношение двух сравниваемых
значений. В следующей таблице перечислены возможные возвращаемые
значения.

Значение Условие

-1 Значение str1 меньше str2 .

0 Значение str1 равно значению str2 .

1 Значение str1 больше значения str2 .

Метод String::Concat
Объединяет значения двух объектов String.

Синтаксис
C++
String^ Concat( String^ str1, String^ str2);

Параметры
str1

Первый объект String или значение null .

str2

Второй объект String или значение null .

Возвращаемое значение
Новый объект String^, значение которого является объединением значений str1 и
str2 .

Если str1 имеет значение null , а str2 — значение, отличное от null, возвращается
значение str1 . Если str2 имеет значение null , а str1 — значение, отличное от
null, возвращается значение str2 . Если оба параметра str1 и str2 имеют значение
null , возвращается пустая строка (L"").

Метод String::Data
Возвращает указатель на начало буфера данных объекта в качестве массива
элементов char16 ( wchar_t ) в стиле языка C.

Синтаксис
C++

const char16* Data();

Возвращаемое значение
Указатель на начало const char16 массива символов Юникода ( char16 является
определением типа). wchar_t

Комментарии
Используйте этот метод для преобразования из Platform::String^ в wchar_t* . Когда
объект String выходит за пределы области, указатель Data больше не является
гарантированно допустимым. Чтобы сохранить данные за пределами времени
существования исходного String объекта, используйте wcscpy_s для копирования
массива в память, выделенную самостоятельно.

Метод String::Dispose
Высвобождает ресурсы.

Синтаксис
C++

virtual override void Dispose();

Метод String::End
Возвращает указатель на позицию после конца текущей строки.

Синтаксис
C++

char16* End();

Возвращаемое значение
Указатель на позицию после конца текущей строки.

Комментарии
End() возвращает Begin() + Length.

Метод String::Equals
Указывает, совпадает ли значение заданного объекта String со значением текущего
объекта.
Синтаксис
C++

bool String::Equals(Object^ str);


bool String::Equals(String^ str);

Параметры
str

Объект для сравнения.

Возвращаемое значение
Значение true , если str равен текущему объекту; в противном случае — значение
false .

Комментарии
Этот метод эквивалентен статической строке::CompareOrdinal. В первой перегрузке
предполагается, что параметр str может быть приведен к объекту String^.

Метод String::GetHashCode
Возвращает хэш-код данного экземпляра.

Синтаксис
C++

virtual override int GetHashCode();

Возвращаемое значение
Хэш-код данного экземпляра.

Метод String::IsEmpty
Указывает, является ли объект String пустым.
Синтаксис
C++

bool IsEmpty();

Возвращаемое значение
true , если текущий String объект имеет значение NULL или пустую строку (L"); в
противном случае false .

Метод String::IsFastPass
Указывает, участвует ли текущий объект String в операции быстрого прохода . В
операции быстрой передачи подсчет ссылок приостанавливается.

Синтаксис
C++

bool IsFastPass();

Возвращаемое значение
true Значение , false если текущий String объект находится в быстром прошлом; в

противном случае .

Комментарии
При вызове функции, где в качестве параметра используется объект с подсчетом
ссылок и вызываемая функция обращается к этому объекту только для чтения,
компилятор может безопасно приостановить подсчет ссылок, чтобы повысить
производительность вызова. Это свойство не дает никакой дополнительной пользы
для вашего кода. Система обрабатывает все сведения.

Метод String::Length
Извлекает количество символов в текущем String объекте.
Синтаксис
C++

unsigned int Length();

Возвращаемое значение
Количество символов в текущем String объекте.

Комментарии
Длина объекта String без символов равна нулю. Длина следующего объекта String
равна 5.

C++

String^ str = "Hello";

int len = str->Length(); //len = 5

Массив символов, возвращаемый string::D ata , имеет один дополнительный


символ, который является завершающим значением NULL или "\0". Этот символ
также имеет длину 2 байта.

Оператор String::operator+
Объединяет два объекта String в новый объект String .

Синтаксис
C++

bool String::operator+( String^ str1, String^ str2);

Параметры
str1

Первый объект String .


str2

Второй объект String , содержимое которого будет добавлено в str1 .

Возвращаемое значение
true Значение str1 , если значение str1 равно str2; false в противном случае .

Комментарии
Этот оператор создает объект String^ , содержащий данные из двух операндов.
Используйте его для удобства, если производительность не играет решающей
роли. Несколько вызовов " + " в функции, скорее всего, не будут иметь последствий,
но если вы имеете дело с большими объектами или текстовыми данными в
сложном цикле, используйте стандартные механизмы и типы C++.

Оператор String::operator==
Указывает, равны ли текстовые значения двух указанных объектов String.

Синтаксис
C++

bool String::operator==( String^ str1, String^ str2);

Параметры
str1

Первый из сравниваемых объектов String .

str2

Второй сравниваемый объект String .

Возвращаемое значение
true Значение str1 , false если содержимое равно str2 ; в противном случае .

Комментарии
Этот оператор эквивалентен String::CompareOrdinal.

String::operator>
Указывает, больше ли значение одного String объекта, чем значение второго
String объекта.

Синтаксис
C++

bool String::operator>( String^ str1, String^ str2);

Параметры
str1

Первый объект String .

str2

Второй объект String .

Возвращаемое значение
Значение true , если значение str1 больше str2 ; в противном случае — значение
false .

Комментарии
Этот оператор эквивалентен явному вызову String::CompareOrdinal и получен
результат больше нуля.

String::operator>=
Указывает, больше ли значение одного String объекта или равно значению
второго String объекта.

Синтаксис
C++
bool String::operator>=( String^ str1, String^ str2);

Параметры
str1

Первый объект String .

str2

Второй объект String .

Возвращаемое значение
Значение true , если значение str1 больше или равно значению str2 ; в
противном случае — значение false .

String::operator!=
Указывает, имеют ли два указанных String объекта разные значения.

Синтаксис
C++

bool String::operator!=( String^ str1, String^ str2);

Параметры
str1

Первый из сравниваемых объектов String .

str2

Второй сравниваемый объект String .

Возвращаемое значение
true , если значения str1 и str2 не равны; в противном случае — false .

String::operator<
Указывает, меньше ли значение одного String объекта, чем значение второго
String объекта.

Синтаксис
C++

bool String::operator<( String^ str1, String^ str2);

Параметры
str1

Первый объект String .

str2

Второй объект String .

Возвращаемое значение
true Значение str1, если значение str1 меньше значения str2; false в противном

случае .

Конструктор String::String
Инициализирует новый экземпляр String класса копией входных строковых
данных.

Синтаксис
C++

String();

String(char16* s);

String(char16* s, unsigned int n);

Параметры
s

Серия расширенных символов, инициализирующих строку. char16


n

Число, указывающее длину строки.

Комментарии
Если производительность является критической и вы управляете временем
существования исходной строки, можно использовать Platform::StringReference
вместо String.

Пример
C++

String^ s = L"Hello!";

String::ToString
String Возвращает объект, значение которого совпадает с текущей строкой.

Синтаксис
C++

String^ String::ToString();

Возвращаемое значение
Объект String , значение которого совпадает с текущей строкой.

См. также раздел


Пространство имен Platform
Класс Platform::StringReference
Статья • 03.04.2023

Тип оптимизации, который можно использовать для передачи строковых данных


из входных параметров Platform::String^ в другие методы с минимальным числом
операций копирования.

Синтаксис
C++

class StringReference

Remarks

Члены

Открытые конструкторы

name Описание

StringReference::StringReference Два конструктора для создания экземпляров


StringReference .

Открытые методы

name Описание

StringReference::D ata Возвращает строковые данные как массив значений char16.

StringReference::Length Возвращает число символов в строке.

StringReference::GetHSTRING Возвращает строковые данные как HSTRING.

StringReference::GetString Возвращает строковые данные как Platform::String^ .

Открытые операторы

Имя Описание
Имя Описание

StringReference::operator= Присваивает StringReference новому экземпляру


StringReference .

StringReference::operator() Преобразует StringReference в Platform::String^ .

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Заголовок: vccorlib.h

Метод StringReference::Data
Возвращает содержимое этой строки StringReference как массив значений char16.

Синтаксис
C++

const ::default::char16 * Data() const;

Возвращаемое значение
Массив текстовых символов ЮНИКОДА char16.

Метод StringReference::GetHSTRING
Возвращает содержимое строки как __abi_HSTRING .

Синтаксис
C++

__abi_HSTRING GetHSTRING() const;

Возвращаемое значение
Объект __abi_HSTRING , который содержит строковые данные.

Комментарии

Метод StringReference::GetString
Возвращает содержимое строки как Platform::String^ .

Синтаксис
C++

__declspec(no_release_return) __declspec(no_refcount)

::Platform::String^ GetString() const;

Возвращаемое значение
Объект Platform::String^ , который содержит строковые данные.

Метод StringReference::Length
Возвращает число символов в строке.

Синтаксис
C++

unsigned int Length() const;

Возвращаемое значение
Целое число без знака, указывающее число символов в строке.

Комментарии
Оператор StringReference::operator=
Присваивает указанный объект текущему объекту StringReference .

Синтаксис
C++

StringReference& operator=(const StringReference& __fstrArg);

StringReference& operator=(const ::default::char16* __strArg);

Параметры
__fstrArg

Адрес объекта StringReference , используемый для инициализации текущего


объекта StringReference .

__strArg

Указатель на массив значений char16, используемый для инициализации текущего


объекта StringReference .

Возвращаемое значение
Ссылка на объект типа StringReference .

Комментарии
Так как StringReference является стандартным классом C++, а не классом ссылки,
он не отображается в обозревателе объектов.

Оператор StringReference::operator()
Преобразует объект StringReference в объект Platform::String^ .

Синтаксис
C++

__declspec(no_release_return) __declspec(no_refcount)

operator ::Platform::String^() const;

Возвращаемое значение
Дескриптор для объекта типа Platform::String .

Конструктор StringReference::StringReference
Инициализирует новый экземпляр класса StringReference .

Синтаксис
C++

StringReference();

StringReference(const StringReference& __fstrArg);

StringReference(const ::default::char16* __strArg);

StringReference(const ::default::char16* __strArg, size_t __lenArg);

Параметры
__fstrArg

Объект StringReference , данные которого используются для инициализации нового


экземпляра.

__strArg

Указатель на массив значений char16, используемый для инициализации нового


экземпляра.

__lenArg

Число элементов в __strArg .

Комментарии
Первая версия этого конструктора является конструктором по умолчанию. Вторая
версия инициализирует новый экземпляра класса StringReference из объекта,
заданного параметром __fstrArg . Третья и четвертая перегрузки инициализируют
новый экземпляр класса StringReference из массива значений char16. char16
представляет 16-разрядный текстовый символ ЮНИКОДА.
См. также раздел
Класс Platform::StringReference
Класс Platform::Type
Статья • 26.09.2022

Содержит сведения среды выполнения о типе — в частности, имя строки и код


типа. Получается путем вызова Object:: GetType для любого объекта или с
помощью оператора typeid для имени класса или структуры.

Синтаксис
C++

public ref class Platform::Type :

Platform::Object, Platform::Details::IEquatable,

Platform::Details::IPrintable

Примечания
Класс Type удобен в приложениях, где должна выполняться непосредственная
обработка с использованием оператора if или switch , образующего ветви на
основе типа объекта времени выполнения. Код типа, описывающий категорию
типа, извлекается с помощью функции-члена Type:: GetTypeCode .

Открытые методы
Имя Описание

Метод Type:: Возвращает значение Перечисление Platform::TypeCode для


GetTypeCode объекта.

Метод Type:: ToString Возвращает имя типа, как указано в его метаданных.

Открытые свойства
Название Описание

Тип:: Возвращает Класс Platform::String^, который представляет полное имя типа и


FullName использует . (точка) как разделитель, а не:: (двойное двоеточие)
MyNamespace.MyClass , например.
Операторы преобразования
Название Описание

Тип оператора ^ Обеспечивает преобразование


Windows::UI::Xaml::Interop::TypeName в
Platform::Type .

оператор Обеспечивает преобразование Platform::Type в


Windows::UI::Xaml::Interop::TypeName Windows::UI::Xaml::Interop::TypeName .

Requirements (Требования)
минимальный поддерживаемый клиент: Windows 8

минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: Platform. winmd

Свойство Type::FullName
Возвращает полное имя текущего типа в форме Namespace.Type .

Синтаксис
C++

String^ FullName();

Возвращаемое значение
Имя типа.

Пример
C++

// namespace is TestApp

MainPage::MainPage()

InitializeComponent();

Type^ t = this->GetType();

auto s = t->FullName; // returns "TestApp.MainPage"

auto s2 = t->ToString(); //also returns "TestApp.MainPage"

Метод Type::GetTypeCode
Возвращает числовой тип категории встроенных типов.

Синтаксис
C++

Platform::TypeCode GetTypeCode();

Возвращаемое значение
Одно из значений перечисления Platform::TypeCode.

Примечания
Эквивалентом метода-члена GetTypeCode() является свойство typeid .

Метод Type:: ToString


Возвращает имя типа.

Синтаксис
C++

Platform::String^ ToString();

Возвращаемое значение
Имя типа, как указано в метаданных.
См. также
Пространство имен Platform
оператор Type^
Статья • 03.04.2023

Включает преобразование из Windows::UI::Xaml::Interop::TypeName в


Platform::Type .

Синтаксис
C++

Operator Type^(Windows::UI::Xaml::Interop::TypeName typeName);

Возвращаемое значение
Возвращает Platform::Type при получении Windows::UI::Xaml::Interop::TypeName.

Комментарии
TypeName является независимой от языка структурой среды выполнения Windows
для представления сведений о типе. Platform::Type предназначен для C++ и не
может передаваться через двоичный интерфейс приложения (ABI). Ниже
представлен один из способов использования TypeName в функции Navigate .

rootFrame->Navigate(TypeName(MainPage::typeid), e->Arguments);

Пример
В следующем примере показано преобразование из TypeName в Type и наоборот.

// Convert from Type to TypeName

TypeName tn = TypeName(MainPage::typeid);

// Convert back from TypeName to Type

Type^ tx2 = (Type^)(tn);

Эквивалент .NET Framework


платформа .NET Framework программный проект TypeName какType

Требования

См. также раздел


оператор Windows::UI::Xaml::Interop::TypeName

Класс Platform::Type
Перечисление Platform::TypeCode
Статья • 03.04.2023

Указывает категорию чисел, представляющую встроенный тип.

Синтаксис
C++

enum class TypeCode {};

Члены

Код типа Описание

Логическое Тип Platform::Boolean.

Char16 Тип default::char16.

Дата и время Тип DateTime.

Decimal Числовой тип.

Double Тип default::float64.

Empty Void

Int16 Тип default::int16.

Int32 Тип default::int32.

Int64 Тип default::int64.

Int8 Тип default::int8.

Объект Тип Platform::Object.

Один Тип default::float32.

Строка Тип Platform::String.

UInt16 Тип default::uint16.

UInt32 Тип default::uint32.

UInt64 Тип default::uint64.


Код типа Описание

UInt8 Тип default::uint8.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd
Класс значений Platform::UIntPtr
Статья • 03.04.2023

Представляет указатель без знака, размер которого соответствует платформе (32-


разрядной или 64-разрядной).

Синтаксис
C++

public value struct UintPtr

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Пространство имен Platform
Platform::ValueType - класс
Статья • 03.04.2023

Базовый класс для экземпляров типов значений.

Синтаксис
C++

public ref class ValueType : Object

Открытые методы
Имя Описание

ValueType::ToString Возвращает строковое представление объекта. Наследуется от


Platform::Object.

Комментарии
Класс ValueType используется для создания типов значений. Класс ValueType
является производным от класса Object, который содержит базовые элементы.
Однако компилятор отсоединяет эти базовые элементы от типов значений,
которые являются производными от класса ValueType. При упаковке типа значения
компилятор снова присоединяет эти базовые элементы.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

Метод ValueType::ToString
Возвращает строковое представление объекта.
Синтаксис
C++

Platform::String ToString();

Возвращаемое значение
Объект Platform::String, представляющий значение .

См. также раздел


Пространство имен Platform
Класс Platform::WeakReference
Статья • 03.04.2023

Представляет слабую ссылку на экземпляр класса ссылок.

Синтаксис
C++

class WeakReference

Параметры

Члены

Конструкторы

Член Описание

WeakReference::WeakReference Инициализирует новый экземпляр класса WeakReference.

Методы

Член Описание

WeakReference::Resolve Возвращает дескриптор базовому классу ссылок или значение


nullptr, если объект больше не существует.

Операторы

Член Описание

WeakReference::operator= Присваивает новое значение объекту WeakReference.

WeakReference::operator BoolType Реализует шаблон безопасного логического поведения.

Комментарии
Класс WeakReference сам не является классом ссылок и поэтому не наследуется от
Platform::Object^ и не может использоваться в сигнатуре открытого метода.

WeakReference::operator=
Присваивает значение WeakReference.

Синтаксис
C++

WeakReference& operator=(decltype(__nullptr));

WeakReference& operator=(const WeakReference& otherArg);

WeakReference& operator=(WeakReference&& otherArg);

WeakReference& operator=(const volatile ::Platform::Object^ const otherArg);

Remarks
Последняя перегрузка в списке выше позволяет назначить класс ссылок
переменной WeakReference. В этом случае класс ссылки понижается к
Platform::Object^. Исходный тип восстанавливается позже, указав его в качестве
аргумента для параметра type в функции-члене WeakReference::Resolve<T> .

WeakReference::operator BoolType
Реализует безопасный шаблон bool для класса WeakReference. Не предназначен
для явного вызова в коде.

Синтаксис
C++

BoolType BoolType();

Метод WeakReference::Resolve (пространство


имен Platform)
Возвращает дескриптор для исходного класса ссылок или nullptr , если объект
больше не существует.
Синтаксис
C++

template<typename T>

T^ Resolve() const;

Параметры

Значение свойства/возвращаемое значение


Дескриптор класс ссылок, с которым ранее был связан объект WeakReference, или
значение nullptr.

Пример
C++

Bar^ bar = ref new Bar();

//use bar...

if (bar != nullptr)

WeakReference wr(bar);

Bar^ newReference = wr.Resolve<Bar>();

Обратите внимание, что параметр типа — T, а не T^.

Конструктор WeakReference::WeakReference
Предоставляет различные способы построения WeakReference.

Синтаксис
C++

WeakReference();

WeakReference(decltype(__nullptr));

WeakReference(const WeakReference& otherArg);

WeakReference(WeakReference&& otherArg);

explicit WeakReference(const volatile ::Platform::Object^ const otherArg);

Пример
C++

MyClass^ mc = ref new MyClass();

WeakReference wr(mc);

MyClass^ copy2 = wr.Resolve<MyClass>();

См. также раздел


Пространство имен Platform
Класс Platform::WriteOnlyArray
Статья • 03.04.2023

Представляет одномерный массив, который используется в качестве входного


параметра, когда вызывающая сторона передает массив в метод для заполнения.

Этот класс ссылок объявлен в vccorlib.h как закрытый; следовательно, он не


передается в метаданные и использовать его можно только из С++. Этот класс
предназначен для использования только в качестве входного параметра, который
получает массив, выделенный вызывающим объектом. Его невозможно построить
из пользовательского кода. Оно позволяет методу C++ осуществлять запись
непосредственно в этот массив — шаблон, известный как FillArray .
Дополнительные сведения см. в разделе Array и WriteOnlyArray.

Синтаксис
C++

private ref class WriteOnlyArray<T, 1>

Элементы

Открытые методы
Эти методы имеют внутреннюю доступность, то есть доступны только в
компоненте или приложении С++.

Имя Описание

WriteOnlyArray::begin Итератор, который указывает на первый элемент массива.

WriteOnlyArray::D ata Указатель на буфер данных.

WriteOnlyArray::end Итератор, указывающий на элемент, следующий за последним


элементом в массиве.

WriteOnlyArray::FastPass Указывает, сможет ли массив использовать механизм FastPass, то


есть прозрачную оптимизацию, выполняемую системой. Не
используйте это в коде

WriteOnlyArray::Length Возвращает число элементов в массиве.


Имя Описание

WriteOnlyArray::set Присваивает заданному элементу заданное значение.

Иерархия наследования
WriteOnlyArray

Требования
Параметр компилятора: /ZW

Метаданные: Platform.winmd

Пространство имен: Platform

WriteOnlyArray::begin - метод
Возвращает указатель на первый элемент массива.

Синтаксис
C++

T* begin() const;

Возвращаемое значение
Указатель на первый элемент массива.

Комментарии
Этот итератор можно использовать с алгоритмами STL, такими как std::sort , для
выполнения действий с элементами в массиве.

Свойство WriteOnlyArray::Data
Указатель на буфер данных.
Синтаксис
C++

property T* Data{

T* get() const;

Возвращаемое значение
Указатель на необработанные байты массива.

WriteOnlyArray::end - метод
Возвращает указатель на элемент, следующий за последним элементом в массиве.

Синтаксис
C++

T* end() const;

Возвращаемое значение
Итератор указателя на элемент, следующий за последним элементом в массиве.

Комментарии
Этот итератор можно использовать с алгоритмами STL для выполнения операций,
таких как std::sort , в элементах массива.

Свойство WriteOnlyArray::FastPass
Указывает, можно ли выполнить внутреннюю оптимизацию FastPass. Не
предназначен для использования в пользовательском коде.

Синтаксис
C++
property bool FastPass{

bool get() const;

Возвращаемое значение
Логическое значение, указывающее, является ли массив FastPass.

WriteOnlyArray::get - метод
Возвращает элемент по указанному индексу.

Синтаксис
C++

T& get(unsigned int indexArg) const;

Параметры
indexArg

Используемый индекс.

Возвращаемое значение

Свойство WriteOnlyArray::Length
Возвращает число элементов в выделенном вызывающим объектом массиве.

Синтаксис
C++

property unsigned int Length{

unsigned int get() const;

Возвращаемое значение
Количество элементов в массиве.

Функция WriteOnlyArray::set
Задает указанное значение по заданному индексу массива.

Синтаксис
C++

T& set(

unsigned int indexArg,

T valueArg);

Параметры
indexArg

Задаваемый индекс элемента.

valueArg

Задаваемое в indexArg значение.

Возвращаемое значение
Ссылка на элемент, который только что был установлен.

Комментарии
Дополнительные сведения о том, как интерпретировать значение HRESULT, см. в
разделе "Структура кодов ошибок COM".

См. также раздел


Пространство имен платформы

Создание компонентов среды выполнения Windows в C++


Класс Platform::WrongThreadException
Статья • 03.04.2023

Вызывается, если поток выполняет вызов посредством указателя на интерфейс для


прокси-объекта, который не принадлежит подразделению потока.

Синтаксис
C++

public ref class WrongThreadException : COMException, IException,


IPrintable, IEquatable

Remarks
Дополнительные сведения см. в описании класса COMException.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform

Метаданные: platform.winmd

См. также раздел


Класс Platform::COMException
Пространство имен
Platform::Collections
Статья • 03.04.2023

Пространство имен Platform::Collections содержит классы Map , MapView , Vector и


VectorView . Эти классы являются конкретными реализациями соответствующих

интерфейсов, которые определены в пространстве имен


Windows::Foundation::Collections . Конкретные типы коллекций не могут
переноситься через интерфейс ABI (например, когда программа JavaScript или C#
вызывает компонент C++), но они могут неявно преобразоваться в
соответствующие типы интерфейсов. Например, если вы реализуете открытый
метод, который заполняет и возвращает коллекцию, используйте
Platform::Collections::Vector для внутренней реализации коллекции и
Windows::Foundation::Collections::IVector в качестве возвращаемого типа.
Дополнительные сведения см. в разделах Коллекции и Создание компонентов
среда выполнения Windows в C++.

Можно создать Platform::Collections::Vector из std::vector и Platform::Collections::Map


из std::map.

Кроме того, пространство имен Platform::Collections обеспечивает поддержку


итераторы обратной вставки и ввода, а также Vector итераторы VectorView .

Чтобы использовать типы в пространстве имен Platform::Collections, необходимо


включить ( #include ) заголовок collection.h.

Синтаксис
C++

#include <collection.h>
using namespace Platform::Collections;

Члены
Это пространство имен содержит следующие члены.

Имя Описание
Имя Описание

Класс Представляет итератор, который вставляет элемент


Platform::Collections::BackInsertIterator в конец коллекции.

Класс Представляет итератор, который вставляет элемент


Platform::Collections::InputIterator в начало коллекции.

Класс Platform::Collections::Map Представляет изменяемую коллекцию пар "ключ-


значение", доступ к которым можно получить по
ключу. Аналогично std::map.

Класс Platform::Collections::MapView Представляет доступную только для чтения


коллекцию пар "ключ-значение", доступ к которым
можно получить по ключу.

Класс Platform::Collections::Vector Представляет изменяемую последовательность


элементов. Аналогично std::vector.

Класс Представляет итератор, который обходит


Platform::Collections::VectorIterator коллекцию Vector .

Класс Platform::Collections::VectorView Представляет доступную только для чтения


последовательность элементов.

Класс Представляет итератор, который обходит


Platform::Collections::VectorViewIterator коллекцию VectorView .

Иерархия наследования
Пространство имен Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform::Collections

Параметр компилятора: /ZW

См. также раздел


Пространство имен платформы
Класс
Platform::Collections::BackInsertIterator
Статья • 03.04.2023

Представляет итератор, который вставляет, а не перезаписывает элементы в конец


упорядоченной коллекции.

Синтаксис

template <typename T>

class BackInsertIterator :

public ::std::iterator<::std::output_iterator_tag, void, void, void, void>;

Параметры

Тип элемента в текущей коллекции.

Комментарии
Класс BackInsertIterator реализует правила, необходимые для back_insert_iterator
Class.

Члены

Открытые конструкторы

name Описание

BackInsertIterator::BackInsertIterator Инициализирует новый экземпляр класса


BackInsertIterator.

Открытые операторы

Имя Описание
Имя Описание

Оператор Получает ссылку на текущий объект BackInsertIterator.


BackInsertIterator::operator*

Оператор Возвращает ссылку на текущий объект BackInsertIterator.


BackInsertIterator::operator++ Итератор не изменяется.

Оператор Добавляет указанный объект в конец текущей


BackInsertIterator::operator= упорядоченной коллекции.

Иерархия наследования
BackInsertIterator

Требования
Заголовок: collection.h

Пространство имен: Platform::Collections

BackInsertIterator::BackInsertIterator -
конструктор
Инициализирует новый экземпляр класса BackInsertIterator .

Синтаксис

explicit BackInsertIterator(

Windows::Foundation::Collections::IVector<T>^ v);

Параметры

Объект IVector<T> .

Комментарии
BackInsertIterator вставляет элементы после последнего элемента объекта,

указанного параметром v .

BackInsertIterator::operator= - оператор
Добавляет указанный объект в конец текущей упорядоченной коллекции.

Синтаксис

BackInsertIterator& operator=( const T& t);

Параметры

Объект, добавляемый к текущей коллекции.

Возвращаемое значение
Ссылка на текущий объект BackInsertIterator.

BackInsertIterator::operator* - оператор
Получает ссылку на текущий объект BackInsertIterator.

Синтаксис

BackInsertIterator& operator*();

Возвращаемое значение
Ссылка на текущий объект BackInsertIterator.

Комментарии
Этот оператор возвращает ссылку на текущий BackInsertIterator, а не на любой
элемент в текущей коллекции.

BackInsertIterator::operator++ - оператор
Возвращает ссылку на текущий объект BackInsertIterator. Итератор не изменяется.

Синтаксис

BackInsertIterator& operator++();

BackInsertIterator operator++(int);

Возвращаемое значение
Ссылка на текущий объект BackInsertIterator.

Комментарии
Выражение в первом примере синтаксиса увеличивает значение текущего
элемента BackInsertIterator перед его использованием, а во втором — после его
использования. Тип int во втором примере синтаксиса задает операцию
увеличения после использования, он не является операндом целочисленного типа.

Впрочем, этот оператор не изменяет объект BackInsertIterator. Вместо этого он


возвращает ссылку на текущий итератор, остающийся неизменным. Это то же
поведение, что и оператор*.

См. также раздел


Пространство имен платформы
Класс
Platform::Collections::InputIterator
Статья • 03.04.2023

Предоставляет объект InputIterator стандартной библиотеки шаблонов для


коллекций, производных от среда выполнения Windows.

Синтаксис

template <typename X>

class InputIterator;

Параметры

Имя типа класса шаблона InputIterator.

Элементы

Общедоступные определения типов

Имя Описание

difference_type Различие указателя (ptrdiff_t).

iterator_category Категория итератора ввода (:: std::input_iterator_tag).

pointer Указатель на const X

reference Ссылка на объект const X

value_type Имя типа X .

Открытые конструкторы

name Описание

InputIterator::InputIterator Инициализирует новый экземпляр класса InputIterator.


Открытые операторы

Имя Описание

Оператор Указывает, отличен ли текущий объект InputIterator от


InputIterator::operator!= указанного объекта InputIterator.

Оператор Извлекает ссылку на элемент, указанный текущим итератором


InputIterator::operator* InputIterator.

Оператор Выполняет приращение текущего итератора InputIterator.


InputIterator::operator++

Оператор Указывает, равен ли текущий объект InputIterator указанному


InputIterator::operator== объекту InputIterator.

InputIterator::operator-> Извлекает адрес элемента, на который ссылается текущий


Operator итератор InputIterator.

Иерархия наследования
InputIterator

Требования
Заголовок: collection.h

Пространство имен: Platform::Collections

Конструктор InputIterator::InputIterator
Инициализирует новый экземпляр класса InputIterator.

Синтаксис

InputIterator();

explicit InputIterator(Windows::Foundation::Collections<X>^ iterator);

Параметры
Итератор

Объект итератора.

Оператор InputIterator::operator->
Извлекает адрес элемента, указанного текущим итератором InputIterator.

Синтаксис

pointer operator->() const;

Возвращаемое значение
Адрес элемента, указанного текущим итератором InputIterator.

Оператор InputIterator::operator*
Извлекает ссылку на элемент, указанный текущим итератором InputIterator.

Синтаксис

reference operator*() const;

Возвращаемое значение
Элемент, указанный текущим итератором InputIterator.

InputIterator::operator== - оператор
Указывает, равен ли текущий объект InputIterator указанному объекту InputIterator.

Синтаксис
bool operator== (const InputIterator& other) const;

Параметры
Других

Другой объект InputIterator.

Возвращаемое значение
true Значение , если текущий итератор InputIterator равен другому; в противном

случае — false .

InputIterator::operator++ - оператор
Выполняет приращение текущего итератора InputIterator.

Синтаксис

InputIterator& operator++();

InputIterator operator++(int);

Возвращаемое значение
Первый синтаксис выполняет приращение текущего итератора InputIterator и
возвращает его. Второй синтаксис возвращает копию текущего итератора
InputIterator, а затем выполняет приращение текущего итератора InputIterator.

Комментарии
Первый синтаксис InputIterator выполняет приращение текущего итератора
InputIterator перед его использованием.

Второй синтаксис выполняет приращение текущего итератора InputIterator после


его использования. Тип int во втором примере синтаксиса задает операцию
увеличения после использования, он не является операндом целочисленного типа.

InputIterator::operator!= - оператор
Указывает, отличен ли текущий объект InputIterator от указанного объекта
InputIterator.

Синтаксис

bool operator!=(const InputIterator& other) const;

Параметры
Других

Другой объект InputIterator.

Возвращаемое значение
true Значение , если текущий итератор InputIterator не равен другому; в

противном случае — false .

См. также раздел


Пространство имен платформы
Класс Platform::Collections::Map
Статья • 03.04.2023

Представляет сопоставление, являющееся коллекцией пар "ключ-значение".


Реализует Windows::Foundation::Collections::IObservableMap , чтобы упростить
привязку данных XAML.

Синтаксис
C++

template <

typename K,

typename V,

typename C = std::less<K>>

ref class Map sealed;

Параметры
K

Тип ключа в паре "ключ-значение".

Тип значения в паре "ключ-значение".

Тип, предоставляющий объект функции, который может сравнить два значения


элементов как ключи сортировки для определения их относительного порядка в
объекте Map. По умолчанию std::less<K>.

__is_valid_winrt_type() Созданная компилятором функция, которая проверяет тип K и


V и предоставляет понятное сообщение об ошибке, если тип не может быть
сохранен в сопоставлении.

Комментарии
Допустимые типы:

integers

класс interface^
открытый ссылочный класс ^

структура значений

открытый класс перечисления

Карта — это, по сути, программа-оболочка для std::map. Это конкретная


реализация типов
Windows::Foundation::Collections::IMap<Windows::Foundation::Collections::IKeyValuePai
r<K,V>> и IObservableMap, которые передаются через общедоступные интерфейсы
среда выполнения Windows. При попытке использования типа
Platform::Collections::Map в открытом возвращаемом значении или параметре
возникает ошибка компилятора C3986. Эту ошибку можно исправить, изменив тип
параметра или возвращаемое значение на
Windows::Foundation::Collections::IMap<K,V>.

Дополнительные сведения см. в разделе Коллекции.

Члены

Открытые конструкторы

name Описание

Карта::Карта Инициализирует новый экземпляр класса Map.

Открытые методы

name Описание

Map::Clear Удаляет все пары "ключ-значение" из текущего объекта Map.

Map::First Возвращает итератор, указывающий первый элемент в сопоставлении.

Map::GetView Возвращает представление текущего объекта Map, доступное только для


чтения (т. е. Platform::Collections::MapView Class).

Map::HasKey Определяет, содержит ли текущий объект Map указанный ключ.

Map::Insert Добавляет в текущий объект Map указанную пару "ключ-значение".

Map::Lookup Извлекает элемент по указанному ключу в текущем объекте Map.

Map::Remove Удаляет указанную пару "ключ-значение" из текущего объекта Map.


name Описание

Map::Size Возвращает количество элементов в текущем объекте Map.

События

Имя Описание

Событие Map::MapChanged Происходит при изменении объекта Map.

Иерархия наследования
Map

Требования
Заголовок: collection.h

Пространство имен: Platform::Collections

Метод Map::Clear
Удаляет все пары "ключ-значение" из текущего объекта Map.

Синтаксис
C++

virtual void Clear();

Метод Map::First
Возвращает итератор, указывающий первый элемент в сопоставлении или nullptr ,
если сопоставление пусто.

Синтаксис
C++
virtual Windows::Foundation::Collections::IIterator<

Windows::Foundation::Collections::IKeyValuePair<K, V>^>^ First();

Возвращаемое значение
Итератор, указывающий первый элемент на карте.

Комментарии
Удобный способ хранения итератора, возвращаемого first(), заключается в
присвоении возвращаемого значения переменной, объявленной с помощью
ключевого слова вычета auto типа. Например, auto x = myMap->First(); .

Метод Map::GetView
Возвращает доступное только для чтения представление текущей карты; То есть
класс Platform::Collections::MapView, реализующий интерфейс
Windows::Foundation::Collections::IMapView<K,V> .

Синтаксис
C++

Windows::Foundation::Collections::IMapView<K, V>^ GetView();

Возвращаемое значение
Объект MapView .

Метод Map::HasKey
Определяет, содержит ли текущий объект Map указанный ключ.

Синтаксис
C++

bool HasKey(K key);

Параметры
key

Ключ, используемый для поиска элемента Map. Тип ключа — typename K.

Возвращаемое значение
true Значение , если ключ найден; в противном случае — false .

Метод Map::Insert
Добавляет в текущий объект Map указанную пару "ключ-значение".

Синтаксис
C++

virtual bool Insert(K key, V value);

Параметры
key

Ключ из пары "ключ-значение". Тип ключа — typename K.

value

Значение из пары "ключ-значение". Тип значения — typename V.

Возвращаемое значение
true Значение , если ключ существующего элемента в текущем объекте Map
соответствует ключу , а для части значения этого элемента задано значение value.
false Значение , если нет существующего элемента в текущей карте,
совпадающего с ключом , и параметры "ключ - значение " превращаются в пару
"ключ-значение", а затем добавляются в текущую карту.

Метод Map::Lookup
Возвращает значение типа V, связанное с указанным ключом типа K, если ключ
существует.
Синтаксис
C++

V Lookup(K key);

Параметры
key

Ключ, используемый для поиска элемента на карте. Тип ключа — typename K.

Возвращаемое значение
Значение, которое связано с ключом. Тип возвращаемого значения — typename V.

Комментарии
Если ключ не существует, создается исключение Platform::OutOfBoundsException .

Map::Map - конструктор
Инициализирует новый экземпляр класса Map.

Синтаксис
C++

explicit Map(const C& comp = C());

explicit Map(const StdMap& m);

explicit Map(StdMap&& m ;

template <typename InIt>

Map(

InItfirst,

InItlast,

const C& comp = C());

Параметры
Init

Имя типа текущего объекта Map.


comp

Тип, предоставляющий объект функции, который может сравнить два значения


элементов как ключи сортировки для определения их относительного порядка в
объекте Map.

Ссылка или rvalue на объект , используемый map Class для инициализации текущей
схемы.

first

Итератор ввода первого элемента в диапазоне элементов, используемый для


инициализации текущего объекта Map.

last

Итератор ввода первого элемента после диапазона элементов, используемый для


инициализации текущего объекта Map.

Событие Map::MapChanged
Возникает, когда элемент вставляется в сопоставление или удаляется из него.

Синтаксис
C++

event Windows::Foundation::Collections::MapChangedEventHandler<K,V>^
MapChanged;

Значение свойства/возвращаемое значение


Объект MapChangedEventHandler<K,V>, содержащий сведения об объекте,
который вызвал событие, и о типе произошедших изменений. См. также
IMapChangedEventArgs<K> и CollectionChange Enumeration.

Эквивалент .NET Framework


среда выполнения Windows приложения, использующие IMap< проекта C# или
Visual Basic K,V> — IDictionary<K,V>.

Метод Map::Remove
Удаляет указанную пару "ключ-значение" из текущего объекта Map.

Синтаксис
C++

virtual void Remove(K key);

Параметры
key

Ключ из пары "ключ-значение". Тип ключа — typename K.

Метод Map::Size
Возвращает количество элементов
Windows::Foundation::Collections::IKeyValuePair<K,V> в map.

Синтаксис
C++

virtual property unsigned int Size;

Возвращаемое значение
Количество элементов в объекте Map.

См. также раздел


Коллекции (C++/CX)

Пространство имен платформы

Создание компонентов среды выполнения Windows в C++


Класс Platform::Collections::MapView
Статья • 03.04.2023

Представляет доступное только для чтения представление на карте, которое


является коллекцией пар "ключ-значение".

Синтаксис

template <

typename K,

typename V,

typename C = ::std::less<K>>

ref class MapView sealed;

Параметры

Тип ключа в паре "ключ-значение".

Тип значения в паре "ключ-значение".

Тип, предоставляющий объект функции, который может сравнить значения двух


элементов как ключи сортировки, чтобы определить их относительный порядок в
объекте MapView. По умолчанию — std::less<K>.

Комментарии
MapView — это конкретная реализация интерфейса
Windows::Foundation::Collections::IMapView <K,V> , которая передается через
двоичный интерфейс приложения (ABI). Дополнительные сведения см. в разделе
Collections (C++/CX).

Члены

Открытые конструкторы
name Описание

MapView::MapView Инициализирует новый экземпляр класса MapView.

Открытые методы

name Описание

MapView::First Возвращает итератор, который инициализируется первым элементом в


представлении карты.

MapView::HasKey Определяет, содержит ли текущий объект MapView указанный ключ.

MapView::Lookup Извлекает элемент по указанному ключу в текущем объекте MapView.

MapView::Size Возвращает количество элементов в текущем объекте MapView.

MapView::Split Разделяет исходный объект MapView на два объекта MapView.

Иерархия наследования
MapView

Требования
Заголовок: collection.h

Пространство имен: Platform::Collections

MapView::First - метод
Возвращает итератор, указывающий первый элемент в представлении
сопоставления.

Синтаксис

virtual Windows::Foundation::Collections::IIterator<

Windows::Foundation::Collections::IKeyValuePair<K, V>^>^ First();

Возвращаемое значение
Итератор, указывающий первый элемент в представлении сопоставления.

Комментарии
Для хранения итератора, возвращаемого функцией First(), удобно присвоить
возвращаемое значение переменной, объявленной с ключевым словом вычета
auto типа. Например, auto x = myMapView->First(); .

MapView::HasKey - метод
Определяет, содержит ли текущий объект MapView указанный ключ.

Синтаксис

bool HasKey(K key);

Параметры
key

Ключ, используемый для поиска элемента MapView. Тип ключа — typename K.

Возвращаемое значение
true Значение , если ключ найден; в противном случае — false .

MapView::Lookup - метод
Возвращает значение типа V, связанное с указанным ключом типа K.

Синтаксис

V Lookup(K key);

Параметры
key

Ключ, используемый для поиска элемента в объекте MapView. Тип — key typename
K.

Возвращаемое значение
Значение, связанное с ключом key . Тип возвращаемого значения — typename V.

MapView::MapView - конструктор
Инициализирует новый экземпляр класса MapView.

Синтаксис
C++

explicit MapView(const C& comp = C());

explicit MapView(const ::std::map<K, V, C>& m);

explicit MapView(std::map<K, V, C>&& m);

template <typename InIt> MapView(


InIt first,

InIt last,

const C& comp = C());

MapView(

::std::initializer_list<std::pair<const K, V>> il,

const C& comp = C());

Параметры
Init

Имя типа текущего объекта MapView.

comp

Тип, предоставляющий объект функции, который может сравнить два значения


элементов в качестве ключей сортировки для определения их относительного
порядка в объекте MapView.

Ссылка или Lvalues и Rvalues на объект , используемый map Class для


инициализации текущего элемента MapView.

first

Итератор ввода первого элемента в диапазоне элементов, используемый для


инициализации текущего объекта MapView.

last

Итератор ввода первого элемента после диапазона элементов, используемый для


инициализации текущего объекта MapView.

Il

Std::initializer_list<std::p air<K,V>>, элементы которого будут вставлены в MapView.

Метод MapView::Size
Возвращает количество элементов в текущем объекте MapView.

Синтаксис
C++

virtual property unsigned int Size;

Возвращаемое значение
Количество элементов в текущем объекте MapView.

Метод MapView::Split
Разделяет текущий объект MapView на два объекта MapView. Этот метод не
выполняет никаких действий.

Синтаксис
C++

void Split(

Windows::Foundation::Collections::IMapView<

K, V>^ * firstPartition,

Windows::Foundation::Collections::IMapView<

K, V>^ * secondPartition);

Параметры
firstPartition

Первая часть исходного объекта MapView.

secondPartition

Вторая часть исходного объекта MapView.

Комментарии
Этот метод не выполняет никаких действий.

См. также раздел


Пространство имен платформы
Класс
Platform::Collections::UnorderedMap
Статья • 03.04.2023

Представляет неупорядоченное сопоставление, являющееся коллекцией пар


"ключ-значение".

Синтаксис
C++

template <

typename K,

typename V,

typename C = std::equal_to<K>

>

ref class Map sealed;

Параметры

Тип ключа в паре "ключ-значение".

Тип значения в паре "ключ-значение".

Тип, предоставляющий объект функции, который может сравнить два значения


элементов как ключи сортировки для определения их относительного порядка в
объекте Map. По умолчанию std::equal_to<K>.

Комментарии
Допустимые типы:

integers

класс interface^

открытый ссылочный класс ^


структура значений

открытый класс перечисления

UnorderedMap по сути является оболочкой для std::unordered_map, которая


поддерживает хранение типов среда выполнения Windows. Это конкретная
реализация типов Windows::Foundation::Collections::IMap и IObservableMap, которые
передаются через общедоступные интерфейсы среда выполнения Windows. При
попытке использования типа Platform::Collections::UnorderedMap в открытом
возвращаемом значении или параметре возникает ошибка компилятора C3986. Вы
можете исправить ошибку, изменив тип параметра или возвращаемого значения
на Windows::Foundation::Collections::IMap.

Дополнительные сведения см. в разделе Коллекции.

Члены

Открытые конструкторы

name Описание

UnorderedMap::UnorderedMap Инициализирует новый экземпляр класса Map.

Открытые методы

name Описание

UnorderedMap::Clear Удаляет все пары "ключ-значение" из текущего объекта Map.

UnorderedMap::First Возвращает итератор, указывающий первый элемент в


сопоставлении.

UnorderedMap::GetView Возвращает доступное только для чтения представление текущего


сопоставления, то есть класс
Platform::Collections::UnorderedMapView.

UnorderedMap::HasKey Определяет, содержит ли текущий объект Map указанный ключ.

UnorderedMap::Insert Добавляет в текущий объект Map указанную пару "ключ-


значение".

UnorderedMap::Lookup Извлекает элемент по указанному ключу в текущем объекте Map.

UnorderedMap::Remove Удаляет указанную пару "ключ-значение" из текущего объекта


Map.
name Описание

UnorderedMap::Size Возвращает количество элементов в текущем объекте Map.

События

Имя Описание

Событие Map::MapChanged Происходит при изменении объекта Map.

Иерархия наследования
UnorderedMap

Требования
Заголовок: collection.h

Пространство имен: Platform::Collections

Метод UnorderedMap::Clear
Удаляет все пары "ключ-значение" из текущего объекта UnorderedMap.

Синтаксис
C++

virtual void Clear();

Метод UnorderedMap::First
Возвращает итератор, указывающий первый элемент
Windows::Foundation::Collections::IKeyValuePair<K,V> в неупорядоченной карте.

Синтаксис
C++
virtual Windows::Foundation::Collections::IIterator<

Windows::Foundation::Collections::IKeyValuePair<K, V>^>^

First();

Возвращаемое значение
Итератор, указывающий первый элемент на карте.

Комментарии
Удобный способ хранения итератора, возвращаемого first(), заключается в
присвоении возвращаемого значения переменной, объявленной с помощью
ключевого слова вычета auto типа. Например, auto x = myUnorderedMap->First(); .

Метод UnorderedMap::GetView
Возвращает доступное только для чтения представление текущего объекта
UnorderedMap; То есть класс Platform::Collections::UnorderedMapView ,
реализующий интерфейс Windows::Foundation::Collections::IMapView::IMapView .

Синтаксис
C++

Windows::Foundation::Collections::IMapView<K, V>^ GetView();

Возвращаемое значение
Объект UnorderedMapView .

Метод UnorderedMap::HasKey
Определяет, содержит ли текущий объект UnorderedMap указанный ключ.

Синтаксис
C++
bool HasKey(

K key

);

Параметры
key

Ключ, используемый для поиска элемента UnorderedMap. Тип ключа — typename K.

Возвращаемое значение
true Значение , если ключ найден; в противном случае — false .

Метод UnorderedMap::Insert
Добавляет в текущий объект UnorderedMap указанную пару "ключ-значение".

Синтаксис
C++

virtual bool Insert(

K key,

V value

);

Параметры
key

Ключ из пары "ключ-значение". Тип ключа — typename K.

value

Значение из пары "ключ-значение". Тип значения — typename V.

Возвращаемое значение
true Значение , если ключ существующего элемента в текущем объекте Map
соответствует ключу , а для части значения этого элемента задано значение value.
false Значение , если нет существующего элемента в текущей карте,
совпадающего с ключом , и параметры ключа и значения превращаются в пару
"ключ-значение", а затем добавляются в текущую карту UnorderedMap.

Метод UnorderedMap::Lookup
Возвращает значение типа V, связанное с указанным ключом типа K.

Синтаксис
C++

V Lookup(

K key

);

Параметры
key

Ключ, используемый для поиска элемента в объекте UnorderedMap. Тип ключа —


typename K.

Возвращаемое значение
Значение, связанное с ключом. Тип возвращаемого значения — typename V.

UnorderedMap::MapChanged
Возникает, когда элемент вставляется в сопоставление или удаляется из него.

Синтаксис
C++

event Windows::Foundation::Collections::MapChangedEventHandler<K,V>^
MapChanged;

Значение свойства/возвращаемое значение


Объект MapChangedEventHandler<K,V>, содержащий сведения об объекте,
вызвавом событие, и о типе произошедшего изменения. См. также
IMapChangedEventArgs<K> и Перечисление CollectionChange.

Эквивалент .NET Framework


среда выполнения Windows приложения, которые мы C# или Visual Basic проект
IMap< K,V> как IDictionary<K,V>.

Метод UnorderedMap::Remove
Удаляет указанную пару "ключ-значение" из текущего объекта UnorderedMap.

Синтаксис
C++

virtual void Remove(

K key);

Параметры
key

Ключ из пары "ключ-значение". Тип ключа — typename K.

Метод UnorderedMap::Size
Возвращает количество элементов
Windows::Foundation::Collections::IKeyValuePair<K,V> в UnorderedMap.

Синтаксис
C++

virtual property unsigned int Size;

Возвращаемое значение
Количество элементов в объекте UnorderedMap.
Конструктор UnorderedMap::UnorderedMap
Инициализирует новый экземпляр класса UnorderedMap.

Синтаксис
C++

UnorderedMap();

explicit UnorderedMap(

size_t n

);

UnorderedMap(

size_t n,

const H& h

);

UnorderedMap(

size_t n,

const H& h,

const P& p

);

explicit UnorderedMap(

const std::unordered_map<K, V, H, P>& m

);

explicit UnorderedMap(

std::unordered_map<K, V, H, P>&& m

);

template <typename InIt>

UnorderedMap(

InIt first,

InIt last

);

template <typename InIt>

UnorderedMap(

InIt first,

InIt last,

size_t n

);

template <typename InIt>

UnorderedMap(

InIt first,

InIt last,

size_t n,

const H& h

);

template <typename InIt>

UnorderedMap(

InIt first,

InIt last,

size_t n,

const H& h,

const P& p

);

UnorderedMap(

std::initializer_list< std::pair<const K, V>> il

);

UnorderedMap(

std::initializer_list< std::pair<const K, V>> il,

size_t n

);

UnorderedMap(

std::initializer_list< std::pair<const K, V>> il,

size_t n,

const H& h

);

UnorderedMap(

std::initializer_list< std::pair<const K, V>> il,

size_t n,

const H& h,

const P& p

);

Параметры
Init

Имя типа текущего объекта UnorderedMap.

Объект функции, который может сравнивать два ключа с целью определения их


равенства. Этот параметр по умолчанию — std::equal_to<K>.

Объект функции, создающий хэш-значения для ключей. Этот параметр по


умолчанию использует класс хэша 1 для типов ключей, поддерживаемых классом.

Ссылка или Lvalues и Rvalues на std::unordered_map , которая используется для


инициализации текущего объекта UnorderedMap.
Il

Std::initializer_list объектов std::p air, используемых для инициализации карты.

first

Итератор ввода первого элемента в диапазоне элементов, используемый для


инициализации текущего объекта UnorderedMap.

last

Итератор ввода первого элемента после диапазона элементов, используемый для


инициализации текущего объекта UnorderedMap.

См. также раздел


Пространство имен платформы

Пространство имен Platform::Collections

Класс Platform::Collections::Map

Класс Platform::Collections::UnorderedMapView

Коллекции

Создание компонентов среды выполнения Windows в C++


Класс
Platform::Collections::UnorderedMapVie
w
Статья • 03.04.2023

Представляет доступное только для чтения представление на карте, которое


является коллекцией пар "ключ-значение".

Синтаксис
C++

template <

typename K,

typename V,

typename C = ::std::equal_to<K>>

ref class UnorderedMapView sealed;

Параметры
K

Тип ключа в паре "ключ-значение".

Тип значения в паре "ключ-значение".

Тип, предоставляющий объект функции, который может сравнивать два ключевых


значения для определения равенства. По умолчанию std::equal_to<K>

Комментарии
UnorderedMapView — это конкретная реализация интерфейса
Windows::Foundation::Collections::IMapView<K,V> , который передается через
двоичный интерфейс приложения (ABI). Дополнительные сведения см. в разделе
Collections (C++/CX).

Члены
Открытые конструкторы

name Описание

UnorderedMapView::UnorderedMapView Инициализирует новый экземпляр класса


UnorderedMapView.

Открытые методы

name Описание

UnorderedMapView::First Возвращает итератор, который инициализируется первым


элементом в представлении карты.

UnorderedMapView::HasKey Определяет, содержит ли текущий объект UnorderedMapView


указанный ключ.

UnorderedMapView::Lookup Извлекает элемент по указанному ключу в текущем объекте


UnorderedMapView.

UnorderedMapView::Size Возвращает количество элементов в текущем объекте


UnorderedMapView.

UnorderedMapView::Split Разделяет исходный объект UnorderedMapView на два объекта


UnorderedMapView.

Иерархия наследования
UnorderedMapView

Требования
Заголовок: collection.h

Пространство имен: Platform::Collections

Метод UnorderedMapView::First
Возвращает итератор, указывающий первый элемент
Windows::Foundation::Collections::IKeyValuePair<K,V> в неупорядоченной карте.

Синтаксис
C++

virtual Windows::Foundation::Collections::IIterator<

Windows::Foundation::Collections::IKeyValuePair<K, V>^>^

First();

Возвращаемое значение
Итератор, указывающий первый элемент в представлении сопоставления.

Комментарии
Для хранения итератора, возвращаемого функцией First(), удобно присвоить
возвращаемое значение переменной, объявленной с ключевым словом вычета
auto типа. Например, auto x = myMapView->First(); .

Метод UnorderedMapView::HasKey
Определяет, содержит ли текущий объект UnorderedMap указанный ключ.

Синтаксис
C++

bool HasKey(K key);

Параметры
key

Ключ, используемый для поиска элемента. Тип — key typename K.

Возвращаемое значение
true Значение , если ключ найден; в противном случае — false .

Метод UnorderedMapView::Lookup
Возвращает значение типа V, связанное с указанным ключом типа K.
Синтаксис
C++

V Lookup(K key);

Параметры
key

Ключ, используемый для поиска элемента в объекте UnorderedMapView. Тип — key


typename K.

Возвращаемое значение
Значение, связанное с ключом key . Тип возвращаемого значения — typename V.

Метод UnorderedMapView::Size
Возвращает количество элементов
Windows::Foundation::Collections::IKeyValuePair<K,V> в UnorderedMapView.

Синтаксис
C++

virtual property unsigned int Size;

Возвращаемое значение
Количество элементов в Unordered MapView.

Метод UnorderedMapView::Split
Разделяет текущий объект UnorderedMapView на два объекта UnorderedMapView.
Этот метод не выполняет никаких действий.

Синтаксис
C++

void Split(

Windows::Foundation::Collections::IMapView<

K,V>^ * firstPartition,

Windows::Foundation::Collections::IMapView<

K,V>^ * secondPartition);

Параметры
firstPartition

Первая часть исходного объекта UnorderedMapView.

secondPartition

Вторая часть исходного объекта UnorderedMapView.

Комментарии
Этот метод не выполняет никаких действий.

Конструктор
UnorderedMapView::UnorderedMapView
Инициализирует новый экземпляр класса UnorderedMapView.

Синтаксис
C++

UnorderedMapView();

explicit UnorderedMapView(size_t n);

UnorderedMapView(size_t n, const H& h);

UnorderedMapView(size_t n, const H& h, const P& p);

explicit UnorderedMapView(

const std::unordered_map<K, V, H, P>& m);

explicit UnorderedMapView(

std::unordered_map<K, V, H, P>&& m);

template <typename InIt> UnorderedMapView(InIt first, InIt last );

template <typename InIt> UnorderedMapView(InIt first, InIt last, size_t n );

template <typename InIt> UnorderedMapView(

InIt first,

InIt last,

size_t n,

const H& h );

template <typename InIt> UnorderedMapView(

InIt first,

InIt last,

size_t n,

const H& h,

const P& p );

UnorderedMapView(std::initializer_list<std::pair<const K, V>);

UnorderedMapView(std::initializer_list< std::pair<const K, V>> il, size_t n

UnorderedMapView(

std::initializer_list< std::pair<const K, V>> il,

size_t n,

const H& h);

UnorderedMapView(

std::initializer_list< std::pair<const K, V>> il,

size_t n,

const H& h,

const P& p );

Параметры
n

Число элементов, для которых необходимо заранее выделить пространство.

Init

Имя типа UnorderedMapView.

Объект функции, который может создать хэш-значение для ключа. По умолчанию


имеет значение std::hash<K> для поддерживаемых типов std::hash .

Тип, предоставляющий объект функции, который может сравнивать два ключа с


целью установления их равенства. По умолчанию — std::equal_to<K>.

Ссылка или Lvalues и Rvalues на std::unordered_map , которая используется для


инициализации UnorderedMapView.

first

Итератор ввода первого элемента в диапазоне элементов, используемый для


инициализации UnorderedMapView.
last

Итератор ввода первого элемента после диапазона элементов, используемый для


инициализации UnorderedMapView.

См. также раздел


Пространство имен Platform::Collections

Windows::Foundation::IMapView
Класс Platform::Collections::Vector
Статья • 03.04.2023

Представляет упорядоченную коллекцию объектов с индивидуальным доступом,


осуществляемым при помощи индекса. Реализует
Windows::Foundation::Collections::IObservableVector для упрощения привязки данных
XAML.

Синтаксис

template <typename T, typename E>


ref class Vector sealed;

Параметры
T

Тип элементов, содержащихся в объекте Vector.

Задает двоичный предикат для проверки равенства со значениями типа T.


Значение по умолчанию — std::equal_to<T> .

Комментарии
Допустимые типы:

1. integers

2. класс интерфейса^

3. открытый ссылочный класс ^

4. структура значений

5. открытый класс перечисления

Класс Vector — это конкретная реализация интерфейса


Windows::Foundation::Collections::IVector на языке C++.
При попытке использовать тип Vector в общедоступном возвращаемом значении
или параметре возникает ошибка компилятора C3986. Вы можете исправить
ошибку, изменив тип параметра или возвращаемого значения на
Windows::Foundation::Collections::IVector. Дополнительные сведения см. в разделе
Collections (C++/CX).

Члены

Открытые конструкторы

name Описание

Vector::Vector Инициализирует новый экземпляр класса Vector.

Открытые методы

name Описание

Vector::Append Вставляет указанный элемент после последнего элемента текущего


объекта Vector.

Vector::Clear Удаляет все элементы текущего объекта Vector.

Vector::First Возвращает итератор, указывающий первый элемент объекта Vector.

Vector::GetAt Извлекает элемент текущего объекта Vector, указанный заданным


индексом.

Vector::GetMany Извлекает последовательность элементов из текущего объекта Vector,


начиная с указанного индекса.

Vector::GetView Возвращает доступное только для чтения представление объекта


Vector, то есть Platform::Collections::VectorView.

Vector::IndexOf Выполняет поиск указанного элемента в текущем объекте Vector и


возвращает его индекс, если он найден.

Vector::InsertAt Вставляет указанный элемент в текущий vector в элементе,


определяемом заданным индексом.

Vector::ReplaceAll Удаляет элементы из текущего объекта Vector, а затем вставляет


элементы из указанного массива.

Vector::RemoveAt Удаляет элемент, определенный заданным индексом из текущего


объекта Vector.

Vector::RemoveAtEnd Удаляет элемент в конце текущего объекта Vector.


name Описание

Vector::SetAt Присваивает указанное значение к элементу текущего объекта Vector,


определяемому заданным индексом.

Vector::Size Возвращает количество элементов в текущем объекте Vector.

События

Имя Описание

event Происходит при


Windows::Foundation::Collection::VectorChangedEventHandler<T>^ изменении объекта
VectorChanged Vector.

Иерархия наследования
Vector

Требования
Заголовок: collection.h

Пространство имен: Platform::Collections

Метод Vector::Append
Вставляет указанный элемент после последнего элемента текущего объекта Vector.

Синтаксис
C++

virtual void Append(T item);

Параметры
index

Элемент, который требуется вставить в объект Vector. Тип элемента определяется


именем типа T .
Метод Vector::Clear
Удаляет все элементы текущего объекта Vector.

Синтаксис
C++

virtual void Clear();

Vector::First - метод
Возвращает итератор, указывающий первый элемент объекта Vector.

Синтаксис
C++

virtual Windows::Foundation::Collections::IIterator <T>^ First();

Возвращаемое значение
Итератор, указывающий первый элемент объекта Vector.

Комментарии
Для хранения итератора, возвращаемого функцией First(), удобно присвоить
возвращаемое значение переменной, объявленной с ключевым словом вычета
auto типа. Например, auto x = myVector->First(); . Этому итератору известна длина

коллекции.

Если для передачи функции STL требуется пара итераторов, используйте


бесплатные функции Windows::Foundation::Collections::begin и
Windows::Foundation::Collections::end

Vector::GetAt - метод
Извлекает элемент текущего объекта Vector, указанный заданным индексом.
Синтаксис
C++

virtual T GetAt(unsigned int index);

Параметры
index

Целое значение без знака, отсчитываемое от нуля, которое указывает


определенный элемент в объекте Vector.

Возвращаемое значение
Элемент, заданный параметром index . Тип элемента определяется именем типа T .

Vector::GetMany - метод
Извлекает последовательность элементов из текущего объекта Vector, начиная с
определенного индекса, и копирует их в выделенный вызывающим объектом
массив.

Синтаксис
C++

virtual unsigned int GetMany(

unsigned int startIndex,

Platform::WriteOnlyArray<T>^ dest);

Параметры
startIndex

Отсчитываемый от нуля индекс начала элементов для извлечения.

Dest

Выделенный вызывающим объектом массив элементов, которые начинаются с


элемента, заданного параметром startIndex , и заканчиваются последним
элементом Vector.
Возвращаемое значение
Количество извлеченных элементов.

Комментарии
Эта функция не предназначена для прямого использования в клиентском коде. Он
используется внутри функции to_vector для обеспечения эффективного
преобразования экземпляров Platform::Vector в экземпляры std::vector.

Vector::GetView - метод
Возвращает доступное только для чтения представление объекта Vector, то есть
интерфейс IVectorView.

Синтаксис
C++

Windows::Foundation::Collections::IVectorView<T>^ GetView();

Возвращаемое значение
Объект IVectorView.

Vector::IndexOf - метод
Выполняет поиск указанного элемента в текущем объекте Vector и возвращает его
индекс, если он найден.

Синтаксис
C++

virtual bool IndexOf(T value, unsigned int* index);

Параметры
value

Элемент, который нужно найти.

index

Отсчитываемый от нуля индекс элемента, если значение параметра найдено; в


противном случае — 0.

Параметр index имеет значение 0, если элемент является первым элементом Vector
или элемент не найден. Если возвращаемое значение равно true , элемент был
найден и является первым элементом; в противном случае элемент не найден.

Возвращаемое значение
true Значение , если указанный элемент найден; в противном случае — false .

Комментарии
IndexOf использует std::find_if для поиска элемента. Таким образом, типы
настраиваемых элементов должны перегрузить оператор == и != для включения
сравнений на равенство, которое требуется для find_if.

Метод Vector::InsertAt
Вставляет указанный элемент в текущий vector в элементе, определяемом
заданным индексом.

Синтаксис
C++

virtual void InsertAt(unsigned int index, T item)

Параметры
index

Целое значение без знака, отсчитываемое от нуля, которое указывает


определенный элемент в объекте Vector.

Item

Элемент, вставляемый в вектор по элементу, указанному индексом. Тип элемента


определяется именем типа T .

Метод Vector::RemoveAt
Удаляет элемент, определенный заданным индексом из текущего объекта Vector.

Синтаксис
C++

virtual void RemoveAt(unsigned int index);

Параметры
index

Целое значение без знака, отсчитываемое от нуля, которое указывает


определенный элемент в объекте Vector.

Метод Vector::RemoveAtEnd
Удаляет элемент в конце текущего объекта Vector.

Синтаксис
C++

virtual void RemoveAtEnd();

Метод Vector::ReplaceAll
Удаляет элементы из текущего объекта Vector, а затем вставляет элементы из
указанного массива.

Синтаксис
C++

virtual void ReplaceAll(const ::Platform::Array<T>^ arr);

Параметры
Arr

Массив объектов, тип которых определяется именем типа T .

Метод Vector::SetAt
Присваивает указанное значение к элементу текущего объекта Vector,
определяемому заданным индексом.

Синтаксис
C++

virtual void SetAt(unsigned int index, T item);

Параметры
index

Целое значение без знака, отсчитываемое от нуля, которое указывает


определенный элемент в объекте Vector.

Item

Значение, присваиваемое указанному элементу. Тип элемента определяется


именем типа T .

Метод Vector::Size
Возвращает количество элементов в текущем объекте Vector.

Синтаксис
C++

virtual property unsigned int Size;

Возвращаемое значение
Количество элементов в текущем объекте Vector.
Vector::Vector - конструктор
Инициализирует новый экземпляр класса Vector.

Синтаксис
C++

Vector();

explicit Vector(unsigned int size);

Vector( unsigned int size, T value);

template <typename U> explicit Vector( const ::std::vector<U>& v);

template <typename U> explicit Vector( std::vector<U>&& v);

Vector( const T * ptr, unsigned int size);

template <size_t N> explicit Vector(const T(&arr)[N]);

template <size_t N> explicit Vector(const std::array<T, N>& a);

explicit Vector(const Array<T>^ arr);

template <typename InIt> Vector(InIt first, InIt last);

Vector(std::initializer_list<T> il);

Параметры
a

Std::array, который будет использоваться для инициализации vector.

Arr

Объект Platform::Array, который будет использоваться для инициализации вектора.

Init

Тип коллекции объектов, используемой для инициализации текущего объекта


Vector.

Il

Std::initializer_list объектов типа T, которые будут использоваться для


инициализации vector.

Количество элементов в коллекции объектов, используемой для инициализации


текущего объекта Vector.

size

Количество элементов в объекте Vector.


value

Значение, используемое для инициализации каждого элемента в текущем объекте


Vector.

Значения Lvalues и Rvalues для std::vector, используемого для инициализации


текущего вектора.

Ptr

Указатель на объект std::vector , используемый для инициализации текущего


объекта Vector.

first

Первый элемент в последовательности объектов, используемых для


инициализации текущего объекта Vector. Тип первого передается посредством
идеальной пересылки. Дополнительные сведения см. в разделе Декларатор ссылок
Rvalue: &&.

last

Последний элемент в последовательности объектов, используемых для


инициализации текущего объекта Vector. Тип последнего передается посредством
идеальной пересылки. Дополнительные сведения см. в разделе Декларатор ссылок
Rvalue: &&.

См. также раздел


Коллекции (C++/CX)

Пространство имен платформы

Создание компонентов среды выполнения Windows в C++


Класс
Platform::Collections::VectorIterator
Статья • 03.04.2023

Предоставляет итератор стандартной библиотеки шаблонов для объектов,


производных от интерфейса IVector среда выполнения Windows.

VectorIterator — это прокси-итератор, в котором хранятся элементы типа


VectorProxy<T>. Однако объект прокси-сервера практически никогда не
отображается в пользовательском коде. Дополнительные сведения см. в разделе
Collections (C++/CX).

Синтаксис

template <typename T>

class VectorIterator;

Параметры
T

Имя типа класса шаблона VectorIterator.

Элементы

Общедоступные определения типов

Имя Описание

difference_type Различие указателя (ptrdiff_t).

iterator_category Категория итератора произвольного доступа


(::std::random_access_iterator_tag).

pointer Указатель на внутренний тип Platform::Collections::D


etails::VectorProxy<T>, необходимый для реализации VectorIterator.

reference Ссылка на внутренний тип Platform::Collections::D etails::VectorProxy<T>,


необходимый для реализации VectorIterator.
Имя Описание

value_type Имя типа T .

Открытые конструкторы

name Описание

VectorIterator::VectorIterator Инициализирует новый экземпляр класса VectorIterator.

Открытые операторы

Имя Описание

VectorIterator::operator- Вычитает указанное количество элементов из текущего


Operator итератора, возвращая новый итератор, или вычитает указанный
итератор из текущего итератора, возвращая количество
элементов между итераторами.

Оператор Выполняет уменьшение текущего итератора VectorIterator.


VectorIterator::operator--

Оператор Указывает, отличен ли текущий объект VectorIterator от


VectorIterator::operator!= указанного объекта VectorIterator.

Оператор Извлекает ссылку на элемент, указанный текущим итератором


VectorIterator::operator* VectorIterator.

VectorIterator::operator[] Извлекает ссылку на элемент, отстоящий от текущего итератора


VectorIterator на указанную величину смещения.

Оператор Возвращает объект VectorIterator, указывающий на элемент с


VectorIterator::operator+ заданным смещением от указанного объекта VectorIterator.

Оператор Выполняет увеличение текущего итератора VectorIterator.


VectorIterator::operator++

Оператор Увеличивает текущий итератор VectorIterator на указанную


VectorIterator::operator+= величину смещения.

Оператор Указывает, является ли текущий объект VectorIterator меньшим,


VectorIterator::operator< чем указанный объект VectorIterator.

Оператор Указывает, является ли текущий объект VectorIterator меньшим


VectorIterator::operator<= или равным указанному объекту VectorIterator.

Оператор Уменьшает текущий итератор VectorIterator на указанную


VectorIterator::operator-= величину смещения.
Имя Описание

Оператор Указывает, равен ли текущий объект VectorIterator указанному


VectorIterator::operator== объекту VectorIterator.

Оператор Указывает, действительно ли текущий объект VectorIterator


VectorIterator::operator> больше, чем указанный объект VectorIterator.

VectorIterator::operator-> Извлекает адрес элемента, на который ссылается текущий


Operator итератор VectorIterator.

Оператор Указывает, действительно ли текущий объект VectorIterator


VectorIterator::operator>= больше указанного объекта VectorIterator или равен ему.

Иерархия наследования
VectorIterator

Требования
Заголовок: collection.h

Пространство имен: Platform::Collections

Оператор VectorIterator::operator->
Извлекает адрес элемента, на который ссылается текущий итератор VectorIterator.

Синтаксис

Detail::ArrowProxy<T> operator->() const;

Возвращаемое значение
Значение элемента, на который ссылается текущий итератор VectorIterator.

Тип возвращаемого значения является неуказанным внутренним типом,


необходимым для реализации этого оператора.
VectorIterator::operator-- - оператор
Выполняет уменьшение текущего итератора VectorIterator.

Синтаксис

VectorIterator& operator--();

VectorIterator operator--(int);

Возвращаемое значение
Первый синтаксис выполняет уменьшение текущего итератора VectorIterator и
возвращает его. Второй синтаксис возвращает копию текущего итератора
VectorIterator, а затем выполняет уменьшение текущего итератора VectorIterator.

Комментарии
Первый синтаксис выполняет уменьшение текущего итератора VectorIterator перед
его использованием.

Второй синтаксис выполняет уменьшение текущего итератора VectorIterator после


его использования. Тип int во втором примере синтаксиса указывает операцию
уменьшения после использования, он не является операндом целочисленного
типа.

Оператор VectorIterator::operator*
Извлекает адрес элемента, указанного текущим итератором VectorIterator.

Синтаксис

reference operator*() const;

Возвращаемое значение
Элемент, указанный текущим итератором VectorIterator.

Оператор VectorIterator::operator==
Указывает, равен ли текущий объект VectorIterator указанному объекту
VectorIterator.

Синтаксис

bool operator==(const VectorIterator& other) const;

Параметры
Других

Другой объект VectorIterator.

Возвращаемое значение
true Значение , если текущий VectorIterator равен другому; в противном случае —

false .

Оператор VectorIterator::operator>
Указывает, действительно ли текущий объект VectorIterator больше, чем указанный
объект VectorIterator.

Синтаксис
C++

bool operator>(const VectorIterator& other) const

Параметры
Других

Другой объект VectorIterator.


Возвращаемое значение
true Значение , если текущий VectorIterator больше других; в противном случае —
false .

Оператор VectorIterator::operator>=
Указывает, является ли текущий объект VectorIterator большим или равным
указанному объекту VectorIterator.

Синтаксис
C++

bool operator>=(const VectorIterator& other) const

Параметры
Других

Другой объект VectorIterator.

Возвращаемое значение
true Значение , если текущий VectorIterator больше или равен другому; в

противном случае — false .

Оператор VectorIterator::operator++
Выполняет увеличение текущего итератора VectorIterator.

Синтаксис

VectorIterator& operator++();

VectorIterator operator++(int);

Возвращаемое значение
Первый синтаксис выполняет увеличение текущего итератора VectorIterator и
возвращает его. Второй синтаксис возвращает копию текущего итератора
VectorIterator, а затем выполняет увеличение текущего итератора VectorIterator.

Комментарии
Первый синтаксис выполняет увеличение текущего итератора VectorIterator перед
его использованием.

Второй синтаксис выполняет увеличение текущего итератора VectorIterator после


его использования. Тип int во втором примере синтаксиса задает операцию
увеличения после использования, он не является операндом целочисленного типа.

Оператор VectorIterator::operator!=
Указывает, отличен ли текущий объект VectorIterator от указанного объекта
VectorIterator.

Синтаксис

bool operator!=(const VectorIterator& other) const;

Параметры
Других

Другой объект VectorIterator.

Возвращаемое значение
true Значение , если текущий VectorIterator не равен другому; в противном случае

— false .

Оператор VectorIterator::operator<
Указывает, является ли текущий объект VectorIterator меньшим, чем указанный
объект VectorIterator.
Синтаксис
C++

bool operator<(const VectorIterator& other) const

Параметры
Других

Другой объект VectorIterator.

Возвращаемое значение
true Значение , если текущий VectorIterator меньше других; в противном случае —
false .

Оператор VectorIterator::operator<=
Указывает, является ли текущий объект VectorIterator меньшим или равным
указанному объекту VectorIterator.

Синтаксис
C++

bool operator<=(const VectorIterator& other) const

Параметры
Других

Другой объект VectorIterator.

Возвращаемое значение
true Значение , если текущий VectorIterator меньше или равен другому; в
противном случае — false .

VectorIterator::operator- - оператор
Вычитает указанное количество элементов из текущего итератора, возвращая
новый итератор, или вычитает указанный итератор из текущего итератора,
возвращая количество элементов между итераторами.

Синтаксис

VectorIterator operator-(difference_type n) const;

difference_type operator-(const VectorIterator& other) const;

Параметры
n

Количество элементов.

Других

Другой объект VectorIterator.

Возвращаемое значение
Синтаксис первого оператора возвращает объект VectorIterator, количество
элементов которого меньше, чем у текущего объекта VectorIterator, на n . Синтаксис
второго оператора возвращает количество элементов между текущим объектом
VectorIterator и другим объектом VectorIterator, заданным параметром other .

VectorIterator::operator+= - оператор
Увеличивает текущий итератор VectorIterator на указанную величину смещения.

Синтаксис

VectorIterator& operator+=(difference_type n);

Параметры
n

Целочисленная величина смещения.

Возвращаемое значение
Обновленный VectorIterator.

VectorIterator::operator+ - оператор
Возвращает объект VectorIterator, указывающий на элемент с заданным смещением
от указанного объекта VectorIterator.

Синтаксис

VectorIterator operator+(difference_type n);

template <typename T>

inline VectorIterator<T> operator+(

ptrdiff_t n,

const VectorIterator<T>& i);

Параметры
T

Во втором синтаксисе — имя типа объекта VectorIterator.

Целочисленная величина смещения.

Во втором синтаксисе — объект VectorIterator.

Возвращаемое значение
В первом синтаксисе — объект VectorIterator, указывающий на элемент с заданным
смещением от текущего объекта VectorIterator.

Во втором синтаксисе — объект VectorIterator, указывающий на элемент с


заданным смещением от начала параметра i .
Комментарии
Первый пример синтаксиса

VectorIterator::operator-= - оператор
Уменьшает текущий итератор VectorIterator на указанную величину смещения.

Синтаксис

VectorIterator& operator-=(difference_type n);

Параметры
n

Целочисленная величина смещения.

Возвращаемое значение
Обновленный VectorIterator.

VectorIterator::operator[]
Извлекает ссылку на элемент, отстоящий от текущего итератора VectorIterator на
указанную величину смещения.

Синтаксис

reference operator[](difference_type n) const;

Параметры
n

Целочисленная величина смещения.


Возвращаемое значение
Элемент, отстоящий от текущего итератора VectorIterator на n элементов.

VectorIterator::VectorIterator - конструктор
Инициализирует новый экземпляр класса VectorIterator.

Синтаксис

VectorIterator();

explicit VectorIterator(

Windows::Foundation::Collections::IVector<T>^ v);

Параметры
V

Объект IVector<T> .

Комментарии
Первый пример синтаксиса является конструктором по умолчанию. Второй пример
синтаксиса — это явный конструктор, который используется для создания
VectorIterator из объекта IVector<T> .

См. также раздел


Пространство имен платформы
Класс Platform::Collections::VectorView
Статья • 03.04.2023

Представляет доступное только для чтения представление упорядоченной


коллекции объектов, в которой возможен доступ к каждому отдельному объекту
по его индексу. Тип каждого объекта в коллекции задается параметром шаблона.

Синтаксис

template <typename T, typename E>


ref class VectorView sealed;

Параметры
T

Тип элементов, содержащихся в объекте VectorView .

Определяет бинарный предикат для проверки равенства со значениями типа T .


Значение по умолчанию — std::equal_to<T> .

Примечания
Класс VectorView реализует интерфейс
Windows::Foundation::Collections::IVectorView<T> и поддерживает итераторы
стандартной библиотеки шаблонов.

Члены

Открытые конструкторы

name Описание

VectorView::VectorView Инициализирует новый экземпляр класса VectorView.

Открытые методы
name Описание

VectorView::First Возвращает итератор, указывающий первый элемент объекта


VectorView.

VectorView::GetAt Извлекает элемент текущего VectorView, указанный заданным


индексом.

VectorView::GetMany Извлекает последовательность элементов из текущего объекта


VectorView, начиная с указанного индекса.

VectorView::IndexOf Выполняет поиск указанного элемента в текущем объекте VectorView


и возвращает его индекс, если он найден.

VectorView::Size Возвращает количество элементов в текущем объекте VectorView.

Иерархия наследования
VectorView

Требования
Заголовок: collection.h

Пространство имен: Platform::Collections

VectorView::First - метод
Возвращает итератор, указывающий первый элемент объекта VectorView.

Синтаксис

virtual Windows::Foundation::Collections::IIterator<T>^

First();

Возвращаемое значение
Итератор, указывающий первый элемент объекта VectorView.

Комментарии
Удобный способ хранения итератора, возвращаемого first(), заключается в
присвоении возвращаемого значения переменной, объявленной с помощью
ключевого слова вычета auto типа. Например, auto x = myVectorView->First(); .

VectorView::GetAt - метод
Извлекает элемент текущего VectorView, указанный заданным индексом.

Синтаксис

T GetAt(

UInt32 index

);

Параметры
index

Целое значение без знака, отсчитываемое от нуля, которое указывает


определенный элемент в объекте VectorView.

Возвращаемое значение
Элемент, заданный параметром index . Тип элемента задается параметром шаблона
VectorView T.

VectorView::GetMany - метод
Извлекает последовательность элементов из текущего объекта VectorView, начиная
с указанного индекса.

Синтаксис

virtual unsigned int GetMany(

unsigned int startIndex,

::Platform::WriteOnlyArray<T>^ dest

);

Параметры
startIndex

Отсчитываемый от нуля индекс начала элементов для извлечения.

Dest

Когда эта операция завершается, массив элементов начинается с элемента,


заданного startIndex , и заканчивается последним элементом объекта VectorView.

Возвращаемое значение
Количество извлеченных элементов.

VectorView::IndexOf - метод
Выполняет поиск указанного элемента в текущем объекте VectorView и возвращает
его индекс, если он найден.

Синтаксис

virtual bool IndexOf(

T value,

unsigned int* index

);

Параметры
value

Элемент, который нужно найти.

index

Отсчитываемый от нуля индекс элемента, если параметр value найден; в


противном случае — 0.

Параметр index имеет значение 0, если элемент является первым элементом


VectorView или элемент не найден. Если возвращаемое значение равно true ,

элемент найден и является первым элементом; в противном случае элемент не


найден.
Возвращаемое значение
true Значение , если указанный элемент найден; в противном случае — false .

Метод VectorView::Size
Возвращает количество элементов в текущем объекте VectorView.

Синтаксис

virtual property unsigned int Size;

Возвращаемое значение
Количество элементов в текущем объекте VectorView.

VectorView::VectorView - конструктор
Инициализирует новый экземпляр класса VectorView.

Синтаксис

VectorView();

explicit VectorView(

UInt32 size

);

VectorView(

UInt32 size,

T value

);

explicit VectorView(

const ::std::vector<T>& v

);

explicit VectorView(

::std::vector<T>&& v

);

VectorView(

const T * ptr,

UInt32 size

);

template <

size_t N

>

explicit VectorView(

const T (&arr)[N]

);

template <

size_t N

>

explicit VectorView(

const ::std::array<T,

N>& a

);

explicit VectorView(

const ::Platform::Array<T>^ arr

);

template <

typename InIt

>

VectorView(

InItfirst,

InItlast

);

VectorView(

std::initializer_list<T> il

);

Параметры
Init

Тип коллекции объектов, используемой для инициализации текущего объекта


VectorView.

Il

Std::initializer_list, элементы которого будут использоваться для инициализации


VectorView.

Количество элементов в коллекции объектов, используемой для инициализации


текущего объекта VectorView.

size

Количество элементов в объекте VectorView.


value

Значение, используемое для инициализации каждого элемента в текущем объекте


VectorView.

Lvalues и Rvalues в std::vector, который используется для инициализации текущего


VectorView.

Ptr

Указатель на объект std::vector , используемый для инициализации текущего


объекта VectorView.

Arr

Объект Platform::Array , используемый для инициализации текущего VectorView.

Объект std::array , используемый для инициализации текущего VectorView.

first

Первый элемент в последовательности объектов, используемых для


инициализации текущего объекта VectorView. Тип first передается посредством
идеальной пересылки. Дополнительные сведения см. в разделе Rvalue Reference
Declarator: &&.

last

Последний элемент в последовательности объектов, используемых для


инициализации текущего объекта VectorView. Тип last передается посредством
идеальной пересылки. Дополнительные сведения см. в разделе Rvalue Reference
Declarator: &&.

См. также раздел


Пространство имен платформы

Создание компонентов среды выполнения Windows в C++


Класс
Platform::Collections::VectorViewIterator
Статья • 03.04.2023

Предоставляет итератор стандартной библиотеки шаблонов для объектов,


производных от интерфейса среда выполнения Windows IVectorView .

ViewVectorIterator — это итератор прокси-сервера, который хранит элементы типа

VectorProxy<T> . Однако объект прокси-сервера практически никогда не


отображается в пользовательском коде. Дополнительные сведения см. в разделе
Collections (C++/CX).

Синтаксис

template <typename T>

class VectorViewIterator;

Параметры
T

Имя типа класса шаблона VectorViewIterator.

Элементы

Общедоступные определения типов

Имя Описание

difference_type Различие указателя (ptrdiff_t).

iterator_category Категория итератора произвольного доступа


(::std::random_access_iterator_tag).

pointer Указатель на внутренний тип, необходимый для реализации итератора


VectorViewIterator.

reference Ссылка на внутренний тип, необходимый для реализации итератора


VectorViewIterator.
Имя Описание

value_type Имя типа T .

Открытые конструкторы

name Описание

VectorViewIterator::VectorViewIterator Инициализирует новый экземпляр класса


VectorViewIterator.

Открытые операторы

Имя Описание

VectorViewIterator::operator- Вычитает указанное количество элементов из текущего


Operator итератора, возвращая новый итератор, или вычитает
указанный итератор из текущего итератора, возвращая
количество элементов между итераторами.

VectorViewIterator::operator-- Выполняет уменьшение текущего итератора


Operator VectorViewIterator.

Оператор Указывает, отличен ли текущий объект VectorViewIterator от


VectorViewIterator::operator!= указанного объекта VectorViewIterator.

Оператор Извлекает ссылку на элемент, указанный текущим


VectorViewIterator::operator* итератором VectorViewIterator.

VectorViewIterator::operator[] Извлекает ссылку на элемент, удаленный от текущего


итератора VectorViewIterator на указанную величину
смещения.

Оператор Возвращает объект VectorViewIterator, указывающий на


VectorViewIterator::operator+ элемент с заданным смещением от указанного объекта
VectorViewIterator.

Оператор Выполняет приращение текущего итератора


VectorViewIterator::operator++ VectorViewIterator.

Оператор Увеличивает текущий итератор VectorViewIterator на


VectorViewIterator::operator+= указанную величину смещения.

Оператор Указывает, действительно ли текущий объект


VectorViewIterator::operator< VectorViewIterator меньше, чем указанный объект
VectorViewIterator.
Имя Описание

Оператор Указывает, действительно ли текущий объект


VectorViewIterator::operator<= VectorViewIterator меньше указанного объекта
VectorViewIterator или равен ему.

Оператор Уменьшает текущий итератор VectorViewIterator на


VectorViewIterator::operator-= указанную величину смещения.

Оператор Указывает, равен ли текущий объект VectorViewIterator


VectorViewIterator::operator== указанному объекту VectorViewIterator.

Оператор Указывает, действительно ли текущий объект


VectorViewIterator::operator> VectorViewIterator больше, чем указанный объект
VectorViewIterator.

VectorViewIterator::operator-> Извлекает адрес элемента, на который ссылается текущий


Operator итератор VectorViewIterator.

Оператор Указывает, действительно ли текущий объект


VectorViewIterator::operator>= VectorViewIterator больше указанного объекта
VectorViewIterator или равен ему.

Иерархия наследования
VectorViewIterator

Требования
Заголовок: collection.h

Пространство имен: Platform::Collections

Оператор VectorViewIterator::operator->
Извлекает адрес элемента, на который ссылается текущий итератор
VectorViewIterator.

Синтаксис

Detail::ArrowProxy<T> operator->() const;

Возвращаемое значение
Значение элемента, на который ссылается текущий итератор VectorViewIterator.

Тип возвращаемого значения является неуказанным внутренним типом,


необходимым для реализации этого оператора.

Оператор VectorViewIterator::operator--
Выполняет уменьшение текущего итератора VectorViewIterator.

Синтаксис

VectorViewIterator& operator--();
VectorViewIterator operator--(int);

Возвращаемое значение
Первый синтаксис выполняет уменьшение текущего итератора VectorViewIterator и
возвращает его. Второй синтаксис возвращает копию текущего итератора
VectorViewIterator, а затем выполняет уменьшение текущего итератора
VectorViewIterator.

Комментарии
Первый синтаксис выполняет уменьшение текущего итератора VectorViewIterator
перед его использованием.

Второй синтаксис выполняет уменьшение текущего итератора VectorViewIterator


после его использования. Тип int во втором примере синтаксиса указывает
операцию уменьшения после использования, он не является операндом
целочисленного типа.

VectorViewIterator::operator* - оператор
Извлекает ссылку на элемент, указанный текущим итератором VectorViewIterator.

Синтаксис
reference operator*() const;

Возвращаемое значение
Элемент, указанный текущим итератором VectorIterator.

VectorViewIterator::operator== - оператор
Указывает, равен ли текущий объект VectorViewIterator указанному объекту
VectorViewIterator.

Синтаксис

bool operator==(const VectorViewIterator& other) const;

Параметры
Других

Другой объект VectorViewIterator.

Возвращаемое значение
true Значение , если текущий VectorViewIterator объект равен другому; в

противном случае — значение false .

Оператор VectorViewIterator::operator>
Указывает, действительно ли текущий объект VectorViewIterator больше, чем
указанный объект VectorViewIterator.

Синтаксис

bool operator>(const VectorViewIterator& other) const;

Параметры
Других

Другой объект VectorViewIterator.

Возвращаемое значение
true Значение , если текущий VectorViewIterator больше других; в противном

случае — false .

Оператор VectorViewIterator::operator>=
Указывает, является ли текущий VectorViewIterator объект больше или равен
указанному VectorViewIterator .

Синтаксис

bool operator>=(const VectorViewIterator& other) const;

Параметры
Других

Другой объект VectorViewIterator.

Возвращаемое значение
true Значение , если текущий VectorViewIterator объект больше или равен

другому; в противном случае — значение false .

VectorViewIterator::operator++ - оператор
Выполняет приращение текущего итератора VectorViewIterator.

Синтаксис
VectorViewIterator& operator++();
VectorViewIterator operator++(int);

Возвращаемое значение
Первый синтаксис выполняет приращение текущего итератора VectorViewIterator и
возвращает его. Второй синтаксис возвращает копию текущего итератора
VectorViewIterator, а затем выполняет приращение текущего итератора
VectorViewIterator.

Комментарии
Первый синтаксис выполняет приращение текущего итератора VectorViewIterator
перед его использованием.

Второй синтаксис выполняет приращение текущего итератора VectorViewIterator


после его использования. Тип int во втором примере синтаксиса задает операцию
увеличения после использования, он не является операндом целочисленного типа.

VectorViewIterator::operator!= - оператор
Указывает, отличен ли текущий объект VectorViewIterator от указанного объекта
VectorViewIterator.

Синтаксис

bool operator!=(const VectorViewIterator& other) const;

Параметры
Других

Другой объект VectorViewIterator.

Возвращаемое значение
true Значение , если текущий VectorViewIterator объект не равен другим; в

противном случае — значение false .

Оператор VectorViewIterator::operator<
Указывает, является ли текущий объект VectorIterator меньшим, чем указанный
объект VectorIterator.

Синтаксис

bool operator<(const VectorViewIterator& other) const;

Параметры
Других

Другой объект VectorIterator .

Возвращаемое значение
true Значение , если текущий VectorIterator объект меньше другого; в противном

случае — значение false .

Оператор VectorViewIterator::operator<=
Указывает, является ли текущий VectorIterator объект меньше или равен
указанному VectorIterator объекту .

Синтаксис

bool operator<=(const VectorViewIterator& other) const;

Параметры
Других

Другой объект VectorIterator .

Возвращаемое значение
true Значение , если текущий VectorIterator объект меньше или равен другому; в

противном случае — значение false .

VectorViewIterator::operator- - оператор
Вычитает указанное количество элементов из текущего итератора, возвращая
новый итератор, или вычитает указанный итератор из текущего итератора,
возвращая количество элементов между итераторами.

Синтаксис

VectorViewIterator operator-(difference_type n) const;

difference_type operator-(const VectorViewIterator& other) const;

Параметры
n

Количество элементов.

Других

Другой объект VectorViewIterator.

Возвращаемое значение
Синтаксис первого оператора возвращает объект VectorViewIterator, количество
элементов которого меньше, чем у текущего объекта VectorViewIterator, на n .
Синтаксис второго оператора возвращает количество элементов между текущим
объектом VectorViewIterator и другим объектом VectorViewIterator, заданным
параметром other .

VectorViewIterator::operator+= - оператор
Увеличивает текущий итератор VectorViewIterator на указанную величину
смещения.

Синтаксис

VectorViewIterator& operator+=(difference_type n);

Параметры
n

Целочисленная величина смещения.

Возвращаемое значение
Обновленный VectorViewIterator.

VectorViewIterator::operator+ - оператор
Возвращает объект VectorViewIterator, указывающий на элемент с заданным
смещением от указанного объекта VectorViewIterator.

Синтаксис

VectorViewIterator operator+(difference_type n) const;

template <typename T>

inline VectorViewIterator<T> operator+

(ptrdiff_t n,

const VectorViewIterator<T>& i);

Параметры
T

Во втором синтаксисе — имя типа объекта VectorViewIterator.

Целочисленная величина смещения.


i

Во втором синтаксисе — объект VectorViewIterator.

Возвращаемое значение
В первом синтаксисе — объект VectorViewIterator, указывающий на элемент с
заданным смещением от текущего объекта VectorViewIterator.

Во втором синтаксисе — объект VectorViewIterator, указывающий на элемент с


заданным смещением от начала i параметра.

VectorViewIterator::operator-= - оператор
Уменьшает текущий итератор VectorIterator на указанную величину смещения.

Синтаксис

VectorViewIterator& operator-=(difference_type n);

Параметры
n

Целочисленная величина смещения.

Возвращаемое значение
Обновленный VectorIterator.

VectorViewIterator::operator[]
Извлекает ссылку на элемент, удаленный от текущего итератора VectorViewIterator
на указанную величину смещения.

Синтаксис

reference operator[](difference_type n) const;

Параметры
n

Целочисленная величина смещения.

Возвращаемое значение
Элемент, удаленный от текущего итератора VectorViewIterator на n .

VectorViewIterator::VectorViewIterator -
конструктор
Инициализирует новый экземпляр класса VectorViewIterator.

Синтаксис

VectorViewIterator();

explicit VectorViewIterator(

Windows::Foundation::Collections::IVectorView<T>^ v

);

Параметры
V

Объект T IVectorView<>.

Комментарии
Первый пример синтаксиса является конструктором по умолчанию. Второй пример
синтаксиса — это явный конструктор, который используется для создания
VectorViewIterator из объекта IVectorView<T> .

См. также раздел


Пространство имен платформы
Пространство имен
Platform::Collections::Details
Статья • 03.04.2023

Это пространство имен служит для поддержки инфраструктуры Platform и не


предназначено для непосредственного использования в коде.

Синтаксис
C++

namespace Platform { namespace Collections { namespace Details {}}}

Члены
Члены этого пространства имен определены в файле collection.h и не
отображаются в обозревателе объектов.

Иерархия наследования
Пространство имен Platform::Collections

Требования
Заголовка: Collection.h

Пространство имен: Platform::Collection::Details

См. также раздел


Пространство имен платформы
Пространство имен Platform::Details
Статья • 03.04.2023

Это пространство имен предназначено только для внутреннего использования (не


для использования в разработке).

Синтаксис
C++

namespace Platform {

namespace Details {

}}

Члены
Хотя это пространство имен предназначено для внутреннего использования,
следующие его члены могут отображаться в браузерах.

Имя Комментарий

Консоль Класс. Отображает выходные данные в модульных тестах.

_GUID Структура

Куча Класс

HeapAllocationTrackingLevel Перечисление

HeapEntryHandler Делегат

IActivationFactory Интерфейс

IAgileObject Интерфейс

IClassFactory Интерфейс

IEquatable Интерфейс

IPrintable Интерфейс

IWeakReference Интерфейс

IWeakReferenceSource Интерфейс
Иерархия наследования
Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform::Details

См. также раздел


Пространство имен платформы
Структура Platform::Details::__GUID
Статья • 03.04.2023

Эта структура предназначена только для внутреннего использования (не для


использования при разработке).

Синтаксис
C++

ref struct __GUID;

Remarks
Эта структура предоставляется исключительно для полноты информации,
поскольку ее данные можно изучить с помощью браузеров.

Иерархия наследования
Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform::Details

См. также раздел


Пространство имен платформы
Класс Platform::Details::Console
Статья • 03.04.2023

Эта структура предназначена только для внутреннего использования (не для


использования при разработке).

Синтаксис
C++

ref class Console sealed;

Remarks
Этот класс предоставляется исключительно для полноты информации, поскольку
его данные можно изучить с помощью браузеров.

Иерархия наследования
Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform::Details

См. также раздел


Пространство имен платформы
Класс Platform::Details::Heap
Статья • 03.04.2023

Эта структура предназначена только для внутреннего использования (не для


использования при разработке).

Синтаксис
C++

ref class Heap sealed;

Remarks
Этот класс предоставляется исключительно для полноты информации, поскольку
его данные можно изучить с помощью браузеров.

Иерархия наследования
Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform::Details

См. также раздел


Пространство имен платформы
Перечисление
Platform::Details::HeapAllocationTrackin
gLevel
Статья • 03.04.2023

Это перечисление предназначено только для внутреннего использования (не для


использования при разработке).

Синтаксис
C++

enumm class HeapAllocationTrackingLevel;

Remarks
Это перечисление предоставляется исключительно для полноты информации,
поскольку его данные можно изучить с помощью браузеров.

Иерархия наследования
Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform::Details

См. также раздел


Пространство имен платформы
Делегат
Platform::Details::HeapEntryHandler
Статья • 03.04.2023

Этот делегат предназначен только для внутреннего использования (не для


использования при разработке).

Синтаксис
C++

delegate HeapEntryHandler;

Remarks
Этот класс предоставляется исключительно для полноты информации, поскольку
его данные можно изучить с помощью браузеров.

Иерархия наследования
Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform::Details

См. также раздел


Пространство имен платформы
Platform::Details::IEquatable -
интерфейс
Статья • 03.04.2023

Этот интерфейс предназначен только для внутреннего использования (не для


использования при разработке).

Синтаксис
C++

interface class IEquatable;

Remarks
Этот интерфейс предоставляется исключительно для полноты информации,
поскольку его данные можно изучить с помощью браузеров.

Иерархия наследования
Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform::Details

См. также раздел


Пространство имен платформы
Интерфейс Platform::Details::IPrintable
Статья • 03.04.2023

Этот интерфейс предназначен только для внутреннего использования (не для


использования при разработке).

Синтаксис
C++

interface class IPrintable;

Remarks
Этот интерфейс предоставляется исключительно для полноты информации,
поскольку его данные можно изучить с помощью браузеров.

Иерархия наследования
Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform::Details

См. также раздел


Пространство имен платформы
Пространство имен Platform::Metadata
Статья • 03.04.2023

Это пространство имен содержит атрибуты, которые изменяют объявления типов.

Синтаксис
C++

namespace Platform {

namespace Metadata {
}}

Члены
Хотя это пространство имен предназначено для внутреннего использования,
следующие его члены могут отображаться в браузерах.

Имя Комментарий

attribute Базовый класс для атрибутов.

Атрибут Platform::Metadata::D Указывает предпочтительную вызываемую


efaultMemberAttribute функцию из нескольких возможных
перегруженных функций.

Атрибут Platform::Metadata::FlagsAttribute Объявляет перечисление как перечисление


битовых полей.

В следующем примере показано


применение атрибута Flags к
перечислению.

[Flags] enum class MyEnumeration { enumA =


1, enumB = 2, enumC = 3}

Platform::Metadata::RuntimeClassNameAttribute Проверяет, что закрытому классу ссылки


присвоено допустимое имя класса среды
выполнения.

Иерархия наследования
Platform
Требования
Метаданные: platform.winmd

Пространство имен: Platform::Metadata

См. также раздел


Пространство имен платформы
Platform::Metadata::Attribute - атрибут
Статья • 03.04.2023

Представляет базовый класс для всех атрибутов.

Синтаксис
C++

public ref class Attribute abstract : Object

Наследование
Platform::Object

Platform::Metadata::Attribute

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform::Metadata

Метаданные: platform.winmd

См. также раздел


Пространство имен Platform::Metadata
Атрибут
Platform::Metadata::DefaultMemberAttr
ibute
Статья • 03.04.2023

Указывает предпочтительную вызываемую функцию из нескольких возможных


перегруженных функций.

Синтаксис
C++

public ref class DefaultMember abstract : Attribute

Наследование
Platform::Object

Platform::Metadata::Attribute

Комментарии
Применяет атрибут DefaultMember к методу, который используется приложением
JavaScript.

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform::Metadata

Метаданные: platform.winmd

См. также раздел


Пространство имен Platform::Metadata
Platform::Metadata::FlagsAttribute -
атрибут
Статья • 03.04.2023

Указывает, что перечисление может обрабатываться как битовое поле (т. е. набор
флагов).

Синтаксис
C++

public ref class Flags abstract : Attribute

Наследование
Platform::Object

Platform::Metadata::Attribute

Remarks

Требования
Минимальный поддерживаемый клиент: Windows 8

Минимальный поддерживаемый сервер: Windows Server 2012

Пространство имен: Platform::Metadata

Метаданные: platform.winmd

См. также раздел


Пространство имен Platform::Metadata
Platform::Metadata::RuntimeClassName
Статья • 03.04.2023

При применении к определению класса, проверяет, возвращает ли функция


GetRuntimeClassName допустимое имя в закрытый класс.

Синтаксис
C++

[Platform::Metadata::RuntimeClassName] name

Параметры

name

Имя существующего открытого типа, который виден в среде выполнения Windows.

Комментарии
Этот атрибут используется в закрытых классах ссылок для указания имени
пользовательского типа среды выполнения. Задает в качестве имени открытый
интерфейс, реализуемый классом.

Пример
В следующем примере показано использование атрибута. В этом примере имя
типа среды выполнения HellowWorldImpl является интерфейсом
Test::Native::MyComponent::IHelloWorld.

C++

namespace Test

namespace Native

namespace MyComponent

public interface class IHelloWorld

Platform::String^ SayHello();

};

private ref class HelloWorldImpl sealed :


[Platform::Metadata::RuntimeClassName] IHelloWorld

public:

HelloWorldImpl();
virtual Platform::String^ SayHello();

};

Platform::String^ HelloWorldImpl::SayHello()

return L"Hello World!";

См. также раздел


Пространство имен Platform::Metadata
Пространство имен
Platform::Runtime::CompilerServices
Статья • 03.04.2023

Это пространство имен предназначено только для внутреннего использования (не


для использования в разработке).

Синтаксис
C++

namespace Platform {

namespace CompilerServices{

}}

Члены
Хотя это пространство имен предназначено для внутреннего использования,
следующие его члены могут отображаться в браузерах.

Имя Комментарий

CallConvCdecl

CallConvFastcall

CallConvStdcall

CallConvThiscall

IndexerNameAttribute

IsBoxed

IsByValue

IsConst

IsCopyConstructed

IsExplicitlyDereferenced

IsImplicitlyDereferenced

IsLong
Имя Комментарий

IsSignUnspecifiedByte

IsSigned

IsUdtReturn

IsVolatile

OnePhaseConstructedAttribute

Иерархия наследования
Platform

Требования
Метаданные: platform.winmd

Пространство имен: Platform::CompilerServices

См. также раздел


Пространство имен платформы
Platform::Runtime::InteropServices -
пространство имен
Статья • 03.04.2023

Это пространство имен предназначено только для внутреннего использования (не


для использования в разработке).

Синтаксис
C++

namespace Platform {

namespace InteropServices {

}}

Члены
Хотя это пространство имен предназначено для внутреннего использования,
следующие его члены могут отображаться в браузерах.

Имя Комментарий

ComInterfaceType перечисление

InterfaceTypeAttribute

LayoutKind перечисление

MarshalAsAttribute

StuctLayoutAttribute

UnmanagedType перечисление

Иерархия наследования
Platform

Требования
Метаданные: platform.winmd
Пространство имен: Platform::InteropServices

См. также раздел


Пространство имен платформы
Windows::Foundation::Collections -
пространство имен (C++/CX)
Статья • 03.04.2023

C++/CX дополняет пространство имен Windows::Foundation::Collections функциями,


упрощающими использование классов коллекций Vector, VectorView, Map и
MapView.

Синтаксис

namespace Windows {

namespace Foundation {

namespace Collections;

Функции

Имя Описание

Функция Возвращает итератор, который может использоваться для вставки


back_inserter значения в конец коллекции.

Функция begin Возвращает итератор, который указывает на начало коллекции.

Функция end Возвращает итератор, который указывает на позицию после конечного


элемента коллекции.

Функция Возвращает коллекцию как std::vector.


to_vector

Требования
Заголовок: collection.h

Пространство имен: Windows::Foundation::Collections


back_inserter - функция
Статья • 03.04.2023

Возвращает итератор, используемый для вставки элементов в конце указанной


коллекции.

Синтаксис

template <typename T>

Platform::BackInsertIterator<T>

back_inserter(IVector<T>^ v);

template<typename T>

Platform::BackInsertIterator<T>

back_inserter(IObservableVector<T>^ v);

Параметры

Параметр типа шаблона.

Указатель интерфейса, предоставляющий доступ к базовой коллекции.

Возвращаемое значение
Итератор.

Требования
Заголовок: collection.h

Пространство имен: Windows::Foundation::Collections

См. также раздел


Пространство имен Windows::Foundation::Collections
begin Function
Статья • 03.04.2023

Возвращает итератор, указывающий на начало коллекции, для доступа к которой


используется указанный параметр интерфейса.

Синтаксис
C++

template <typename T>

::Platform::Collections::VectorIterator<T>

begin(IVector<T>^ v);

template <typename T>

::Platform::Collections::VectorViewIterator<T>

begin(IVectorView<T>^ v);

template <typename T>

::Platform::Collections::InputIterator<T>

begin(IIterable<T>^ i);

Параметры
T

Параметр типа шаблона.

Коллекция Vector<T> или VectorView<T> объекты, к которым обращается IVector<T>


интерфейс или IVectorView<T> доступ.

Коллекция произвольных среда выполнения Windows объектов, к которым


обращается IIterable<T> интерфейс.

Возвращаемое значение
Итератор, который указывает на начало коллекции.

Комментарии
Первые два шаблона функций возвращают итераторы, а третий шаблон функции
возвращает входной итератор.

Возвращаемый VectorIterator объектом является итератор прокси-сервера, в


который хранятся begin элементы типа VectorProxy<T> . Однако объект прокси-
сервера практически никогда не отображается в пользовательском коде.
Дополнительные сведения см. в разделе Collections (C++/CX).

Требования
Заголовок: collection.h

Пространство имен: Windows::Foundation::Collections

См. также раздел


Пространство имен Windows::Foundation::Collections
Функция end
Статья • 03.04.2023

Возвращает итератор, указывающий на позицию после конечного элемента


коллекции, для доступа к которой используется указанный параметр интерфейса.

Синтаксис
C++

template <typename T>

::Platform::Collections::VectorIterator<T>

end(IVector<T>^ v);

template <typename T>

::Platform::Collections::VectorViewIterator<T>

end(IVectorView<T>^ v);

template <typename T>

::Platform::Collections::InputIterator<T>

end(IIterable<T>^ i);

Параметры
T

Параметр типа шаблона.

Коллекция Vector<T> объектов или VectorView<T> объектов, к которым обращается


IVector<T> IVectorView<T> или интерфейс.

Коллекция произвольных среда выполнения Windows объектов, к которым


обращается IIterable<T> интерфейс.

Возвращаемое значение
Итератор, который указывает на позицию после конечного элемента коллекции.

Комментарии
Первые два шаблона функций возвращают итераторы, а третий шаблон функции
возвращает входной итератор.

Объект Platform::Collections::VectorViewIterator , возвращаемый прокси-итератором


end , который хранит элементы типа VectorProxy<T> . Однако объект прокси-
сервера практически никогда не отображается в пользовательском коде.
Дополнительные сведения см. в разделе Collections (C++/CX).

Требования
Заголовок: collection.h

Пространство имен: Windows::Foundation::Collections

См. также раздел


Windows::Foundation::Collections Пространства имен
Функция to_vector
Статья • 03.04.2023

Возвращает объект std::vector , значение которого совпадает с коллекцией,


лежащей в основе указанного параметра IVector или IVectorView.

Синтаксис

template <typename T>

inline ::std::vector<T> to_vector(IVector<T>^ v);

template <typename T>

inline ::std::vector<T> to_vector(IVectorView<T>^ v);

Параметры

Параметр типа шаблона.

Интерфейс IVector или IVectorView, который предоставляет доступ к базовому


объекту Vector или VectorView.

Возвращаемое значение

Требования
Заголовок: collection.h

Пространство имен: Windows::Foundation::Collections

См. также раздел


Пространство имен Windows::Foundation::Collections
оператор
Windows::UI::Xaml::Interop::TypeName
Статья • 03.04.2023

Включает преобразование из Platform::Type в


Windows::UI::Xaml::Interop::TypeName.

Синтаксис
C++

Operator TypeName(Platform::Type^ type);

Возвращаемое значение
Возвращает значение Windows::UI::Xaml::Interop::TypeName при получении
Platform::Type^ .

Комментарии
TypeName является независимой от языка структурой среды выполнения Windows

для представления сведений о типе. Platform::Type предназначен для C++ и не


может передаваться через двоичный интерфейс приложения (ABI). Ниже
представлен один из способов использования TypeName в функции Navigate .

C++

rootFrame->Navigate(TypeName(MainPage::typeid), e->Arguments);

Пример
В следующем примере показано преобразование из TypeName в Type и наоборот.

C++

// Convert from Type to TypeName

Windows::UI::Xaml::Interop::TypeName tn = TypeName(MainPage::typeid);

// Convert back from TypeName to Type

Type^ tx2 = (Type^)(tn);

Эквивалент .NET Framework


.NET Framework программирует TypeName проекта как System.Type.

Требования

См. также раздел


оператор Windows::UI::Xaml::Interop::TypeName

Класс Platform::Type
Функции CRT, которые не поддерживаются в приложениях
универсальной платформы Windows
Статья • 03.04.2023

Многие функции среды выполнения C (CRT) недоступны при создании приложений универсальная платформа Windows (UWP).
Иногда доступны обходные пути— например, можно использовать API среда выполнения Windows или Win32. В других случаях
функции CRT были запрещены, так как соответствующие функции или вспомогательные API не применяются к приложениям UWP.
Чтобы найти альтернативный метод, поддерживаемый для среда выполнения Windows, см. статью Альтернатива API Windows в
приложениях UWP.

В следующей таблице перечислены функции CRT, недоступные при создании приложений UWP. Он указывает на все применимые
обходные пути.

Неподдерживаемые функции CRT


Функция Описание Обходной путь

_beep _sleep _seterrormode Эти функции Обходное решение


устарели в отсутствует.
предыдущих
версиях CRT. Кроме
того,
соответствующие
API Win32
недоступны для
приложений UWP.

chdir _chdrive getcwd Эти функции Используйте _chdir ,


являются _getcwd и
устаревшими или не связанные функции.
являются
потокобезопасными.

_cgets _cgets_s _cgetws _cgetws_s _cprintf _cprintf_l _cprintf_p _cprintf_p_l _cprintf_s Эти консольные Консольные
_cprintf_s_l _cputs _cputws _cscanf _cscanf_l _cscanf_s _cscanf_s_l _cwait _cwprintf _cwprintf_l функции ввода- приложения UWP
_cwprintf_p _cwprintf_p_l _cwprintf_s _cwprintf_s_l _cwscanf _cwscanf_l _cwscanf_s _cwscanf_s_l вывода недоступны могут использовать
_vcprintf _vcprintf_l _vcprintf_p _vcprintf_p_l _vcprintf_s _vcprintf_s_l _vcwprintf _vcwprintf_l в приложениях UWP эти функции.
_vcwprintf_p _vcwprintf_p_l _vcwprintf_s _vcwprintf_s_l _getch _getch_nolock _getche на основе Дополнительные
_getche_nolock _getwch _getwch_nolock _getwche _getwche_nolock _putch _putch_nolock _putwch графического сведения см. в
_putwch_nolock _ungetch _ungetch_nolock _ungetwch _ungetwch_nolock _kbhit kbhit putch cgets пользовательского статье Создание
cprintf cputs cscanf cwait getch getche ungetch
интерфейса. консольного
приложения
универсальная
платформа
Windows.

getpid _getpid Эти функции Используйте API


устарели. Win32
GetCurrentProcessId .

_getdiskfree Недоступно. Используйте API


Win32
GetDiskFreeSpaceExW .

_getdrive _getdrives Соответствующий Обходное решение


API недоступен для отсутствует.
приложений UWP.

_inp _inpd _inpw _outp _outpd _outpw inp inpd inpw outp outpd outpw Ввод-вывод через Обходное решение
порты не отсутствует.
поддерживается в
приложениях UWP.
Функция Описание Обходной путь

_ismbcalnum _ismbcalnum_l _ismbcalpha _ismbcalpha_l _ismbcdigit _ismbcdigit_l _ismbcgraph Многобайтовые Используйте вместо
_ismbcgraph_l _ismbchira _ismbchira_l _ismbckata _ismbckata_l _ismbcl0 _ismbcl0_l _ismbcl1 строки не них строки
_ismbcl1_l _ismbcl2 _ismbcl2_l _ismbclegal _ismbclegal_l _ismbclower _ismbclower_l _ismbcprint поддерживаются в Юникода.
_ismbcprint_l _ismbcpunct _ismbcpunct_l _ismbcspace _ismbcspace_l _ismbcsymbol _ismbcsymbol_l приложениях UWP.
_ismbcupper _ismbcupper_l _mbbtombc _mbbtombc_l _mbbtype _mbbtype_l _mbccpy _mbccpy_l _mbccpy_s
_mbccpy_s_l _mbcjistojms _mbcjistojms_l _mbcjmstojis _mbcjmstojis_l _mbclen _mbclen_l _mbctohira
_mbctohira_l _mbctokata _mbctokata_l _mbctolower _mbctolower_l _mbctombb _mbctombb_l _mbctoupper
_mbctoupper_l _mbsbtype _mbsbtype_l _mbscat _mbscat_l _mbscat_s _mbscat_s_l _mbschr _mbschr_l
_mbscmp _mbscmp_l _mbscoll _mbscoll_l _mbscpy _mbscpy_l _mbscpy_s _mbscpy_s_l _mbscspn _mbscspn_l
_mbsdec _mbsdec_l _mbsicmp _mbsicmp_l _mbsicoll _mbsicoll_l _mbsinc _mbsinc_l _mbslen _mbslen_l
_mbslwr _mbslwr_l _mbslwr_s _mbslwr_s_l _mbsnbcat _mbsnbcat_l _mbsnbcat_s _mbsnbcat_s_l _mbsnbcmp
_mbsnbcmp_l _mbsnbcnt _mbsnbcnt_l _mbsnbcoll _mbsnbcoll_l _mbsnbcpy _mbsnbcpy_l _mbsnbcpy_s
_mbsnbcpy_s_l _mbsnbicmp _mbsnbicmp_l _mbsnbicoll _mbsnbicoll_l _mbsnbset _mbsnbset_l _mbsnbset_s
_mbsnbset_s_l _mbsncat _mbsncat_l _mbsncat_s _mbsncat_s_l _mbsnccnt _mbsnccnt_l _mbsncmp
_mbsncmp_l _mbsncoll _mbsncoll_l _mbsncpy _mbsncpy_l _mbsncpy_s _mbsncpy_s_l _mbsnextc _mbsnextc_l
_mbsnicmp _mbsnicmp_l _mbsnicoll _mbsnicoll_l _mbsninc _mbsninc_l _mbsnlen _mbsnlen_l _mbsnset
_mbsnset_l _mbsnset_s _mbsnset_s_l _mbspbrk _mbspbrk_l _mbsrchr _mbsrchr_l _mbsrev _mbsrev_l
_mbsset _mbsset_l _mbsset_s _mbsset_s_l _mbsspn _mbsspn_l _mbsspnp _mbsspnp_l _mbsstr _mbsstr_l
_mbstok _mbstok_l _mbstok_s _mbstok_s_l _mbsupr _mbsupr_l _mbsupr_s _mbsupr_s_l is_wctype

_pclose _pipe _popen _wpopen Именованные Обходное решение


каналы недоступны отсутствует.
для приложений
UWP.

_resetstkoflw Вспомогательные Обходное решение


API Win32 отсутствует.
недоступны для
приложений UWP.

_getsystime _setsystime Эти API устарели в Для получения


предыдущих системного
версиях CRT. Кроме времени
того, пользователь используйте API
не может задать Win32
системное время в GetSystemTime .
приложении UWP Системное время
из-за отсутствия нельзя
необходимых устанавливать.
разрешений.

_environ _putenv _putenv_s _searchenv _searchenv_s _dupenv_s _wputenv _wputenv_s _wsearchenv getenv Переменные среды Обходное решение
getenv_s putenv _wdupenv_s _wenviron _wgetenv _wgetenv_s _wsearchenv_s tzset недоступны для отсутствует. Чтобы
приложений UWP. задать часовой
пояс, используйте
. _tzset

_loaddll _getdllprocaddr _unloaddll Эти функции Для загрузки и


устарели в использования
предыдущих упакованных DLL
версиях CRT. Кроме следует применять
того, пользователь API Win32
не может загружать LoadPackagedLibrary ,
библиотеки DLL, GetProcAddress и
кроме тех, которые FreeLibrary .
хранятся в том же
пакете приложения.

_wexecl _wexecle _wexeclp _wexeclpe _wexecv _wexecve _wexecvp _wexecvpe _execl _execle _execlp Эта Обходное решение
_execlpe _execv _execve _execvp _execvpe _spawnl _spawnle _spawnlp _spawnlpe _spawnv _spawnve функциональность отсутствует.
_spawnvp _spawnvpe _wspawnl _wspawnle _wspawnlp _wspawnlpe _wspawnv _wspawnve _wspawnvp _wspawnvpe недоступна для
_wsystem execl execle execlp execlpe execv execve execvp execvpe spawnl spawnle spawnlp spawnlpe приложений UWP.
spawnv spawnve spawnvp spawnvpe system Приложение UWP
не может вызывать
другое приложение
UWP или
классическое
приложение.
Функция Описание Обходной путь

_heapwalk _heapadd _heapchk _heapset _heapused Эти функции Обходное решение


обычно отсутствует. Но
используются для функция _heapwalk
работы с кучей. доступна в DEBUG
Однако CRT для целей
соответствующие отладки. Эти
API Win32 не функции нельзя
поддерживаются в использовать в
приложениях UWP. приложениях,
И приложения которые
больше не могут отправляются в
создавать и Microsoft Store.
использовать
закрытые кучи.

В CRT для приложений UWP доступны следующие функции. Однако используйте их только в том случае, если вы не можете
использовать соответствующие API Win32 или среда выполнения Windows, например при переносе больших баз кода:

Функции Обходной путь

Однобайтовые строковые Сделайте приложения UWP строго юникодом, так как все API Win32 и API среда выполнения Windows, которые
функции, например strcat , предоставляются, используют только наборы символов Юникода. Однобайтовые функции были оставлены для
strcpy , strlwr и так далее. переноса больших баз кода, но в противном случае их следует избегать. По возможности следует использовать
соответствующие расширенные функции char.

Функции ввода-вывода Эти функции являются синхронными, что не рекомендуется для приложений UWP. В приложениях UWP для
потоков и ввода-вывода открытия, чтения и записи файлов используйте асинхронные API, чтобы избежать блокировки потока
файлов нижнего уровня, пользовательского интерфейса. Примеры таких API можно найти в классе Windows::Storage::FileIO .
например fopen , open и так
далее.

Приложения для Магазина Windows 8.x и приложения Windows Phone


8.x
Как упомянутые ранее API, так и следующие API недоступны в приложениях Магазина Windows 8.x и Windows Phone приложениях
версии 8.x.

Функции

_beginthread _beginthreadex _endthread _endthreadex

_chdir _wchdir _getcwd _getdcwd _wgetcwd _wgetdcwd

_isleadbyte_l _ismbbalnum , _ismbbalnum_l , _ismbbalpha ,


_ismbbalpha _ismbbalpha_l _ismbbgraph _ismbbgraph_l _ismbbkalnum _ismbbkalnum_l _ismbbkana _ismbbkana_l _ismbbkprint _ismbbkprint_l _ismbbkpunct _ismbbkpunct_l _

_tzset
Функции

_get_heap_handle , _heapmin
Библиотека шаблонов C++ среды
выполнения Windows (WRL)
Статья • 03.04.2023

Библиотека шаблонов C++ среды выполнения Windows (WRL) — это библиотека


шаблонов, которая предлагает низкоуровневый способ создания и использования
компонентов среды выполнения Windows.

7 Примечание

WRL теперь заменяет C++/WinRT — стандартную проекцию языка C++17 для


среда выполнения Windows API. C++/WinRT доступна в Windows SDK начиная с
версии 1803 (10.0.17134.0). C++/WinRT полностью реализован в файлах
заголовков и предназначен для предоставления первого класса доступа к
современному API Windows.

С помощью C++/WinRT можно использовать и создавать среда выполнения


Windows API с помощью любого компилятора C++17, соответствующего
стандартам. C++/WinRT обычно работает лучше и создает небольшие
двоичные файлы, чем любой другой вариант языка для среда выполнения
Windows. Мы продолжим предоставлять поддержку C++/CX и WRL, но в новых
приложениях настоятельно рекомендуется использовать C++/WinRT. См.
дополнительные сведения о C++/WinRT.

Преимущества
Библиотека шаблонов C++ среда выполнения Windows позволяет упростить
реализацию и использование компонентов com-модели. Он предоставляет методы
обслуживания, такие как подсчет ссылок для управления временем существования
объектов и тестирования значений HRESULT, чтобы определить, успешно ли
выполнена операция или сбой. Чтобы успешно использовать библиотеку
шаблонов среда выполнения Windows C++, необходимо тщательно следовать этим
правилам и методам.

C++/CX — это высокоуровневый языковой способ использования среда


выполнения Windows компонентов. Библиотека шаблонов среда выполнения
Windows C++ и C++/CX упрощают написание кода для среда выполнения Windows
путем автоматического выполнения задач по обслуживанию от вашего имени.
Библиотека шаблонов C++ среда выполнения Windows и C++/CX предоставляют
различные преимущества. Ниже приведены некоторые причины, по которым
может потребоваться использовать библиотеку шаблонов C++ среда выполнения
Windows вместо C++/CX:

среда выполнения Windows библиотека шаблонов C++ добавляет небольшую


абстракцию по среда выполнения Windows двоичному интерфейсу
приложения (ABI), что позволяет управлять базовым кодом для более
эффективного создания или использования среда выполнения Windows API.

C++/CX представляет значения COM HRESULT в виде исключений. Если вы


наследуете базу кода, использующую COM или не использующую
исключения, вы можете обнаружить, что библиотека шаблонов среда
выполнения Windows C++ является более естественным способом работы с
среда выполнения Windows, так как вам не нужно использовать исключения.

7 Примечание

Библиотека шаблонов C++ среда выполнения Windows использует


значения HRESULT и не создает исключения. Кроме того, библиотека
шаблонов среда выполнения Windows C++ использует интеллектуальные
указатели и шаблон RAII, чтобы гарантировать правильность
уничтожения объектов при возникновении исключения в коде
приложения. Дополнительные сведения о смарт-указателях и RAII см. в
разделе "Интеллектуальные указатели" и "Собственные ресурсы" (RAII).

Назначение и проектирование библиотеки шаблонов C++ среда выполнения


Windows вдохновляется активной библиотекой шаблонов (ATL), которая
представляет собой набор классов C++ на основе шаблонов, упрощающих
программирование COM-объектов. Так как среда выполнения Windows
библиотека шаблонов C++ использует стандартную оболочку C++ для
переноса среда выполнения Windows, вы можете упростить перенос и
взаимодействовать со многими существующими com-компонентами,
написанными в ATL, в среда выполнения Windows. Если вы уже знаете ATL, вы
можете найти, что среда выполнения Windows программирование
библиотеки шаблонов C++ проще.

Приступая к работе
Ниже приведены некоторые ресурсы, которые помогут вам сразу приступить к
работе с библиотекой шаблонов среда выполнения Windows C++.
Практическое руководство. Активация и использование компонента среды
выполнения Windows

Показывает, как использовать библиотеку шаблонов среда выполнения Windows


C++, чтобы инициализировать среда выполнения Windows и активировать и
использовать компонент среда выполнения Windows.

Практическое руководство. Завершение асинхронных операций

Показывает, как использовать библиотеку шаблонов среда выполнения Windows


C++ для запуска асинхронных операций и выполнения работы после завершения
операций.

Практическое руководство. Обработка событий

Показывает, как использовать библиотеку шаблонов среда выполнения Windows


C++, чтобы подписаться на события среда выполнения Windows объекта и
обрабатывать их.

Пошаговое руководство. Создание приложения UWP с использованием WRL и


Media Foundation

Узнайте, как создать приложение UWP, использующее Microsoft Media Foundation.

Практическое руководство. Создание классического компонента COM

В этой статье показано, как использовать библиотеку шаблонов среда выполнения


Windows C++, чтобы создать базовый COM-компонент и базовый способ
регистрации и использования COM-компонента из классического приложения.

Практическое руководство. Создание экземпляров компонентов WRL напрямую

Сведения об использовании функций Microsoft::WRL::Make и


Microsoft::WRL::Details::MakeAndInitialize для создания экземпляра компонента из
определяющего его модуля.

Практическое руководство. Использование winmdidl.exe и midlrt.exe для создания


H-файлов из метаданных Windows

Демонстрация использования пользовательских компонент среды выполнения


Windows из WRL путем создания IDL-файла из метаданных WINMD.

Пошаговое руководство. Подключение с помощью задач и HTTP-запросов XML

Показывает, как использовать интерфейсы IXMLHTTPRequest2 и


IXMLHTTPRequest2Callback вместе с задачами для отправки HTTP-запросов GET и
POST веб-службе в приложении UWP.

Пример приложения Bing Maps Trip Optimizer

HttpRequest Использует класс, определенный в пошаговом руководстве:


подключение с помощью задач и HTTP-запросов XML в контексте полного
приложения UWP.

Создание компонента DLL среды выполнения Windows с использованием примера


C++

Показывает, как использовать библиотеку шаблонов среда выполнения Windows


C++, чтобы создать компонент DLL внутри процесса и использовать его из C++/CX,
JavaScript и C#.

Пример игры DirectX Marble Maze

Демонстрирует использование библиотеки шаблонов среда выполнения Windows


C++ для управления временем существования com-компонентов, таких как DirectX
и Media Foundation в контексте полной трехмерной игры.

Всплывающие уведомления из классических приложений

Демонстрирует отправку всплывающих уведомлений из классического


приложения.

среда выполнения Windows библиотеку


шаблонов C++ по сравнению с ATL
среда выполнения Windows библиотека шаблонов C++ похожа на библиотеку
активных шаблонов (ATL), так как ее можно использовать для создания небольших
и быстрых COM-объектов. среда выполнения Windows библиотеке шаблонов C++
и ATL также используют такие понятия, как определение объектов в модулях, явная
регистрация интерфейсов и открытие создания объектов с помощью фабрик. Если
вы знакомы с ATL, возможно, вам будет удобно среда выполнения Windows
библиотеку шаблонов C++.

среда выполнения Windows библиотека шаблонов C++ поддерживает функции


COM, необходимые для приложений UWP. Поэтому она отличается от библиотеки
ATL, поскольку в последней нет непосредственной поддержки таких функций
модели COM, как:

aggregation

стандартные реализации

сдвоенные интерфейсы ( IDispatch )

стандартные интерфейсы перечислителя

точки подключения
перемещаемые интерфейсы

внедрение OLE

Элементы управления ActiveX

COM+

Основные понятия
среда выполнения Windows библиотека шаблонов C++ предоставляет типы,
представляющие несколько основных понятий. Эти типы описаны в следующих
разделах.

ComPtr
типComPtr — тип интеллектуального указателя , который представляет
интерфейс, определяемый параметром шаблона. Тип ComPtr используется для
объявления переменной, которая может получить доступ к членам объекта,
производного от интерфейса. ComPtr автоматически поддерживает счетчик ссылок
для указателя базового интерфейса и освобождает интерфейс, когда счетчик
ссылок становится равен нулю.

RuntimeClass
RuntimeClass представляет собой экземпляр класса, который наследуется от набора
указанных интерфейсов. Объект RuntimeClass может обеспечить сочетание
поддержки одного или нескольких среда выполнения Windows COM-интерфейсов
или слабую ссылку на компонент.

Модуль
Module представляет коллекцию связанных объектов. Объект Module управляет
фабриками класса, создающими объекты, и регистрацией, которая позволяет
другим приложениям использовать объект.

Обратный вызов
Функция Callback создает объект, функция-член которого является обработчиком
событий (метод обратного вызова). Функция Callback используется для записи
асинхронных операций.
EventSource
EventSource используется для управления обработчиками событий делегатов .
Используйте среда выполнения Windows библиотеку шаблонов C++ для
реализации делегата и использования для EventSource добавления, удаления и
вызова делегатов.

AsyncBase
AsyncBase предоставляет виртуальные методы, представляющие среда выполнения
Windows асинхронную модель программирования. Переопределите члены этого
класса для создания пользовательского класса, который может запускать и
останавливать асинхронную операцию, а также проверять ход ее выполнения.

FtmBase
FtmBase представляет объект маршаллера в режиме свободного потока. FtmBase
создает общую таблицу интерфейса (GIT) и помогает управлять маршалингом и
прокси-объектами.

WeakRef
WeakRef — тип интеллектуального указателя, представляющий слабую ссылкуна
объект, который может быть доступен или недоступен. Объект WeakRef может
использоваться только среда выполнения Windows, а не классическим COM.

Объект WeakRef обычно представляет объект, наличием которого управляет


внешний поток или приложение. Например, объект WeakRef может ссылаться на
объект файла. При открывании файла WeakRef является допустимым и файл, на
который он ссылается, доступен. Однако после закрытия файла WeakRef перестает
быть допустимым и файл становится недоступным.

См. также
Основные API по категориям

Выделяет основные среда выполнения Windows типы, функции и макросы


библиотеки шаблонов C++.

Справочные материалы

Содержит справочные сведения о библиотеке шаблонов среда выполнения


Windows C++.

Краткий справочник (C++/CX)

Кратко описывает функции C++/CX, поддерживающие среда выполнения Windows.

Использование компонентов среды выполнения Windows в Visual C++

Показывает, как использовать C++/CX для создания базового компонента среда


выполнения Windows.
Практическое руководство.
Активация и использование
компонента среды выполнения
Windows с помощью WRL
Статья • 03.04.2023

В этом документе показано, как использовать библиотеку шаблонов среда


выполнения Windows C++ для инициализации среда выполнения Windows и
активации и использования компонента среда выполнения Windows.

Для использования компонента необходимо получить указатель интерфейса на


тип, который реализуется компонентом. Так как базовая технология среда
выполнения Windows является компонентной объектной моделью (COM),
необходимо следовать правилам COM для поддержания экземпляра типа.
Например, необходимо поддерживать счетчик ссылок , определяющий, когда тип
удаляется из памяти.

Чтобы упростить использование среда выполнения Windows, среда выполнения


Windows библиотека шаблонов C++ предоставляет шаблон интеллектуального
указателя ComPtr<T>, который автоматически выполняет подсчет ссылок. При
объявлении переменной укажите ComPtr< идентификаторимени > интерфейса. Для
обращения к членам интерфейса примените оператор доступа к членам класса в
виде стрелки ( -> ) к идентификатору.

) Важно!

При вызове функции интерфейса всегда проверяйте возвращаемое значение


HRESULT.

Активация и использование компонента


среды выполнения Windows
Следующие шаги используют Windows::Foundation::IUriRuntimeClass интерфейс для
демонстрации создания фабрики активации для компонента среда выполнения
Windows, создания экземпляра этого компонента и получения значения свойства.
Они также показывают, как инициализировать среда выполнения Windows. Ниже
приведен полный пример.

) Важно!

Хотя обычно используется библиотека шаблонов среда выполнения Windows


C++ в приложении универсальная платформа Windows (UWP), в этом примере
используется консольное приложение для иллюстрации. Такие функции, как
wprintf_s недоступны в приложении UWP. Дополнительные сведения о типах
и функциях, которые можно использовать в приложении UWP, см. в функциях
CRT, которые не поддерживаются в приложениях универсальная платформа
Windows и Win32 и COM для приложений UWP.

Активация и использование компонента среды выполнения


Windows

1. Включите ( #include ) все необходимые среда выполнения Windows, среда


выполнения Windows библиотеку шаблонов C++ или заголовки стандартной
библиотеки C++.

C++

#include <Windows.Foundation.h>

#include <wrl\wrappers\corewrappers.h>

#include <wrl\client.h>
#include <stdio.h>

using namespace ABI::Windows::Foundation;

using namespace Microsoft::WRL;

using namespace Microsoft::WRL::Wrappers;

Рекомендуется использовать директиву using namespace в CPP-файле, чтобы


сделать код более удобочитаемым.

2. Инициализируйте поток, в котором выполняется приложение. Каждое


приложение должно инициализировать свой поток и потоковую модель. В
этом примере используется класс Microsoft::WRL::Wrappers::RoInitializeWrapper
для инициализации среда выполнения Windows и указывает
RO_INIT_MULTITHREADED в качестве модели потоков. Класс
RoInitializeWrapper вызывает Windows::Foundation::Initialize при создании и
Windows::Foundation::Uninitialize при удалении.
C++

// Initialize the Windows Runtime.

RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);

if (FAILED(initialize))

return PrintError(__LINE__, initialize);

Во втором операторе оператор RoInitializeWrapper::HRESULT возвращает


значение HRESULT из вызова Windows::Foundation::Initialize .

3. Создайте фабрику
активации ABI::Windows::Foundation::IUriRuntimeClassFactory для интерфейса.

C++

// Get the activation factory for the IUriRuntimeClass interface.

ComPtr<IUriRuntimeClassFactory> uriFactory;

HRESULT hr =
GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_U
ri).Get(), &uriFactory);

if (FAILED(hr))

return PrintError(__LINE__, hr);

В среда выполнения Windows используются полные имена для


идентификации типов. Параметр RuntimeClass_Windows_Foundation_Uri — это
строка, предоставляемая среда выполнения Windows и содержащая
требуемое имя класса среды выполнения.

4. Инициализируйте переменную Microsoft::WRL::Wrappers::HString ,


представляющую универсальный код ресурса (URI
"https://www.microsoft.com" ).

C++

// Create a string that represents a URI.

HString uriHString;

hr = uriHString.Set(L"http://www.microsoft.com");

if (FAILED(hr))

return PrintError(__LINE__, hr);

В среда выполнения Windows не выделяется память для строки, которую


будет использовать среда выполнения Windows. Вместо этого среда
выполнения Windows создает копию строки в буфере, который он
обслуживает и использует для операций, а затем возвращает дескриптор
созданному буферу.

5. Используйте метод фабрики IUriRuntimeClassFactory::CreateUri для создания


объекта ABI::Windows::Foundation::IUriRuntimeClass .

C++

// Create the IUriRuntimeClass object.

ComPtr<IUriRuntimeClass> uri;

hr = uriFactory->CreateUri(uriHString.Get(), &uri);

if (FAILED(hr))

return PrintError(__LINE__, hr);

6. Вызовите метод IUriRuntimeClass::get_Domain для получения значения


свойства Domain .

C++

// Get the domain part of the URI.

HString domainName;

hr = uri->get_Domain(domainName.GetAddressOf());

if (FAILED(hr))

return PrintError(__LINE__, hr);

7. Выведите доменное имя с символом перевода строки в окно консоли. Все


объекты ComPtr и RAII покидают область действия и автоматически
освобождаются.

C++

// Print the domain name and return.

wprintf_s(L"Domain name: %s\n", domainName.GetRawBuffer(nullptr));

// All smart pointers and RAII objects go out of scope here.

Функция WindowsGetStringRawBuffer извлекает базовую форму Юникода


строки URI.
Ниже приведен полный пример.

C++

// wrl-consume-component.cpp

// compile with: runtimeobject.lib

#include <Windows.Foundation.h>

#include <wrl\wrappers\corewrappers.h>

#include <wrl\client.h>
#include <stdio.h>

using namespace ABI::Windows::Foundation;

using namespace Microsoft::WRL;

using namespace Microsoft::WRL::Wrappers;

// Prints an error string for the provided source code line and HRESULT

// value and returns the HRESULT value as an int.

int PrintError(unsigned int line, HRESULT hr)

wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);

return hr;

int wmain()

// Initialize the Windows Runtime.

RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);

if (FAILED(initialize))

return PrintError(__LINE__, initialize);

// Get the activation factory for the IUriRuntimeClass interface.

ComPtr<IUriRuntimeClassFactory> uriFactory;

HRESULT hr =
GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_Uri).G
et(), &uriFactory);

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Create a string that represents a URI.

HString uriHString;

hr = uriHString.Set(L"http://www.microsoft.com");

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Create the IUriRuntimeClass object.

ComPtr<IUriRuntimeClass> uri;
hr = uriFactory->CreateUri(uriHString.Get(), &uri);

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Get the domain part of the URI.

HString domainName;

hr = uri->get_Domain(domainName.GetAddressOf());

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Print the domain name and return.

wprintf_s(L"Domain name: %s\n", domainName.GetRawBuffer(nullptr));

// All smart pointers and RAII objects go out of scope here.

/*

Output:

Domain name: microsoft.com

*/

Компиляция кода
Чтобы скомпилировать код, скопируйте его и вставьте его в проект Visual Studio
или вставьте его в файл с именем wrl-consume-component.cpp , а затем выполните
следующую команду в окне командной строки Visual Studio.

cl.exe wrl-consume-component.cpp runtimeobject.lib

См. также раздел


Библиотека шаблонов C++ среды выполнения Windows (WRL)
Практическое руководство.
Завершение асинхронных операций с
использованием WRL
Статья • 03.04.2023

В этом документе показано, как использовать библиотеку шаблонов C++ среда


выполнения Windows C++ для запуска асинхронных операций и выполнения
работы после завершения операций.

Здесь приведено два примера. В первом из них показан запуск и ожидание


окончания работы асинхронного таймера. В этом примере при создании объекта
таймера задается асинхронное действие. Во втором примере показан запуск
рабочего потока в фоновом режиме. В этом примере показано, как работать с
методом среда выполнения Windows, который возвращает IAsyncInfo интерфейс.
Функция обратного вызова является важной частью обоих примеров, так как она
позволяет указать обработчик событий для обработки результатов асинхронных
операций.

Более простой пример создания экземпляра компонента и получения значения


свойства см. в разделе "Практическое руководство. Активация и использование
компонента среда выполнения Windows".

 Совет

В этих примерах используются лямбда-выражения для определения обратных


вызовов. Можно также использовать объекты функций (functors), указатели
функций или объекты std::function . Дополнительные сведения о лямбда-
выражениях C++ см. в лямбда-выражениях.

Пример: работа с таймером


Следующие действия запускают асинхронный таймер и ожидают окончания его
действия. Ниже приведен полный пример.

2 Предупреждение

Хотя обычно вы используете библиотеку шаблонов среда выполнения


Windows C++ в приложении универсальная платформа Windows (UWP), в этом
примере используется консольное приложение для иллюстрации. Такие
функции, как wprintf_s недоступны в приложении UWP. Дополнительные
сведения о типах и функциях, которые можно использовать в приложении
UWP, см. в функциях CRT, которые не поддерживаются в приложениях
универсальная платформа Windows и Win32 и COM для приложений UWP.

1. Включите ( #include ) все необходимые среда выполнения Windows, среда


выполнения Windows библиотеку шаблонов C++ или заголовки стандартной
библиотеки C++.

C++

#include <Windows.Foundation.h>

#include <Windows.System.Threading.h>

#include <wrl/event.h>

#include <stdio.h>

#include <Objbase.h>

using namespace ABI::Windows::Foundation;

using namespace ABI::Windows::System::Threading;

using namespace Microsoft::WRL;

using namespace Microsoft::WRL::Wrappers;

Windows.System.Threading.h объявляет типы, необходимые для использования


асинхронного таймера.

Рекомендуется использовать директиву using namespace в CPP-файле, чтобы


сделать код более удобочитаемым.

2. Инициализируйте среда выполнения Windows.

C++

// Initialize the Windows Runtime.

RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);

if (FAILED(initialize))

return PrintError(__LINE__, initialize);

3. Создайте фабрику активации для интерфейса


ABI::Windows::System::Threading::IThreadPoolTimer .

C++
// Get the activation factory for the IThreadPoolTimer interface.

ComPtr<IThreadPoolTimerStatics> timerFactory;

HRESULT hr =
GetActivationFactory(HStringReference(RuntimeClass_Windows_System_Threa
ding_ThreadPoolTimer).Get(), &timerFactory);

if (FAILED(hr))

return PrintError(__LINE__, hr);

В среда выполнения Windows используются полные имена для


идентификации типов. Параметр
RuntimeClass_Windows_System_Threading_ThreadPoolTimer — это строка,

предоставляемая среда выполнения Windows и содержащая требуемое имя


класса среды выполнения.

4. Создайте объект event , который синхронизирует обратный вызов таймера с


основным приложением.

C++

// Create an event that is set after the timer callback completes. We


later use this event to wait for the timer to complete.

// This event is for demonstration only in a console app. In most apps,


you typically don't wait for async operations to complete.

Event timerCompleted(CreateEventEx(nullptr, nullptr,


CREATE_EVENT_MANUAL_RESET, WRITE_OWNER | EVENT_ALL_ACCESS));

hr = timerCompleted.IsValid() ? S_OK :
HRESULT_FROM_WIN32(GetLastError());

if (FAILED(hr))

return PrintError(__LINE__, hr);

7 Примечание

Это событие выполняется только для демонстрации в составе


консольного приложения. В этом примере используется объект-событие,
чтобы удостовериться, что асинхронная операция окончится до
завершения приложения. В большинстве приложений обычно не нужно
ожидать завершения асинхронных операций.

5. Создайте объект IThreadPoolTimer , время действия которого истекает через


две секунды. Используйте функцию Callback для создания обработчика
событий (объект ABI::Windows::System::Threading::ITimerElapsedHandler ).

C++

// Create a timer that prints a message after 2 seconds.

TimeSpan delay;

delay.Duration = 20000000; // 2 seconds.

auto callback = Callback<ITimerElapsedHandler>([&timerCompleted]


(IThreadPoolTimer* timer) -> HRESULT

wprintf_s(L"Timer fired.\n");

TimeSpan delay;

HRESULT hr = timer->get_Delay(&delay);

if (SUCCEEDED(hr))

wprintf_s(L"Timer duration: %2.2f seconds.\n", delay.Duration /


10000000.0);

// Set the completion event and return.

SetEvent(timerCompleted.Get());

return hr;

});

hr = callback ? S_OK : E_OUTOFMEMORY;

if (FAILED(hr))

return PrintError(__LINE__, hr);

ComPtr<IThreadPoolTimer> timer;

hr = timerFactory->CreateTimer(callback.Get(), delay, &timer);

if (FAILED(hr))

return PrintError(__LINE__, hr);

6. Выведите сообщение в окно консоли и дождитесь выполнения обратного


вызова таймера. Все объекты ComPtr и RAII покидают область действия и
автоматически освобождаются.

C++

// Print a message and wait for the timer callback to complete.

wprintf_s(L"Timer started.\nWaiting for timer...\n");

// Wait for the timer to complete.

WaitForSingleObjectEx(timerCompleted.Get(), INFINITE, FALSE);

// All smart pointers and RAII objects go out of scope here.

Ниже приведен полный пример.

C++

// wrl-consume-async.cpp

// compile with: runtimeobject.lib

#include <Windows.Foundation.h>

#include <Windows.System.Threading.h>

#include <wrl/event.h>

#include <stdio.h>

#include <Objbase.h>

using namespace ABI::Windows::Foundation;

using namespace ABI::Windows::System::Threading;

using namespace Microsoft::WRL;

using namespace Microsoft::WRL::Wrappers;

// Prints an error string for the provided source code line and HRESULT

// value and returns the HRESULT value as an int.

int PrintError(unsigned int line, HRESULT hr)

wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);

return hr;

int wmain()

// Initialize the Windows Runtime.

RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);

if (FAILED(initialize))

return PrintError(__LINE__, initialize);

// Get the activation factory for the IThreadPoolTimer interface.

ComPtr<IThreadPoolTimerStatics> timerFactory;

HRESULT hr =
GetActivationFactory(HStringReference(RuntimeClass_Windows_System_Threading_
ThreadPoolTimer).Get(), &timerFactory);

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Create an event that is set after the timer callback completes. We


later use this event to wait for the timer to complete.

// This event is for demonstration only in a console app. In most apps,


you typically don't wait for async operations to complete.

Event timerCompleted(CreateEventEx(nullptr, nullptr,


CREATE_EVENT_MANUAL_RESET, WRITE_OWNER | EVENT_ALL_ACCESS));

hr = timerCompleted.IsValid() ? S_OK :
HRESULT_FROM_WIN32(GetLastError());

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Create a timer that prints a message after 2 seconds.

TimeSpan delay;

delay.Duration = 20000000; // 2 seconds.

auto callback = Callback<ITimerElapsedHandler>([&timerCompleted]


(IThreadPoolTimer* timer) -> HRESULT

wprintf_s(L"Timer fired.\n");

TimeSpan delay;

HRESULT hr = timer->get_Delay(&delay);

if (SUCCEEDED(hr))

wprintf_s(L"Timer duration: %2.2f seconds.\n", delay.Duration /


10000000.0);

// Set the completion event and return.

SetEvent(timerCompleted.Get());

return hr;

});

hr = callback ? S_OK : E_OUTOFMEMORY;

if (FAILED(hr))

return PrintError(__LINE__, hr);

ComPtr<IThreadPoolTimer> timer;

hr = timerFactory->CreateTimer(callback.Get(), delay, &timer);

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Print a message and wait for the timer callback to complete.

wprintf_s(L"Timer started.\nWaiting for timer...\n");

// Wait for the timer to complete.

WaitForSingleObjectEx(timerCompleted.Get(), INFINITE, FALSE);

// All smart pointers and RAII objects go out of scope here.

/*

Output:

Timer started.

Waiting for timer...

Timer fired.

Timer duration: 2.00 seconds.

*/

Компиляция кода
Чтобы скомпилировать код, скопируйте его, а затем вставьте его в проект Visual
Studio или вставьте его в файл с именем wrl-consume-async.cpp , а затем выполните
следующую команду в окне командной строки Visual Studio.

cl.exe wrl-consume-async.cpp runtimeobject.lib

Пример: работа с фоновым потоком


Следующие действия запускают рабочий поток и определяют действие, которое
выполняется этим потоком. Ниже приведен полный пример.

 Совет

В этом примере показано, как работать с интерфейсом


ABI::Windows::Foundation::IAsyncAction . Можно применить этот шаблон к

любому интерфейсу, реализующему IAsyncInfo : IAsyncAction ,


IAsyncActionWithProgress , IAsyncOperation и IAsyncOperationWithProgress .

1. Включите ( #include ) все необходимые среда выполнения Windows, среда


выполнения Windows библиотеку шаблонов C++ или заголовки стандартной
библиотеки C++.

C++

#include <Windows.Foundation.h>

#include <Windows.System.Threading.h>

#include <wrl/event.h>

#include <stdio.h>

#include <Objbase.h>

using namespace ABI::Windows::Foundation;

using namespace ABI::Windows::System::Threading;

using namespace Microsoft::WRL;

using namespace Microsoft::WRL::Wrappers;

В файле Windows.System.Threading.h объявлены типы, необходимые для


использования рабочего потока.

Рекомендуется использовать директиву using namespace в CPP-файле, чтобы


сделать код более удобочитаемым.
2. Инициализируйте среда выполнения Windows.

C++

// Initialize the Windows Runtime.

RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);

if (FAILED(initialize))

return PrintError(__LINE__, initialize);

3. Создайте фабрику активации для интерфейса


ABI::Windows::System::Threading::IThreadPoolStatics .

C++

// Get the activation factory for the IThreadPoolStatics interface.

ComPtr<IThreadPoolStatics> threadPool;

HRESULT hr =
GetActivationFactory(HStringReference(RuntimeClass_Windows_System_Threa
ding_ThreadPool).Get(), &threadPool);

if (FAILED(hr))

return PrintError(__LINE__, hr);

4. Создайте объект Event , который синхронизирует завершение рабочего


потока с основным приложением.

C++

// Create an event that is set after the timer callback completes. We


later use this event to wait for the timer to complete.

// This event is for demonstration only in a console app. In most apps,


you typically don't wait for async operations to complete.

Event threadCompleted(CreateEventEx(nullptr, nullptr,


CREATE_EVENT_MANUAL_RESET, WRITE_OWNER | EVENT_ALL_ACCESS));

hr = threadCompleted.IsValid() ? S_OK :
HRESULT_FROM_WIN32(GetLastError());

if (FAILED(hr))

return PrintError(__LINE__, hr);

7 Примечание
Это событие выполняется только для демонстрации в составе
консольного приложения. В этом примере используется объект-событие,
чтобы удостовериться, что асинхронная операция окончится до
завершения приложения. В большинстве приложений обычно не нужно
ожидать завершения асинхронных операций.

5. Вызовите метод IThreadPoolStatics::RunAsync для создания рабочего потока.


Используйте функцию Callback для определения действия.

C++

wprintf_s(L"Starting thread...\n");

// Create a thread that computes prime numbers.

ComPtr<IAsyncAction> asyncAction;
hr = threadPool->RunAsync(Callback<IWorkItemHandler>([&threadCompleted]
(IAsyncAction* asyncAction) -> HRESULT

// Print a message.

const unsigned int start = 0;

const unsigned int end = 100000;

unsigned int primeCount = 0;

for (int n = start; n < end; n++)

if (IsPrime(n))

primeCount++;

wprintf_s(L"There are %u prime numbers from %u to %u.\n",


primeCount, start, end);

// Set the completion event and return.

SetEvent(threadCompleted.Get());

return S_OK;

}).Get(), &asyncAction);

if (FAILED(hr))

return PrintError(__LINE__, hr);

Функция IsPrime определена в следующем полном примере.

6. Выведите сообщение в окно консоли и дождитесь выполнения потока. Все


объекты ComPtr и RAII покидают область действия и автоматически
освобождаются.
C++

// Print a message and wait for the thread to complete.

wprintf_s(L"Waiting for thread...\n");

// Wait for the thread to complete.

WaitForSingleObjectEx(threadCompleted.Get(), INFINITE, FALSE);

wprintf_s(L"Finished.\n");

// All smart pointers and RAII objects go out of scope here.

Ниже приведен полный пример.

C++

// wrl-consume-asyncOp.cpp

// compile with: runtimeobject.lib

#include <Windows.Foundation.h>

#include <Windows.System.Threading.h>

#include <wrl/event.h>

#include <stdio.h>

#include <Objbase.h>

using namespace ABI::Windows::Foundation;

using namespace ABI::Windows::System::Threading;

using namespace Microsoft::WRL;

using namespace Microsoft::WRL::Wrappers;

// Prints an error string for the provided source code line and HRESULT

// value and returns the HRESULT value as an int.

int PrintError(unsigned int line, HRESULT hr)

wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);

return hr;

// Determines whether the input value is prime.

bool IsPrime(int n)

if (n < 2)

return false;

for (int i = 2; i < n; ++i)

if ((n % i) == 0)

return false;

return true;

int wmain()

// Initialize the Windows Runtime.

RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);

if (FAILED(initialize))

return PrintError(__LINE__, initialize);

// Get the activation factory for the IThreadPoolStatics interface.

ComPtr<IThreadPoolStatics> threadPool;

HRESULT hr =
GetActivationFactory(HStringReference(RuntimeClass_Windows_System_Threading_
ThreadPool).Get(), &threadPool);

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Create an event that is set after the timer callback completes. We


later use this event to wait for the timer to complete.

// This event is for demonstration only in a console app. In most apps,


you typically don't wait for async operations to complete.

Event threadCompleted(CreateEventEx(nullptr, nullptr,


CREATE_EVENT_MANUAL_RESET, WRITE_OWNER | EVENT_ALL_ACCESS));

hr = threadCompleted.IsValid() ? S_OK :
HRESULT_FROM_WIN32(GetLastError());

if (FAILED(hr))

return PrintError(__LINE__, hr);

wprintf_s(L"Starting thread...\n");

// Create a thread that computes prime numbers.

ComPtr<IAsyncAction> asyncAction;

hr = threadPool->RunAsync(Callback<IWorkItemHandler>([&threadCompleted]
(IAsyncAction* asyncAction) -> HRESULT

// Print a message.

const unsigned int start = 0;

const unsigned int end = 100000;

unsigned int primeCount = 0;

for (int n = start; n < end; n++)

if (IsPrime(n))

primeCount++;

wprintf_s(L"There are %u prime numbers from %u to %u.\n",


primeCount, start, end);

// Set the completion event and return.

SetEvent(threadCompleted.Get());

return S_OK;

}).Get(), &asyncAction);

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Print a message and wait for the thread to complete.

wprintf_s(L"Waiting for thread...\n");

// Wait for the thread to complete.

WaitForSingleObjectEx(threadCompleted.Get(), INFINITE, FALSE);

wprintf_s(L"Finished.\n");

// All smart pointers and RAII objects go out of scope here.

/*

Output:

Starting thread...

Waiting for thread...

There are 9592 prime numbers from 0 to 100000.

Finished.

*/

Компиляция кода
Чтобы скомпилировать код, скопируйте его, а затем вставьте его в проект Visual
Studio или вставьте его в файл с именем wrl-consume-asyncOp.cpp , а затем
выполните следующую команду в окне командной строки Visual Studio .

cl.exe wrl-consume-asyncOp.cpp runtimeobject.lib

См. также раздел


Библиотека шаблонов C++ среды выполнения Windows (WRL)
Практическое руководство.
Обработка событий с
использованием WRL
Статья • 03.04.2023

В этом документе показано, как использовать библиотеку шаблонов среда


выполнения Windows C++, чтобы подписаться на события объекта среда
выполнения Windows и обрабатывать их.

Более простой пример создания экземпляра этого компонента и получения


значения свойства см. в разделе "Практическое руководство. Активация и
использование компонента среда выполнения Windows".

Подписка на события и их обработка


Следующие действия запускают объект
ABI::Windows::System::Threading::IDeviceWatcher и используют обработчики
событий для отслеживания прогресса. Интерфейс IDeviceWatcher позволяет
перечислять устройства асинхронно (или в фоновом режиме) и получать
уведомление при добавлении, удалении и изменении устройства. Функция
обратного вызова является важной частью этого примера, так как она позволяет
указать обработчики событий, обрабатывающие результаты фоновой операции.
Ниже приведен полный пример.

2 Предупреждение

Хотя обычно в приложении универсальная платформа Windows используется


библиотека шаблонов среда выполнения Windows C++, в этом примере
используется консольное приложение для иллюстрации. Такие функции, как
wprintf_s недоступны в приложении универсальная платформа Windows.

Дополнительные сведения о типах и функциях, которые можно использовать в


приложении универсальная платформа Windows, см. в функциях CRT, которые
не поддерживаются в приложениях универсальная платформа Windows и
Win32 и COM для приложений UWP.

1. Включите ( #include ) все необходимые среда выполнения Windows, среда


выполнения Windows библиотеку шаблонов C++ или заголовки стандартной
библиотеки C++.
C++

#include <Windows.Devices.Enumeration.h>

#include <wrl/event.h>

#include <stdio.h>

using namespace ABI::Windows::Devices::Enumeration;

using namespace ABI::Windows::Foundation;

using namespace Microsoft::WRL;

using namespace Microsoft::WRL::Wrappers;

Windows.Devices.Enumeration.h объявляет типы, необходимые для


перечисления устройств.

Рекомендуется использовать директиву using namespace в CPP-файле, чтобы


сделать код более удобочитаемым.

2. Объявите локальные переменные для приложения. Этот пример проводит


подсчет количества перечисленных устройств и токенов регистрации,
которые позволяют в дальнейшем отменять подписку на события.

C++

// Counts the number of enumerated devices.

unsigned int deviceCount = 0;

// Event registration tokens that enable us to later unsubscribe from


events.

EventRegistrationToken addedToken;

EventRegistrationToken stoppedToken;

EventRegistrationToken enumCompletedToken;

3. Инициализируйте среда выполнения Windows.

C++

// Initialize the Windows Runtime.

RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);

if (FAILED(initialize))

return PrintError(__LINE__, initialize);

4. Создайте объект Event , который синхронизирует завершение процесса


перечисления с основным приложением.

C++
// Create an event that is set after device enumeration completes. We
later use this event to wait for the timer to complete.

// This event is for demonstration only in a console app. In most apps,


you typically don't wait for async operations to complete.

Event enumerationCompleted(CreateEventEx(nullptr, nullptr,


CREATE_EVENT_MANUAL_RESET, WRITE_OWNER | EVENT_ALL_ACCESS));

HRESULT hr = enumerationCompleted.IsValid() ? S_OK :


HRESULT_FROM_WIN32(GetLastError());

if (FAILED(hr))

return PrintError(__LINE__, hr);

7 Примечание

Это событие выполняется только для демонстрации в составе


консольного приложения. В этом примере используется объект-событие,
чтобы удостовериться, что асинхронная операция окончится до
завершения приложения. В большинстве приложений обычно не нужно
ожидать завершения асинхронных операций.

5. Создайте фабрику активации для интерфейса IDeviceWatcher .

C++

// Get the activation factory for the IDeviceWatcher interface.

ComPtr<IDeviceInformationStatics> watcherFactory;

hr =
ABI::Windows::Foundation::GetActivationFactory(HStringReference(Runtime
Class_Windows_Devices_Enumeration_DeviceInformation).Get(),
&watcherFactory);

if (FAILED(hr))

return PrintError(__LINE__, hr);

В среда выполнения Windows используются полные имена для


идентификации типов. Параметр
RuntimeClass_Windows_Devices_Enumeration_DeviceInformation — это строка,
предоставляемая среда выполнения Windows и содержащая требуемое имя
класса среды выполнения.

6. Создание объекта IDeviceWatcher .

C++
// Create a IDeviceWatcher object from the factory.

ComPtr<IDeviceWatcher> watcher;

hr = watcherFactory->CreateWatcher(&watcher);

if (FAILED(hr))

return PrintError(__LINE__, hr);

7. Используйте функцию Callback для подписки на события Added ,


EnumerationCompleted и Stopped .

C++

// Subscribe to the Added event.

hr = watcher->add_Added(Callback<AddedHandler>([&deviceCount]
(IDeviceWatcher* watcher, IDeviceInformation*) -> HRESULT

// Print a message and increment the device count.

// When we reach 10 devices, stop enumerating devices.

wprintf_s(L"Added device...\n");

deviceCount++;

if (deviceCount == 10)

return watcher->Stop();

return S_OK;

}).Get(), &addedToken);

if (FAILED(hr))

return PrintError(__LINE__, hr);

hr = watcher->add_Stopped(Callback<StoppedHandler>([=,
&enumerationCompleted](IDeviceWatcher* watcher, IInspectable*) ->
HRESULT

wprintf_s(L"Device enumeration stopped.\nRemoving event


handlers...");

// Unsubscribe from the events. This is shown for demonstration.

// The need to remove event handlers depends on the requirements of

// your app. For instance, if you only need to handle an event for

// a short period of time, you might remove the event handler when
you

// no longer need it. If you handle an event for the duration of


the app,

// you might not need to explicitly remove it.

HRESULT hr1 = watcher->remove_Added(addedToken);

HRESULT hr2 = watcher->remove_Stopped(stoppedToken);

HRESULT hr3 = watcher-


>remove_EnumerationCompleted(enumCompletedToken);

// Set the completion event and return.

SetEvent(enumerationCompleted.Get());

return FAILED(hr1) ? hr1 : FAILED(hr2) ? hr2 : hr3;

}).Get(), &stoppedToken);

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Subscribe to the EnumerationCompleted event.

hr = watcher-
>add_EnumerationCompleted(Callback<EnumerationCompletedHandler>([]
(IDeviceWatcher* watcher, IInspectable*) -> HRESULT

wprintf_s(L"Enumeration completed.\n");

return watcher->Stop();

}).Get(), &enumCompletedToken);

if (FAILED(hr))

return PrintError(__LINE__, hr);

Обработчик событий Added увеличивает число перечисленных устройств. Он


останавливает процесс перечисления после обнаружения десяти устройств.

Обработчик событий Stopped удаляет обработчики событий и задает событие


завершения.

Обработчик событий EnumerationCompleted останавливает процесс


перечисления. Рекомендуется обрабатывать это событие, если имеется менее
десяти устройств.

 Совет

В этом примере используется лямбда-выражение для определения


обратных вызовов. Можно также использовать объекты функций
(functors), указатели функций или объекты std::function . Дополнительные
сведения о лямбда-выражениях см. в разделе Лямбда-выражения.

8. Запустите процесс перечисления.

C++
wprintf_s(L"Starting device enumeration...\n");

hr = watcher->Start();

if (FAILED(hr))

return PrintError(__LINE__, hr);

9. Дождитесь завершения процесса перечисления, а затем выведите сообщение.


Все объекты ComPtr и RAII покидают область действия и автоматически
освобождаются.

C++

// Wait for the operation to complete.

WaitForSingleObjectEx(enumerationCompleted.Get(), INFINITE, FALSE);

wprintf_s(L"Enumerated %u devices.\n", deviceCount);

// All smart pointers and RAII objects go out of scope here.

Ниже приведен полный пример.

C++

// wrl-consume-events.cpp

// compile with: runtimeobject.lib

#include <Windows.Devices.Enumeration.h>

#include <wrl/event.h>

#include <stdio.h>

using namespace ABI::Windows::Devices::Enumeration;

using namespace ABI::Windows::Foundation;

using namespace Microsoft::WRL;

using namespace Microsoft::WRL::Wrappers;

// Prints an error string for the provided source code line and HRESULT

// value and returns the HRESULT value as an int.

int PrintError(unsigned int line, HRESULT hr)

wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);

return hr;

int wmain()

// Type define the event handler types to make the code more readable.

typedef
__FITypedEventHandler_2_Windows__CDevices__CEnumeration__CDeviceWatcher_Wind
ows__CDevices__CEnumeration__CDeviceInformation AddedHandler;

typedef
__FITypedEventHandler_2_Windows__CDevices__CEnumeration__CDeviceWatcher_IIns
pectable EnumerationCompletedHandler;

typedef
__FITypedEventHandler_2_Windows__CDevices__CEnumeration__CDeviceWatcher_IIns
pectable StoppedHandler;

// Counts the number of enumerated devices.

unsigned int deviceCount = 0;

// Event registration tokens that enable us to later unsubscribe from


events.

EventRegistrationToken addedToken;

EventRegistrationToken stoppedToken;

EventRegistrationToken enumCompletedToken;

// Initialize the Windows Runtime.

RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);

if (FAILED(initialize))

return PrintError(__LINE__, initialize);

// Create an event that is set after device enumeration completes. We


later use this event to wait for the timer to complete.

// This event is for demonstration only in a console app. In most apps,


you typically don't wait for async operations to complete.

Event enumerationCompleted(CreateEventEx(nullptr, nullptr,


CREATE_EVENT_MANUAL_RESET, WRITE_OWNER | EVENT_ALL_ACCESS));

HRESULT hr = enumerationCompleted.IsValid() ? S_OK :


HRESULT_FROM_WIN32(GetLastError());

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Get the activation factory for the IDeviceWatcher interface.

ComPtr<IDeviceInformationStatics> watcherFactory;

hr =
ABI::Windows::Foundation::GetActivationFactory(HStringReference(RuntimeClass
_Windows_Devices_Enumeration_DeviceInformation).Get(), &watcherFactory);

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Create a IDeviceWatcher object from the factory.

ComPtr<IDeviceWatcher> watcher;

hr = watcherFactory->CreateWatcher(&watcher);

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Subscribe to the Added event.

hr = watcher->add_Added(Callback<AddedHandler>([&deviceCount]
(IDeviceWatcher* watcher, IDeviceInformation*) -> HRESULT

// Print a message and increment the device count.

// When we reach 10 devices, stop enumerating devices.

wprintf_s(L"Added device...\n");

deviceCount++;

if (deviceCount == 10)

return watcher->Stop();

return S_OK;

}).Get(), &addedToken);

if (FAILED(hr))

return PrintError(__LINE__, hr);

hr = watcher->add_Stopped(Callback<StoppedHandler>([=,
&enumerationCompleted](IDeviceWatcher* watcher, IInspectable*) -> HRESULT

wprintf_s(L"Device enumeration stopped.\nRemoving event


handlers...");

// Unsubscribe from the events. This is shown for demonstration.

// The need to remove event handlers depends on the requirements of

// your app. For instance, if you only need to handle an event for

// a short period of time, you might remove the event handler when
you

// no longer need it. If you handle an event for the duration of the
app,

// you might not need to explicitly remove it.

HRESULT hr1 = watcher->remove_Added(addedToken);

HRESULT hr2 = watcher->remove_Stopped(stoppedToken);

HRESULT hr3 = watcher-


>remove_EnumerationCompleted(enumCompletedToken);

// Set the completion event and return.

SetEvent(enumerationCompleted.Get());

return FAILED(hr1) ? hr1 : FAILED(hr2) ? hr2 : hr3;

}).Get(), &stoppedToken);

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Subscribe to the EnumerationCompleted event.

hr = watcher-
>add_EnumerationCompleted(Callback<EnumerationCompletedHandler>([]
(IDeviceWatcher* watcher, IInspectable*) -> HRESULT

wprintf_s(L"Enumeration completed.\n");

return watcher->Stop();

}).Get(), &enumCompletedToken);

if (FAILED(hr))

return PrintError(__LINE__, hr);

wprintf_s(L"Starting device enumeration...\n");

hr = watcher->Start();

if (FAILED(hr))

return PrintError(__LINE__, hr);

// Wait for the operation to complete.

WaitForSingleObjectEx(enumerationCompleted.Get(), INFINITE, FALSE);

wprintf_s(L"Enumerated %u devices.\n", deviceCount);

// All smart pointers and RAII objects go out of scope here.

/*

Sample output:

Starting device enumeration...

Added device...

Added device...

Added device...

Added device...

Added device...

Added device...

Added device...

Added device...

Added device...

Added device...

Device enumeration stopped.

Removing event handlers...

Enumerated 10 devices.

*/

Компиляция кода
Чтобы скомпилировать код, скопируйте его, а затем вставьте его в проект Visual
Studio или вставьте его в файл с именем wrl-consume-events.cpp , а затем
выполните следующую команду в окне командной строки Visual Studio .

cl.exe wrl-consume-events.cpp runtimeobject.lib

См. также раздел


Библиотека шаблонов C++ среды выполнения Windows (WRL)
Пошаговое руководство. Создание
приложения UWP с использованием
WRL и Media Foundation
Статья • 03.04.2023

7 Примечание

Для новых приложений и компонентов UWP рекомендуется использовать


C++/WinRT, новую стандартную языковую проекцию C++17 для api среда
выполнения Windows. C++/WinRT доступна в Windows SDK начиная с версии
1803 (10.0.17134.0). C++/WinRT реализована полностью в файлах заголовков и
предназначена для предоставления доступа к современным API Windows
через первый класс.

В этом руководстве описано, как использовать библиотеку шаблонов среда


выполнения Windows C++ (WRL) для создания приложения универсальная
платформа Windows (UWP), использующего Microsoft Media Foundation.

В этом примере создается пользовательское преобразование Media Foundation. Он


применяет эффект оттенка серого к изображениям, захваченным с веб-камеры.
Приложение использует C++ для определения пользовательского преобразования
и C# для использования компонента и выполнения преобразования захваченного
изображения.

7 Примечание

Чтобы воспользоваться пользовательским компонентом преобразования


вместо C# можно также использовать JavaScript, Visual Basic или C++.

Как правило, для создания среда выполнения Windows компонентов можно


использовать C++/CX. Однако иногда необходимо использовать WRL. Например,
при создании расширения мультимедиа для Microsoft Media Foundation
необходимо создать компонент, реализующий интерфейсы COM и среда
выполнения Windows. Так как C++/CX может создавать только объекты среда
выполнения Windows, для создания расширения мультимедиа необходимо
использовать WRL. Это связано с тем, что он обеспечивает реализацию
интерфейсов COM и среда выполнения Windows.
7 Примечание

Хотя этот пример кода является объемным, он показывает минимум,


необходимый для создания полезных преобразований Media Foundation. Его
можно использовать в качестве отправной точки для собственного
пользовательского преобразования. Этот пример адаптирован из примера
расширений мультимедиа , который использует расширения мультимедиа
для применения эффектов к видео, декодированию видео и созданию
обработчиков схем, которые создают потоки мультимедиа.

Предварительные требования
В Visual Studio 2017 и более поздних версиях поддержка UWP является
необязательным компонентом. Чтобы установить его, откройте Visual Studio
Installer в меню "Пуск" Windows и найдите свою версию Visual Studio.
Нажмите кнопку "Изменить", а затем убедитесь, что выбрана плитка
"Разработка универсальная платформа Windows". В разделе
"Дополнительные компоненты" проверьте инструменты C++ для UWP
(версия 141) для Visual Studio 2017 или средства C++ для UWP (версия 142)
для Visual Studio 2019. Затем проверьте версию windows SDK, которую вы
хотите использовать.

Опыт работы с среда выполнения Windows.

опыт работы с моделью COM;

Веб-камера,

Ключевые моменты
Для создания пользовательского компонента Media Foundation используйте
файл определения языка MIDL, чтобы определить и реализовать интерфейс, а
затем сделать его активируемым из других компонентов.

Атрибуты namespace и runtimeclass NTDDI_WIN8 атрибуты версии являются


важными частями определения MIDL для компонента Media Foundation,
использующего WRL.

Microsoft::WRL::RuntimeClass — базовый класс для пользовательского


компонента Media Foundation. Значение перечисления
[ Microsoft::WRL::RuntimeClassType::WinRtClassicComMix] (runtimeclasstype-
enumeration.md), которое предоставляется в качестве аргумента шаблона,
помечает класс для использования как в качестве класса среда выполнения
Windows, так и в качестве классического класса среды выполнения COM.

Макрос InspectableClass реализует основные функции COM, такие как подсчет


ссылок и QueryInterface метод, и задает имя класса среды выполнения и
уровень доверия.

Microsoft::WRL::Module Используйте класс для реализации функций точки


входа DLL, таких как DllGetActivationFactory, DllCanUnloadNowи
DllGetClassObject.

Связывание библиотеки DLL компонента с runtimeobject.lib . Кроме того,


укажите /WINMD в строке компоновщика для создания метаданных Windows.

Используйте ссылки на проекты, чтобы сделать компоненты WRL доступными


для приложений UWP.

Использование WRL для создания компонента


преобразования оттенков серого в Media Foundation
1. В Visual Studio создайте проект пустого решения . Назовите проект, например
MediaCapture.

2. Добавьте проект DLL (универсальной версии Windows) в решение. Назовите


проект, например GrayscaleTransform.

3. Добавьте файл MIDL (IDL) в проект. Присвойт файлу имя, например


GrayscaleTransform.idl .

4. Добавьте этот код в GrayscaleTransform.idl:

C++

import "Windows.Media.idl";

#include <sdkddkver.h>

namespace GrayscaleTransform

[version(NTDDI_WIN8), activatable(NTDDI_WIN8)]

runtimeclass GrayscaleEffect
{

[default] interface Windows.Media.IMediaExtension;

5. Используйте следующий код для замены содержимого pch.h :

C++

#pragma once

#include "targetver.h"

#include <new>

#include <mfapi.h>

#include <mftransform.h>

#include <mfidl.h>

#include <mferror.h>

#include <strsafe.h>

#include <assert.h>

// Note: The Direct2D helper library is included for its 2D matrix


operations.

#include <D2d1helper.h>

#include <wrl\implements.h>

#include <wrl\module.h>
#include <windows.media.h>

6. Добавьте новый файл заголовка в проект, присвойте ему BufferLock.h имя, а


затем замените содержимое следующим кодом:

C++

#pragma once

// Locks a video buffer that might or might not support IMF2DBuffer.

class VideoBufferLock

public:

VideoBufferLock(IMFMediaBuffer *pBuffer) : m_p2DBuffer(nullptr)

m_pBuffer = pBuffer;

m_pBuffer->AddRef();

// Query for the 2-D buffer interface. OK if this fails.

m_pBuffer->QueryInterface(IID_PPV_ARGS(&m_p2DBuffer));

~VideoBufferLock()

UnlockBuffer();

m_pBuffer->Release();

if (m_p2DBuffer)

m_p2DBuffer->Release();

// LockBuffer:

// Locks the buffer. Returns a pointer to scan line 0 and returns


the stride.

// The caller must provide the default stride as an input


parameter, in case

// the buffer does not expose IMF2DBuffer. You can calculate the
default stride

// from the media type.

HRESULT LockBuffer(

LONG lDefaultStride, // Minimum stride (with no padding).

DWORD dwHeightInPixels, // Height of the image, in pixels.

BYTE **ppbScanLine0, // Receives a pointer to the start of


scan line 0.

LONG *plStride // Receives the actual stride.

HRESULT hr = S_OK;

// Use the 2-D version if available.

if (m_p2DBuffer)

hr = m_p2DBuffer->Lock2D(ppbScanLine0, plStride);

else

// Use non-2D version.

BYTE *pData = nullptr;

hr = m_pBuffer->Lock(&pData, nullptr, nullptr);

if (SUCCEEDED(hr))

*plStride = lDefaultStride;

if (lDefaultStride < 0)

// Bottom-up orientation. Return a pointer to the


start of the

// last row *in memory* which is the top row of the


image.

*ppbScanLine0 = pData + abs(lDefaultStride) *


(dwHeightInPixels - 1);

else

// Top-down orientation. Return a pointer to the


start of the

// buffer.

*ppbScanLine0 = pData;

return hr;

HRESULT UnlockBuffer()

if (m_p2DBuffer)

return m_p2DBuffer->Unlock2D();

else

return m_pBuffer->Unlock();

private:

IMFMediaBuffer *m_pBuffer;

IMF2DBuffer *m_p2DBuffer;
};

7. GrayscaleTransform.h не используется в этом примере. Его можно удалить из


проекта при необходимости.

8. Используйте следующий код для замены содержимого


GrayscaleTransform.cpp :

C++

#include "pch.h"

#include "GrayscaleTransform_h.h"

#include "BufferLock.h"

using namespace Microsoft::WRL;

//

// * IMPORTANT: If you implement your own MFT, create a new GUID for
the CLSID. *

//

// Configuration attributes

// {7BBBB051-133B-41F5-B6AA-5AFF9B33A2CB}

GUID const MFT_GRAYSCALE_DESTINATION_RECT = {0x7bbbb051, 0x133b,


0x41f5, 0xb6, 0xaa, 0x5a, 0xff, 0x9b, 0x33, 0xa2, 0xcb};

// {14782342-93E8-4565-872C-D9A2973D5CBF}

GUID const MFT_GRAYSCALE_SATURATION = {0x14782342, 0x93e8, 0x4565,


0x87, 0x2c, 0xd9, 0xa2, 0x97, 0x3d, 0x5c, 0xbf};

// {E0BADE5D-E4B9-4689-9DBA-E2F00D9CED0E}

GUID const MFT_GRAYSCALE_CHROMA_ROTATION = {0xe0bade5d, 0xe4b9, 0x4689,


0x9d, 0xba, 0xe2, 0xf0, 0xd, 0x9c, 0xed, 0xe};

template <class T> void SafeRelease(T **ppT)

if (*ppT)

(*ppT)->Release();

*ppT = nullptr;

// Function pointer for the function that transforms the image.

typedef void (*IMAGE_TRANSFORM_FN)(

const D2D1::Matrix3x2F& mat, // Chroma transform


matrix.

const D2D_RECT_U& rcDest, // Destination rectangle


for the transformation.

BYTE* pDest, // Destination buffer.

LONG lDestStride, // Destination stride.

const BYTE* pSrc, // Source buffer.

LONG lSrcStride, // Source stride.

DWORD dwWidthInPixels, // Image width in pixels.

DWORD dwHeightInPixels // Image height in pixels.

);

// Implements a grayscale video effect.

class CGrayscale

: public RuntimeClass<

RuntimeClassFlags<RuntimeClassType::WinRtClassicComMix>,

ABI::Windows::Media::IMediaExtension,

IMFTransform>

InspectableClass(RuntimeClass_GrayscaleTransform_GrayscaleEffect,
BaseTrust)

public:

CGrayscale();

STDMETHOD(RuntimeClassInitialize)();

// IMediaExtension

STDMETHODIMP
SetProperties(ABI::Windows::Foundation::Collections::IPropertySet
*pConfiguration);

// IMFTransform

STDMETHODIMP GetStreamLimits(

DWORD *pdwInputMinimum,
DWORD *pdwInputMaximum,
DWORD *pdwOutputMinimum,

DWORD *pdwOutputMaximum
);

STDMETHODIMP GetStreamCount(

DWORD *pcInputStreams,

DWORD *pcOutputStreams

);

STDMETHODIMP GetStreamIDs(

DWORD dwInputIDArraySize,

DWORD *pdwInputIDs,

DWORD dwOutputIDArraySize,

DWORD *pdwOutputIDs

);

STDMETHODIMP GetInputStreamInfo(

DWORD dwInputStreamID,

MFT_INPUT_STREAM_INFO * pStreamInfo

);

STDMETHODIMP GetOutputStreamInfo(

DWORD dwOutputStreamID,

MFT_OUTPUT_STREAM_INFO * pStreamInfo

);

STDMETHODIMP GetAttributes(IMFAttributes** pAttributes);

STDMETHODIMP GetInputStreamAttributes(

DWORD dwInputStreamID,

IMFAttributes **ppAttributes

);

STDMETHODIMP GetOutputStreamAttributes(

DWORD dwOutputStreamID,

IMFAttributes **ppAttributes

);

STDMETHODIMP DeleteInputStream(DWORD dwStreamID);

STDMETHODIMP AddInputStreams(

DWORD cStreams,

DWORD *adwStreamIDs

);

STDMETHODIMP GetInputAvailableType(

DWORD dwInputStreamID,

DWORD dwTypeIndex, // 0-based

IMFMediaType **ppType

);

STDMETHODIMP GetOutputAvailableType(

DWORD dwOutputStreamID,

DWORD dwTypeIndex, // 0-based

IMFMediaType **ppType

);

STDMETHODIMP SetInputType(

DWORD dwInputStreamID,

IMFMediaType *pType,

DWORD dwFlags

);

STDMETHODIMP SetOutputType(

DWORD dwOutputStreamID,

IMFMediaType *pType,

DWORD dwFlags

);

STDMETHODIMP GetInputCurrentType(

DWORD dwInputStreamID,

IMFMediaType **ppType

);

STDMETHODIMP GetOutputCurrentType(

DWORD dwOutputStreamID,

IMFMediaType **ppType

);

STDMETHODIMP GetInputStatus(

DWORD dwInputStreamID,

DWORD *pdwFlags
);

STDMETHODIMP GetOutputStatus(DWORD *pdwFlags);

STDMETHODIMP SetOutputBounds(

LONGLONG hnsLowerBound,

LONGLONG hnsUpperBound

);

STDMETHODIMP ProcessEvent(

DWORD dwInputStreamID,

IMFMediaEvent *pEvent

);

STDMETHODIMP ProcessMessage(

MFT_MESSAGE_TYPE eMessage,

ULONG_PTR ulParam

);

STDMETHODIMP ProcessInput(

DWORD dwInputStreamID,

IMFSample *pSample,

DWORD dwFlags

);

STDMETHODIMP ProcessOutput(

DWORD dwFlags,

DWORD cOutputBufferCount,

MFT_OUTPUT_DATA_BUFFER *pOutputSamples, // one per stream


DWORD *pdwStatus

);

private:

~CGrayscale();

// HasPendingOutput: Returns TRUE if the MFT is holding an input


sample.

BOOL HasPendingOutput() const { return m_pSample != nullptr; }

// IsValidInputStream: Returns TRUE if dwInputStreamID is a valid


input stream identifier.

BOOL IsValidInputStream(DWORD dwInputStreamID) const

return dwInputStreamID == 0;

// IsValidOutputStream: Returns TRUE if dwOutputStreamID is a valid


output stream identifier.

BOOL IsValidOutputStream(DWORD dwOutputStreamID) const

return dwOutputStreamID == 0;

HRESULT OnGetPartialType(DWORD dwTypeIndex, IMFMediaType **ppmt);

HRESULT OnCheckInputType(IMFMediaType *pmt);

HRESULT OnCheckOutputType(IMFMediaType *pmt);

HRESULT OnCheckMediaType(IMFMediaType *pmt);

void OnSetInputType(IMFMediaType *pmt);

void OnSetOutputType(IMFMediaType *pmt);

HRESULT BeginStreaming();

HRESULT EndStreaming();

HRESULT OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut);

HRESULT OnFlush();

HRESULT UpdateFormatInfo();

CRITICAL_SECTION m_critSec;

// Transformation parameters

D2D1::Matrix3x2F m_transform; // Chroma


transform matrix.

D2D_RECT_U m_rcDest; //
Destination rectangle for the effect.

// Streaming

bool m_bStreamingInitialized;

IMFSample *m_pSample; // Input


sample.

IMFMediaType *m_pInputType; // Input


media type.

IMFMediaType *m_pOutputType; // Output


media type.

// Fomat information

UINT32 m_imageWidthInPixels;

UINT32 m_imageHeightInPixels;

DWORD m_cbImageSize; // Image


size, in bytes.

IMFAttributes *m_pAttributes;

// Image transform function. (Changes based on the media type.)

IMAGE_TRANSFORM_FN m_pTransformFn;

};

ActivatableClass(CGrayscale);

#pragma comment(lib, "d2d1")

/*

This sample implements a video effect as a Media Foundation transform


(MFT).

The video effect manipulates chroma values in a YUV image. In the


default setting,

the entire image is converted to grayscale. Optionally, the application


may set any

of the following attributes:

MFT_GRAYSCALE_DESTINATION_RECT (type = blob, UINT32[4] array)

Sets the destination rectangle for the effect. Pixels outside the
destination

rectangle are not altered.

MFT_GRAYSCALE_SATURATION (type = double)

Sets the saturation level. The nominal range is [0...1]. Values


beyond 1.0f

result in supersaturated colors. Values below 0.0f create inverted


colors.

MFT_GRAYSCALE_CHROMA_ROTATION (type = double)

Rotates the chroma values of each pixel. The attribue value is the
angle of

rotation in degrees. The result is a shift in hue.

The effect is implemented by treating the chroma value of each pixel as


a vector [u,v],

and applying a transformation matrix to the vector. The saturation


parameter is applied

as a scaling transform.

NOTES ON THE MFT IMPLEMENTATION

1. The MFT has fixed streams: One input stream and one output stream.

2. The MFT supports the following formats: UYVY, YUY2, NV12.

3. If the MFT is holding an input sample, SetInputType and


SetOutputType both fail.

4. The input and output types must be identical.

5. If both types are set, no type can be set until the current type is
cleared.

6. Preferred input types:

(a) If the output type is set, that's the preferred type.

(b) Otherwise, the preferred types are partial types, constructed


from the

list of supported subtypes.

7. Preferred output types: As above.

8. Streaming:

The private BeingStreaming() method is called in response to the

MFT_MESSAGE_NOTIFY_BEGIN_STREAMING message.

If the client does not send MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, the


MFT calls

BeginStreaming inside the first call to ProcessInput or


ProcessOutput.

This is a good approach for allocating resources that your MFT


requires for

streaming.

9. The configuration attributes are applied in the BeginStreaming


method. If the

client changes the attributes during streaming, the change is


ignored until

streaming is stopped (either by changing the media types or by


sending the

MFT_MESSAGE_NOTIFY_END_STREAMING message) and then restarted.

*/

// Video FOURCC codes.

const DWORD FOURCC_YUY2 = '2YUY';

const DWORD FOURCC_UYVY = 'YVYU';

const DWORD FOURCC_NV12 = '21VN';

// Static array of media types (preferred and accepted).

const GUID g_MediaSubtypes[] =

MFVideoFormat_NV12,

MFVideoFormat_YUY2,

MFVideoFormat_UYVY

};

HRESULT GetImageSize(DWORD fcc, UINT32 width, UINT32 height, DWORD*


pcbImage);

HRESULT GetDefaultStride(IMFMediaType *pType, LONG *plStride);

bool ValidateRect(const RECT& rc);

template <typename T>

inline T clamp(const T& val, const T& minVal, const T& maxVal)

return (val < minVal ? minVal : (val > maxVal ? maxVal : val));

// TransformChroma:

// Apply the transforms to calculate the output chroma values.

void TransformChroma(const D2D1::Matrix3x2F& mat, BYTE *pu, BYTE *pv)

// Normalize the chroma values to [-112, 112] range

D2D1_POINT_2F pt = { static_cast<float>(*pu) - 128,


static_cast<float>(*pv) - 128 };

pt = mat.TransformPoint(pt);

// Clamp to valid range.

clamp(pt.x, -112.0f, 112.0f);

clamp(pt.y, -112.0f, 112.0f);

// Map back to [16...240] range.

*pu = static_cast<BYTE>(pt.x + 128.0f);

*pv = static_cast<BYTE>(pt.y + 128.0f);

//-------------------------------------------------------------------

// Functions to convert a YUV images to grayscale.

//

// In all cases, the same transformation is applied to the 8-bit

// chroma values, but the pixel layout in memory differs.

//

// The image conversion functions take the following parameters:

//

// mat Transfomation matrix for chroma values.

// rcDest Destination rectangle.

// pDest Pointer to the destination buffer.

// lDestStride Stride of the destination buffer, in bytes.

// pSrc Pointer to the source buffer.

// lSrcStride Stride of the source buffer, in bytes.

// dwWidthInPixels Frame width in pixels.

// dwHeightInPixels Frame height, in pixels.

//-------------------------------------------------------------------

// Convert UYVY image.

void TransformImage_UYVY(

const D2D1::Matrix3x2F& mat,

const D2D_RECT_U& rcDest,

_Inout_updates_(_Inexpressible_(lDestStride * dwHeightInPixels))
BYTE *pDest,

_In_ LONG lDestStride,

_In_reads_(_Inexpressible_(lSrcStride * dwHeightInPixels)) const


BYTE* pSrc,

_In_ LONG lSrcStride,

_In_ DWORD dwWidthInPixels,

_In_ DWORD dwHeightInPixels)

DWORD y = 0;

const DWORD y0 = min(rcDest.bottom, dwHeightInPixels);

// Lines above the destination rectangle.

for ( ; y < rcDest.top; y++)

memcpy(pDest, pSrc, dwWidthInPixels * 2);

pSrc += lSrcStride;

pDest += lDestStride;

// Lines within the destination rectangle.

for ( ; y < y0; y++)

WORD *pSrc_Pixel = (WORD*)pSrc;

WORD *pDest_Pixel = (WORD*)pDest;

for (DWORD x = 0; (x + 1) < dwWidthInPixels; x += 2)

// Byte order is U0 Y0 V0 Y1

// Each WORD is a byte pair (U/V, Y)

// Windows is little-endian so the order appears reversed.

if (x >= rcDest.left && x < rcDest.right)

BYTE u = pSrc_Pixel[x] & 0x00FF;

BYTE v = pSrc_Pixel[x+1] & 0x00FF;

TransformChroma(mat, &u, &v);

pDest_Pixel[x] = (pSrc_Pixel[x] & 0xFF00) | u;

pDest_Pixel[x+1] = (pSrc_Pixel[x+1] & 0xFF00) | v;

else

#pragma warning(push)

#pragma warning(disable: 6385)

#pragma warning(disable: 6386)

pDest_Pixel[x] = pSrc_Pixel[x];

pDest_Pixel[x+1] = pSrc_Pixel[x+1];

#pragma warning(pop)

pDest += lDestStride;

pSrc += lSrcStride;

// Lines below the destination rectangle.

for ( ; y < dwHeightInPixels; y++)

memcpy(pDest, pSrc, dwWidthInPixels * 2);

pSrc += lSrcStride;

pDest += lDestStride;

// Convert YUY2 image.

void TransformImage_YUY2(

const D2D1::Matrix3x2F& mat,

const D2D_RECT_U& rcDest,

_Inout_updates_(_Inexpressible_(lDestStride * dwHeightInPixels))
BYTE *pDest,

_In_ LONG lDestStride,

_In_reads_(_Inexpressible_(lSrcStride * dwHeightInPixels)) const


BYTE* pSrc,

_In_ LONG lSrcStride,

_In_ DWORD dwWidthInPixels,

_In_ DWORD dwHeightInPixels)

DWORD y = 0;

const DWORD y0 = min(rcDest.bottom, dwHeightInPixels);

// Lines above the destination rectangle.

for ( ; y < rcDest.top; y++)

memcpy(pDest, pSrc, dwWidthInPixels * 2);

pSrc += lSrcStride;

pDest += lDestStride;

// Lines within the destination rectangle.

for ( ; y < y0; y++)

WORD *pSrc_Pixel = (WORD*)pSrc;

WORD *pDest_Pixel = (WORD*)pDest;

for (DWORD x = 0; (x + 1) < dwWidthInPixels; x += 2)

// Byte order is Y0 U0 Y1 V0

// Each WORD is a byte pair (Y, U/V)

// Windows is little-endian so the order appears reversed.

if (x >= rcDest.left && x < rcDest.right)

BYTE u = pSrc_Pixel[x] >> 8;

BYTE v = pSrc_Pixel[x+1] >> 8;

TransformChroma(mat, &u, &v);

pDest_Pixel[x] = (pSrc_Pixel[x] & 0x00FF) | (u<<8);

pDest_Pixel[x+1] = (pSrc_Pixel[x+1] & 0x00FF) | (v<<8);

else

#pragma warning(push)

#pragma warning(disable: 6385)

#pragma warning(disable: 6386)

pDest_Pixel[x] = pSrc_Pixel[x];

pDest_Pixel[x+1] = pSrc_Pixel[x+1];

#pragma warning(pop)

pDest += lDestStride;

pSrc += lSrcStride;

// Lines below the destination rectangle.

for ( ; y < dwHeightInPixels; y++)

memcpy(pDest, pSrc, dwWidthInPixels * 2);

pSrc += lSrcStride;

pDest += lDestStride;

// Convert NV12 image

void TransformImage_NV12(

const D2D1::Matrix3x2F& mat,

const D2D_RECT_U& rcDest,

_Inout_updates_(_Inexpressible_(2 * lDestStride *
dwHeightInPixels)) BYTE *pDest,

_In_ LONG lDestStride,

_In_reads_(_Inexpressible_(2 * lSrcStride * dwHeightInPixels))


const BYTE* pSrc,

_In_ LONG lSrcStride,

_In_ DWORD dwWidthInPixels,

_In_ DWORD dwHeightInPixels)

// NV12 is planar: Y plane, followed by packed U-V plane.

// Y plane

for (DWORD y = 0; y < dwHeightInPixels; y++)

CopyMemory(pDest, pSrc, dwWidthInPixels);

pDest += lDestStride;

pSrc += lSrcStride;

// U-V plane

// NOTE: The U-V plane has 1/2 the number of lines as the Y plane.

// Lines above the destination rectangle.

DWORD y = 0;

const DWORD y0 = min(rcDest.bottom, dwHeightInPixels);

for ( ; y < rcDest.top/2; y++)

memcpy(pDest, pSrc, dwWidthInPixels);

pSrc += lSrcStride;

pDest += lDestStride;

// Lines within the destination rectangle.

for ( ; y < y0/2; y++)

for (DWORD x = 0; (x + 1) < dwWidthInPixels; x += 2)

if (x >= rcDest.left && x < rcDest.right)

BYTE u = pSrc[x];
BYTE v = pSrc[x+1];

TransformChroma(mat, &u, &v);

pDest[x] = u;

pDest[x+1] = v;

else

pDest[x] = pSrc[x];

pDest[x+1] = pSrc[x+1];

pDest += lDestStride;

pSrc += lSrcStride;

// Lines below the destination rectangle.

for ( ; y < dwHeightInPixels/2; y++)

memcpy(pDest, pSrc, dwWidthInPixels);

pSrc += lSrcStride;

pDest += lDestStride;

CGrayscale::CGrayscale() :

m_pSample(nullptr), m_pInputType(nullptr), m_pOutputType(nullptr),


m_pTransformFn(nullptr),

m_imageWidthInPixels(0), m_imageHeightInPixels(0),
m_cbImageSize(0),

m_transform(D2D1::Matrix3x2F::Identity()), m_rcDest(D2D1::RectU()),
m_bStreamingInitialized(false),

m_pAttributes(nullptr)

InitializeCriticalSectionEx(&m_critSec, 3000, 0);

CGrayscale::~CGrayscale()

SafeRelease(&m_pInputType);

SafeRelease(&m_pOutputType);

SafeRelease(&m_pSample);

SafeRelease(&m_pAttributes);

DeleteCriticalSection(&m_critSec);

// Initialize the instance.

STDMETHODIMP CGrayscale::RuntimeClassInitialize()

// Create the attribute store.

return MFCreateAttributes(&m_pAttributes, 3);

// IMediaExtension methods

//-------------------------------------------------------------------

// SetProperties

// Sets the configuration of the effect

//-------------------------------------------------------------------

HRESULT
CGrayscale::SetProperties(ABI::Windows::Foundation::Collections::IPrope
rtySet *pConfiguration)

return S_OK;

// IMFTransform methods. Refer to the Media Foundation SDK


documentation for details.

//-------------------------------------------------------------------

// GetStreamLimits

// Returns the minimum and maximum number of streams.

//-------------------------------------------------------------------

HRESULT CGrayscale::GetStreamLimits(

DWORD *pdwInputMinimum,

DWORD *pdwInputMaximum,

DWORD *pdwOutputMinimum,

DWORD *pdwOutputMaximum

// This MFT has a fixed number of streams.

*pdwInputMinimum = 1;

*pdwInputMaximum = 1;

*pdwOutputMinimum = 1;

*pdwOutputMaximum = 1;

return S_OK;

// Returns the actual number of streams.

HRESULT CGrayscale::GetStreamCount(

DWORD *pcInputStreams,

DWORD *pcOutputStreams

// This MFT has a fixed number of streams.

*pcInputStreams = 1;

*pcOutputStreams = 1;

return S_OK;

//-------------------------------------------------------------------

// GetStreamIDs

// Returns stream IDs for the input and output streams.

//-------------------------------------------------------------------

HRESULT CGrayscale::GetStreamIDs(
DWORD dwInputIDArraySize,

DWORD *pdwInputIDs,

DWORD dwOutputIDArraySize,

DWORD *pdwOutputIDs

// It is not required to implement this method if the MFT has a


fixed number of

// streams AND the stream IDs are numbered sequentially from zero
(that is, the

// stream IDs match the stream indexes).

// In that case, it is OK to return E_NOTIMPL.

return E_NOTIMPL;

//-------------------------------------------------------------------

// GetInputStreamInfo

// Returns information about an input stream.

//-------------------------------------------------------------------

HRESULT CGrayscale::GetInputStreamInfo(

DWORD dwInputStreamID,

MFT_INPUT_STREAM_INFO * pStreamInfo

EnterCriticalSection(&m_critSec);

if (!IsValidInputStream(dwInputStreamID))

LeaveCriticalSection(&m_critSec);

return MF_E_INVALIDSTREAMNUMBER;

// NOTE: This method should succeed even when there is no media


type on the

// stream. If there is no media type, we only need to fill in


the dwFlags

// member of MFT_INPUT_STREAM_INFO. The other members depend


on having a

// a valid media type.

pStreamInfo->hnsMaxLatency = 0;

pStreamInfo->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES |
MFT_INPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER;

if (m_pInputType == nullptr)

pStreamInfo->cbSize = 0;

else

pStreamInfo->cbSize = m_cbImageSize;

pStreamInfo->cbMaxLookahead = 0;

pStreamInfo->cbAlignment = 0;

LeaveCriticalSection(&m_critSec);

return S_OK;

//-------------------------------------------------------------------

// GetOutputStreamInfo

// Returns information about an output stream.

//-------------------------------------------------------------------

HRESULT CGrayscale::GetOutputStreamInfo(

DWORD dwOutputStreamID,

MFT_OUTPUT_STREAM_INFO * pStreamInfo

EnterCriticalSection(&m_critSec);

if (!IsValidOutputStream(dwOutputStreamID))

LeaveCriticalSection(&m_critSec);

return MF_E_INVALIDSTREAMNUMBER;

// NOTE: This method should succeed even when there is no media


type on the

// stream. If there is no media type, we only need to fill in


the dwFlags

// member of MFT_OUTPUT_STREAM_INFO. The other members depend


on having a

// a valid media type.

pStreamInfo->dwFlags =

MFT_OUTPUT_STREAM_WHOLE_SAMPLES |

MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER |

MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE ;

if (m_pOutputType == nullptr)

pStreamInfo->cbSize = 0;

else

pStreamInfo->cbSize = m_cbImageSize;

pStreamInfo->cbAlignment = 0;

LeaveCriticalSection(&m_critSec);

return S_OK;

// Returns the attributes for the MFT.

HRESULT CGrayscale::GetAttributes(IMFAttributes** ppAttributes)

EnterCriticalSection(&m_critSec);

*ppAttributes = m_pAttributes;

(*ppAttributes)->AddRef();

LeaveCriticalSection(&m_critSec);

return S_OK;

// Returns stream-level attributes for an input stream.

HRESULT CGrayscale::GetInputStreamAttributes(

DWORD dwInputStreamID,

IMFAttributes **ppAttributes

// This MFT does not support any stream-level attributes, so the


method is not implemented.

return E_NOTIMPL;

//-------------------------------------------------------------------

// GetOutputStreamAttributes

// Returns stream-level attributes for an output stream.

//-------------------------------------------------------------------

HRESULT CGrayscale::GetOutputStreamAttributes(

DWORD dwOutputStreamID,

IMFAttributes **ppAttributes

// This MFT does not support any stream-level attributes, so the


method is not implemented.

return E_NOTIMPL;

//-------------------------------------------------------------------

// DeleteInputStream

//-------------------------------------------------------------------

HRESULT CGrayscale::DeleteInputStream(DWORD dwStreamID)

// This MFT has a fixed number of input streams, so the method is


not supported.

return E_NOTIMPL;

//-------------------------------------------------------------------

// AddInputStreams

//-------------------------------------------------------------------

HRESULT CGrayscale::AddInputStreams(

DWORD cStreams,

DWORD *adwStreamIDs

// This MFT has a fixed number of output streams, so the method is


not supported.

return E_NOTIMPL;

//-------------------------------------------------------------------

// GetInputAvailableType

// Returns a preferred input type.

//-------------------------------------------------------------------

HRESULT CGrayscale::GetInputAvailableType(

DWORD dwInputStreamID,

DWORD dwTypeIndex, // 0-based

IMFMediaType **ppType

EnterCriticalSection(&m_critSec);

if (!IsValidInputStream(dwInputStreamID))

LeaveCriticalSection(&m_critSec);

return MF_E_INVALIDSTREAMNUMBER;

HRESULT hr = S_OK;

// If the output type is set, return that type as our preferred


input type.

if (m_pOutputType == nullptr)

// The output type is not set. Create a partial media type.

hr = OnGetPartialType(dwTypeIndex, ppType);

else if (dwTypeIndex > 0)

hr = MF_E_NO_MORE_TYPES;

else

*ppType = m_pOutputType;

(*ppType)->AddRef();

LeaveCriticalSection(&m_critSec);

return hr;

// Returns a preferred output type.

HRESULT CGrayscale::GetOutputAvailableType(

DWORD dwOutputStreamID,

DWORD dwTypeIndex, // 0-based

IMFMediaType **ppType

EnterCriticalSection(&m_critSec);

if (!IsValidOutputStream(dwOutputStreamID))

LeaveCriticalSection(&m_critSec);

return MF_E_INVALIDSTREAMNUMBER;

HRESULT hr = S_OK;

if (m_pInputType == nullptr)

// The input type is not set. Create a partial media type.

hr = OnGetPartialType(dwTypeIndex, ppType);

else if (dwTypeIndex > 0)

hr = MF_E_NO_MORE_TYPES;

else

*ppType = m_pInputType;

(*ppType)->AddRef();

LeaveCriticalSection(&m_critSec);

return hr;

HRESULT CGrayscale::SetInputType(
DWORD dwInputStreamID,

IMFMediaType *pType, // Can be nullptr to clear the input type.

DWORD dwFlags

// Validate flags.

if (dwFlags & ~MFT_SET_TYPE_TEST_ONLY)

return E_INVALIDARG;

EnterCriticalSection(&m_critSec);

if (!IsValidInputStream(dwInputStreamID))

LeaveCriticalSection(&m_critSec);

return MF_E_INVALIDSTREAMNUMBER;

HRESULT hr = S_OK;

// Does the caller want us to set the type, or just test it?

BOOL bReallySet = ((dwFlags & MFT_SET_TYPE_TEST_ONLY) == 0);

// If we have an input sample, the client cannot change the type


now.

if (HasPendingOutput())

hr = MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING;

goto done;

// Validate the type, if non-nullptr.

if (pType)

hr = OnCheckInputType(pType);

if (FAILED(hr))

goto done;

// The type is OK. Set the type, unless the caller was just
testing.

if (bReallySet)

OnSetInputType(pType);

// When the type changes, end streaming.

hr = EndStreaming();

done:

LeaveCriticalSection(&m_critSec);

return hr;

HRESULT CGrayscale::SetOutputType(

DWORD dwOutputStreamID,

IMFMediaType *pType, // Can be nullptr to clear the output type.

DWORD dwFlags

// Validate flags.

if (dwFlags & ~MFT_SET_TYPE_TEST_ONLY)

return E_INVALIDARG;

EnterCriticalSection(&m_critSec);

if (!IsValidOutputStream(dwOutputStreamID))

LeaveCriticalSection(&m_critSec);

return MF_E_INVALIDSTREAMNUMBER;

HRESULT hr = S_OK;

// Does the caller want us to set the type, or just test it?

BOOL bReallySet = ((dwFlags & MFT_SET_TYPE_TEST_ONLY) == 0);

// If we have an input sample, the client cannot change the type


now.

if (HasPendingOutput())

hr = MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING;

goto done;

// Validate the type, if non-nullptr.

if (pType)

hr = OnCheckOutputType(pType);

if (FAILED(hr))

goto done;

// The type is OK. Set the type, unless the caller was just
testing.

if (bReallySet)

OnSetOutputType(pType);

// When the type changes, end streaming.

hr = EndStreaming();

done:

LeaveCriticalSection(&m_critSec);

return hr;

// Returns the current input type.

HRESULT CGrayscale::GetInputCurrentType(

DWORD dwInputStreamID,

IMFMediaType **ppType

HRESULT hr = S_OK;

EnterCriticalSection(&m_critSec);

if (!IsValidInputStream(dwInputStreamID))

hr = MF_E_INVALIDSTREAMNUMBER;

else if (!m_pInputType)

hr = MF_E_TRANSFORM_TYPE_NOT_SET;

else

*ppType = m_pInputType;

(*ppType)->AddRef();

LeaveCriticalSection(&m_critSec);

return hr;

// Returns the current output type.

HRESULT CGrayscale::GetOutputCurrentType(

DWORD dwOutputStreamID,

IMFMediaType **ppType

HRESULT hr = S_OK;

EnterCriticalSection(&m_critSec);

if (!IsValidOutputStream(dwOutputStreamID))

hr = MF_E_INVALIDSTREAMNUMBER;

else if (!m_pOutputType)

hr = MF_E_TRANSFORM_TYPE_NOT_SET;

else

*ppType = m_pOutputType;

(*ppType)->AddRef();

LeaveCriticalSection(&m_critSec);

return hr;

// Query if the MFT is accepting more input.

HRESULT CGrayscale::GetInputStatus(

DWORD dwInputStreamID,

DWORD *pdwFlags

EnterCriticalSection(&m_critSec);

if (!IsValidInputStream(dwInputStreamID))

LeaveCriticalSection(&m_critSec);

return MF_E_INVALIDSTREAMNUMBER;

// If an input sample is already queued, do not accept another


sample until the

// client calls ProcessOutput or Flush.

// NOTE: It is possible for an MFT to accept more than one input


sample. For

// example, this might be required in a video decoder if the frames


do not

// arrive in temporal order. In the case, the decoder must hold a


queue of

// samples. For the video effect, each sample is transformed


independently, so

// there is no reason to queue multiple input samples.

if (m_pSample == nullptr)

*pdwFlags = MFT_INPUT_STATUS_ACCEPT_DATA;

else

*pdwFlags = 0;

LeaveCriticalSection(&m_critSec);

return S_OK;

// Query if the MFT can produce output.

HRESULT CGrayscale::GetOutputStatus(DWORD *pdwFlags)

EnterCriticalSection(&m_critSec);

// The MFT can produce an output sample if (and only if) there an
input sample.

if (m_pSample != nullptr)

*pdwFlags = MFT_OUTPUT_STATUS_SAMPLE_READY;

else

*pdwFlags = 0;

LeaveCriticalSection(&m_critSec);

return S_OK;

//-------------------------------------------------------------------

// SetOutputBounds

// Sets the range of time stamps that the MFT will output.

//-------------------------------------------------------------------

HRESULT CGrayscale::SetOutputBounds(

LONGLONG hnsLowerBound,

LONGLONG hnsUpperBound
)

// Implementation of this method is optional.

return E_NOTIMPL;

//-------------------------------------------------------------------

// ProcessEvent

// Sends an event to an input stream.

//-------------------------------------------------------------------

HRESULT CGrayscale::ProcessEvent(
DWORD dwInputStreamID,

IMFMediaEvent *pEvent

// This MFT does not handle any stream events, so the method can

// return E_NOTIMPL. This tells the pipeline that it can stop

// sending any more events to this MFT.

return E_NOTIMPL;

//-------------------------------------------------------------------

// ProcessMessage

//-------------------------------------------------------------------

HRESULT CGrayscale::ProcessMessage(

MFT_MESSAGE_TYPE eMessage,
ULONG_PTR ulParam

EnterCriticalSection(&m_critSec);

HRESULT hr = S_OK;

switch (eMessage)

case MFT_MESSAGE_COMMAND_FLUSH:

// Flush the MFT.

hr = OnFlush();

break;

case MFT_MESSAGE_COMMAND_DRAIN:

// Drain: Tells the MFT to reject further input until all


pending samples are

// processed. That is our default behavior already, so there is


nothing to do.

//

// For a decoder that accepts a queue of samples, the MFT might


need to drain

// the queue in response to this command.

break;

case MFT_MESSAGE_SET_D3D_MANAGER:

// Sets a pointer to the IDirect3DDeviceManager9 interface.

// The pipeline should never send this message unless the MFT
sets the MF_SA_D3D_AWARE

// attribute set to TRUE. Because this MFT does not set


MF_SA_D3D_AWARE, it is an error

// to send the MFT_MESSAGE_SET_D3D_MANAGER message to the MFT.


Return an error code in

// this case.

// NOTE: If this MFT were D3D-enabled, it would cache the


IDirect3DDeviceManager9

// pointer for use during streaming.

hr = E_NOTIMPL;

break;

case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING:

hr = BeginStreaming();

break;

case MFT_MESSAGE_NOTIFY_END_STREAMING:

hr = EndStreaming();

break;

// The next two messages do not require any action from this MFT.

case MFT_MESSAGE_NOTIFY_END_OF_STREAM:

break;

case MFT_MESSAGE_NOTIFY_START_OF_STREAM:

break;

LeaveCriticalSection(&m_critSec);

return hr;

// Process an input sample.

HRESULT CGrayscale::ProcessInput(
DWORD dwInputStreamID,

IMFSample *pSample,
DWORD dwFlags

if (dwFlags != 0)

return E_INVALIDARG; // dwFlags is reserved and must be zero.

HRESULT hr = S_OK;

EnterCriticalSection(&m_critSec);

// Validate the input stream number.

if (!IsValidInputStream(dwInputStreamID))

hr = MF_E_INVALIDSTREAMNUMBER;

goto done;

// Check for valid media types.

// The client must set input and output types before calling
ProcessInput.

if (!m_pInputType || !m_pOutputType)

hr = MF_E_NOTACCEPTING;

goto done;

// Check if an input sample is already queued.

if (m_pSample != nullptr)

hr = MF_E_NOTACCEPTING; // We already have an input sample.

goto done;

// Initialize streaming.

hr = BeginStreaming();

if (FAILED(hr))

goto done;

// Cache the sample. We do the actual work in ProcessOutput.

m_pSample = pSample;

pSample->AddRef(); // Hold a reference count on the sample.

done:

LeaveCriticalSection(&m_critSec);

return hr;

//-------------------------------------------------------------------

// ProcessOutput

// Process an output sample.

//-------------------------------------------------------------------

HRESULT CGrayscale::ProcessOutput(

DWORD dwFlags,

DWORD cOutputBufferCount,

MFT_OUTPUT_DATA_BUFFER *pOutputSamples, // one per stream

DWORD *pdwStatus

// Check input parameters...

// This MFT does not accept any flags for the dwFlags parameter.

// The only defined flag is


MFT_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER. This flag

// applies only when the MFT marks an output stream as lazy or


optional. But this

// MFT has no lazy or optional streams, so the flag is not valid.

if (dwFlags != 0)

return E_INVALIDARG;

// There must be exactly one output buffer.

if (cOutputBufferCount != 1)

return E_INVALIDARG;

// It must contain a sample.

if (pOutputSamples[0].pSample == nullptr)

return E_INVALIDARG;

HRESULT hr = S_OK;

IMFMediaBuffer *pInput = nullptr;

IMFMediaBuffer *pOutput = nullptr;

EnterCriticalSection(&m_critSec);

// There must be an input sample available for processing.

if (m_pSample == nullptr)

hr = MF_E_TRANSFORM_NEED_MORE_INPUT;

goto done;

// Initialize streaming.

hr = BeginStreaming();

if (FAILED(hr))

goto done;

// Get the input buffer.

hr = m_pSample->ConvertToContiguousBuffer(&pInput);

if (FAILED(hr))

goto done;

// Get the output buffer.

hr = pOutputSamples[0].pSample-
>ConvertToContiguousBuffer(&pOutput);

if (FAILED(hr))

goto done;

hr = OnProcessOutput(pInput, pOutput);

if (FAILED(hr))

goto done;

// Set status flags.

pOutputSamples[0].dwStatus = 0;

*pdwStatus = 0;

// Copy the duration and time stamp from the input sample, if
present.

LONGLONG hnsDuration = 0;

LONGLONG hnsTime = 0;

if (SUCCEEDED(m_pSample->GetSampleDuration(&hnsDuration)))

hr = pOutputSamples[0].pSample->SetSampleDuration(hnsDuration);

if (FAILED(hr))

goto done;

if (SUCCEEDED(m_pSample->GetSampleTime(&hnsTime)))

hr = pOutputSamples[0].pSample->SetSampleTime(hnsTime);

done:

SafeRelease(&m_pSample); // Release our input sample.

SafeRelease(&pInput);

SafeRelease(&pOutput);

LeaveCriticalSection(&m_critSec);

return hr;

// PRIVATE METHODS

// All methods that follow are private to this MFT and are not part of
the IMFTransform interface.

// Create a partial media type from our list.

//

// dwTypeIndex: Index into the list of peferred media types.

// ppmt: Receives a pointer to the media type.

HRESULT CGrayscale::OnGetPartialType(DWORD dwTypeIndex, IMFMediaType


**ppmt)

if (dwTypeIndex >= ARRAYSIZE(g_MediaSubtypes))

return MF_E_NO_MORE_TYPES;

IMFMediaType *pmt = nullptr;

HRESULT hr = MFCreateMediaType(&pmt);

if (FAILED(hr))

goto done;

hr = pmt->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);

if (FAILED(hr))

goto done;

hr = pmt->SetGUID(MF_MT_SUBTYPE, g_MediaSubtypes[dwTypeIndex]);

if (FAILED(hr))

goto done;

*ppmt = pmt;

(*ppmt)->AddRef();

done:

SafeRelease(&pmt);

return hr;

// Validate an input media type.

HRESULT CGrayscale::OnCheckInputType(IMFMediaType *pmt)

assert(pmt != nullptr);

HRESULT hr = S_OK;

// If the output type is set, see if they match.

if (m_pOutputType != nullptr)

DWORD flags = 0;

hr = pmt->IsEqual(m_pOutputType, &flags);

// IsEqual can return S_FALSE. Treat this as failure.

if (hr != S_OK)

hr = MF_E_INVALIDMEDIATYPE;

else

// Output type is not set. Just check this type.

hr = OnCheckMediaType(pmt);

return hr;

// Validate an output media type.

HRESULT CGrayscale::OnCheckOutputType(IMFMediaType *pmt)

assert(pmt != nullptr);

HRESULT hr = S_OK;

// If the input type is set, see if they match.

if (m_pInputType != nullptr)

DWORD flags = 0;

hr = pmt->IsEqual(m_pInputType, &flags);

// IsEqual can return S_FALSE. Treat this as failure.

if (hr != S_OK)

hr = MF_E_INVALIDMEDIATYPE;

else

// Input type is not set. Just check this type.

hr = OnCheckMediaType(pmt);

return hr;

// Validate a media type (input or output)

HRESULT CGrayscale::OnCheckMediaType(IMFMediaType *pmt)

BOOL bFoundMatchingSubtype = FALSE;

// Major type must be video.

GUID major_type;

HRESULT hr = pmt->GetGUID(MF_MT_MAJOR_TYPE, &major_type);

if (FAILED(hr))

goto done;

if (major_type != MFMediaType_Video)

hr = MF_E_INVALIDMEDIATYPE;

goto done;

// Subtype must be one of the subtypes in our global list.

// Get the subtype GUID.

GUID subtype;

hr = pmt->GetGUID(MF_MT_SUBTYPE, &subtype);

if (FAILED(hr))

goto done;

// Look for the subtype in our list of accepted types.

for (DWORD i = 0; i < ARRAYSIZE(g_MediaSubtypes); i++)

if (subtype == g_MediaSubtypes[i])

bFoundMatchingSubtype = TRUE;

break;

if (!bFoundMatchingSubtype)

hr = MF_E_INVALIDMEDIATYPE; // The MFT does not support this


subtype.

goto done;

// Reject single-field media types.

UINT32 interlace = MFGetAttributeUINT32(pmt, MF_MT_INTERLACE_MODE,


MFVideoInterlace_Progressive);

if (interlace == MFVideoInterlace_FieldSingleUpper || interlace ==


MFVideoInterlace_FieldSingleLower)

hr = MF_E_INVALIDMEDIATYPE;

done:

return hr;

// Set or clear the input media type.

//

// Prerequisite: The input type was already validated.

void CGrayscale::OnSetInputType(IMFMediaType *pmt)

// if pmt is nullptr, clear the type.

// if pmt is non-nullptr, set the type.

SafeRelease(&m_pInputType);

m_pInputType = pmt;

if (m_pInputType)

m_pInputType->AddRef();

// Update the format information.

UpdateFormatInfo();

// Set or clears the output media type.

//

// Prerequisite: The output type was already validated.

void CGrayscale::OnSetOutputType(IMFMediaType *pmt)

// If pmt is nullptr, clear the type. Otherwise, set the type.

SafeRelease(&m_pOutputType);

m_pOutputType = pmt;

if (m_pOutputType)

m_pOutputType->AddRef();

// Initialize streaming parameters.

//

// This method is called if the client sends the


MFT_MESSAGE_NOTIFY_BEGIN_STREAMING

// message, or when the client processes a sample, whichever happens


first.

HRESULT CGrayscale::BeginStreaming()

HRESULT hr = S_OK;

if (!m_bStreamingInitialized)

// Get the configuration attributes.

// Get the destination rectangle.

RECT rcDest;

hr = m_pAttributes->GetBlob(MFT_GRAYSCALE_DESTINATION_RECT,
(UINT8*)&rcDest, sizeof(rcDest), nullptr);

if (hr == MF_E_ATTRIBUTENOTFOUND || !ValidateRect(rcDest))

// The client did not set this attribute, or the client


provided an invalid rectangle.

// Default to the entire image.

m_rcDest = D2D1::RectU(0, 0, m_imageWidthInPixels,


m_imageHeightInPixels);

hr = S_OK;

else if (SUCCEEDED(hr))

m_rcDest = D2D1::RectU(rcDest.left, rcDest.top,


rcDest.right, rcDest.bottom);

else

goto done;

// Get the chroma transformations.

float scale = (float)MFGetAttributeDouble(m_pAttributes,


MFT_GRAYSCALE_SATURATION, 0.0f);

float angle = (float)MFGetAttributeDouble(m_pAttributes,


MFT_GRAYSCALE_CHROMA_ROTATION, 0.0f);

m_transform = D2D1::Matrix3x2F::Scale(scale, scale) *


D2D1::Matrix3x2F::Rotation(angle);

m_bStreamingInitialized = true;

done:

return hr;

// End streaming.

// This method is called if the client sends an


MFT_MESSAGE_NOTIFY_END_STREAMING

// message, or when the media type changes. In general, it should be


called whenever

// the streaming parameters need to be reset.

HRESULT CGrayscale::EndStreaming()

m_bStreamingInitialized = false;

return S_OK;

// Generate output data.

HRESULT CGrayscale::OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer


*pOut)

BYTE *pDest = nullptr; // Destination buffer.

LONG lDestStride = 0; // Destination stride.

BYTE *pSrc = nullptr; // Source buffer.

LONG lSrcStride = 0; // Source stride.

// Helper objects to lock the buffers.

VideoBufferLock inputLock(pIn);

VideoBufferLock outputLock(pOut);

// Stride if the buffer does not support IMF2DBuffer

LONG lDefaultStride = 0;

HRESULT hr = GetDefaultStride(m_pInputType, &lDefaultStride);

if (FAILED(hr))

goto done;

// Lock the input buffer.

hr = inputLock.LockBuffer(lDefaultStride, m_imageHeightInPixels,
&pSrc, &lSrcStride);

if (FAILED(hr))

goto done;

// Lock the output buffer.

hr = outputLock.LockBuffer(lDefaultStride, m_imageHeightInPixels,
&pDest, &lDestStride);

if (FAILED(hr))

goto done;

// Invoke the image transform function.

assert (m_pTransformFn != nullptr);

if (m_pTransformFn)

(*m_pTransformFn)(m_transform, m_rcDest, pDest, lDestStride,


pSrc, lSrcStride,

m_imageWidthInPixels, m_imageHeightInPixels);

else

hr = E_UNEXPECTED;

goto done;

// Set the data size on the output buffer.

hr = pOut->SetCurrentLength(m_cbImageSize);

// The VideoBufferLock class automatically unlocks the buffers.

done:

return hr;

// Flush the MFT.

HRESULT CGrayscale::OnFlush()

// For this MFT, flushing just means releasing the input sample.

SafeRelease(&m_pSample);

return S_OK;

// Update the format information. This method is called whenever the

// input type is set.

HRESULT CGrayscale::UpdateFormatInfo()

HRESULT hr = S_OK;

GUID subtype = GUID_NULL;

m_imageWidthInPixels = 0;

m_imageHeightInPixels = 0;

m_cbImageSize = 0;

m_pTransformFn = nullptr;

if (m_pInputType != nullptr)

hr = m_pInputType->GetGUID(MF_MT_SUBTYPE, &subtype);

if (FAILED(hr))

goto done;

if (subtype == MFVideoFormat_YUY2)

m_pTransformFn = TransformImage_YUY2;

else if (subtype == MFVideoFormat_UYVY)

m_pTransformFn = TransformImage_UYVY;

else if (subtype == MFVideoFormat_NV12)

m_pTransformFn = TransformImage_NV12;

else

hr = E_UNEXPECTED;

goto done;

hr = MFGetAttributeSize(m_pInputType, MF_MT_FRAME_SIZE,
&m_imageWidthInPixels, &m_imageHeightInPixels);

if (FAILED(hr))

goto done;

// Calculate the image size (not including padding)

hr = GetImageSize(subtype.Data1, m_imageWidthInPixels,
m_imageHeightInPixels, &m_cbImageSize);

done:

return hr;

// Calculate the size of the buffer needed to store the image.

// fcc: The FOURCC code of the video format.

HRESULT GetImageSize(DWORD fcc, UINT32 width, UINT32 height, DWORD*


pcbImage)

HRESULT hr = S_OK;

switch (fcc)

case FOURCC_YUY2:

case FOURCC_UYVY:

// check overflow

if ((width > MAXDWORD / 2) || (width * 2 > MAXDWORD / height))

hr = E_INVALIDARG;

else

// 16 bpp

*pcbImage = width * height * 2;

break;

case FOURCC_NV12:

// check overflow

if ((height/2 > MAXDWORD - height) || ((height + height/2) >


MAXDWORD / width))

hr = E_INVALIDARG;

else

// 12 bpp

*pcbImage = width * (height + (height/2));

break;

default:

hr = E_FAIL; // Unsupported type.

return hr;

// Get the default stride for a video format.

HRESULT GetDefaultStride(IMFMediaType *pType, LONG *plStride)

LONG lStride = 0;

// Try to get the default stride from the media type.

HRESULT hr = pType->GetUINT32(MF_MT_DEFAULT_STRIDE,
(UINT32*)&lStride);

if (FAILED(hr))

// Attribute not set. Try to calculate the default stride.

GUID subtype = GUID_NULL;

UINT32 width = 0;

UINT32 height = 0;

// Get the subtype and the image size.

hr = pType->GetGUID(MF_MT_SUBTYPE, &subtype);

if (SUCCEEDED(hr))

hr = MFGetAttributeSize(pType, MF_MT_FRAME_SIZE, &width,


&height);

if (SUCCEEDED(hr))

if (subtype == MFVideoFormat_NV12)

lStride = width;

else if (subtype == MFVideoFormat_YUY2 || subtype ==


MFVideoFormat_UYVY)

lStride = ((width * 2) + 3) & ~3;

else

hr = E_INVALIDARG;

// Set the attribute for later reference.

if (SUCCEEDED(hr))

(void)pType->SetUINT32(MF_MT_DEFAULT_STRIDE,
UINT32(lStride));

if (SUCCEEDED(hr))

*plStride = lStride;

return hr;

// Validate that a rectangle meets the following criteria:

//

// - All coordinates are non-negative.

// - The rectangle is not flipped (top > bottom, left > right)

//

// These are the requirements for the destination rectangle.

bool ValidateRect(const RECT& rc)

if (rc.left < 0 || rc.top < 0)

return false;

if (rc.left > rc.right || rc.top > rc.bottom)

return false;

return true;

9. Добавьте новый файл определения модуля в проект, назовите его


GrayscaleTransform.def , а затем добавьте следующий код:

idl
EXPORTS

DllCanUnloadNow PRIVATE

DllGetActivationFactory PRIVATE

DllGetClassObject PRIVATE

10. Используйте следующий код для замены содержимого dllmain.cpp :

C++

#include "pch.h"

#include <initguid.h>

#include <wrl\module.h>

using namespace Microsoft::WRL;

STDAPI_(BOOL) DllMain(_In_ HINSTANCE hInstance, _In_ DWORD reason,


_In_opt_ void *reserved)

if (DLL_PROCESS_ATTACH == reason)

DisableThreadLibraryCalls(hInstance);

return TRUE;

STDAPI DllGetActivationFactory(_In_ HSTRING activatibleClassId,


_COM_Outptr_ IActivationFactory **factory)

return
Module<InProc>::GetModule().GetActivationFactory(activatibleClassId,
factory);

STDAPI DllCanUnloadNow()

return Module<InProc>::GetModule().Terminate() ? S_OK : S_FALSE;

STDAPI DllGetClassObject(_In_ REFCLSID rclsid, _In_ REFIID riid,


_COM_Outptr_ void **ppv)

return Module<InProc>::GetModule().GetClassObject(rclsid, riid,


ppv);

11. В диалоговом окне страниц свойств проекта задайте следующие свойства


компоновщика .

a. В разделе "Входные данные" для файла определения модуля укажите


GrayScaleTransform.def .
b. Кроме того, в разделе "Входные данные" добавьте runtimeobject.lib и
mfuuid.lib mfplat.lib в свойство "Дополнительные зависимости".

c. В разделе "Метаданные Windows" задайте для параметра "Создать


метаданные Windows" значение "Да" (/WINMD).

Использование WRL настраиваемого компонента


Media Foundation из приложения C#
1. Добавьте в решение новый проект пустого приложения C#
(универсальное MediaCapture приложение Для Windows). Назовите проект,
например MediaCapture.

2. В проекте MediaCapture добавьте ссылку на GrayscaleTransform проект.


Дополнительные сведения см. в статье "Практическое руководство.
Добавление или удаление ссылок с помощью диспетчера ссылок".

3. На Package.appxmanifest вкладке "Возможности " выберите "Микрофон " и


"Веб-камера". Обе возможности необходимы для получения фотографий с
веб-камеры.

4. Добавьте MainPage.xaml этот код в корневой Grid элемент:

XML

<StackPanel>

<TextBlock x:Name="StatusBlock" Margin="10,10,0,0"/>

<StackPanel Orientation="Horizontal" Grid.Row="1"


Margin="0,10,0,0">

<Button x:Name="StartDevice" Click="StartDevice_Click"


IsEnabled="true" Margin="10,0,10,0">StartDevice</Button>

<Button x:Name="TakePhoto" Click="TakePhoto_Click"


IsEnabled="false" Margin="0,0,10,0">TakePhoto</Button>

</StackPanel>

<StackPanel Orientation="Horizontal" Grid.Row="2"


Margin="0,10,0,0">

<CheckBox x:Name="AddRemoveEffect" Margin="10,0,10,0"


Content="Grayscale effect" IsEnabled="False"
Checked="AddRemoveEffect_Checked"
Unchecked="AddRemoveEffect_Unchecked"/>

</StackPanel>

<Image x:Name="CapturedImage" Width="320" Height="240"


Margin="10,10,0,0" HorizontalAlignment="Left"/>

</StackPanel>

5. Используйте следующий код для замены содержимого MainPage.xaml.cs :


C#

using System;

using Windows.Devices.Enumeration;

using Windows.Media.Capture;

using Windows.Media.Effects;

using Windows.Media.MediaProperties;

using Windows.Storage.Streams;

using Windows.UI;

using Windows.UI.Xaml;

using Windows.UI.Xaml.Controls;

using Windows.UI.Xaml.Media;

using Windows.UI.Xaml.Media.Imaging;

using Windows.UI.Xaml.Navigation;

namespace MediaCapture

public sealed partial class MainPage : Page

// Captures photos from the webcam.

private Windows.Media.Capture.MediaCapture mediaCapture;

// Used to display status messages.

private Brush statusBrush = new SolidColorBrush(Colors.Green);

// Used to display error messages.

private Brush exceptionBrush = new SolidColorBrush(Colors.Red);

public MainPage()

this.InitializeComponent();

// Shows a status message.

private void ShowStatusMessage(string text)

StatusBlock.Foreground = statusBrush;

StatusBlock.Text = text;

// Shows an error message.

private void ShowExceptionMessage(Exception ex)

StatusBlock.Foreground = exceptionBrush;

StatusBlock.Text = ex.Message;

// Click event handler for the "Start Device" button.

private async void StartDevice_Click(object sender,


RoutedEventArgs e)

try

StartDevice.IsEnabled = false;

// Enumerate webcams.

ShowStatusMessage("Enumerating webcams...");

var devInfoCollection = await


DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);

if (devInfoCollection.Count == 0)

ShowStatusMessage("No webcams found");

return;

// Initialize the MediaCapture object, choosing the


first found webcam.

mediaCapture = new
Windows.Media.Capture.MediaCapture();

var settings = new


Windows.Media.Capture.MediaCaptureInitializationSettings();

settings.VideoDeviceId = devInfoCollection[0].Id;

await mediaCapture.InitializeAsync(settings);

// We can now take photos and enable the grayscale


effect.

TakePhoto.IsEnabled = true;

AddRemoveEffect.IsEnabled = true;

ShowStatusMessage("Device initialized successfully");

catch (Exception ex)

ShowExceptionMessage(ex);

// Takes a photo from the webcam and displays it.

private async void TakePhoto_Click(object sender,


RoutedEventArgs e)

try

ShowStatusMessage("Taking photo...");

TakePhoto.IsEnabled = false;

// Capture the photo to an in-memory stream.

var photoStream = new InMemoryRandomAccessStream();

await
mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJp
eg(), photoStream);

ShowStatusMessage("Create photo file successful");

// Display the photo.

var bmpimg = new BitmapImage();

photoStream.Seek(0);

await bmpimg.SetSourceAsync(photoStream);

CapturedImage.Source = bmpimg;

TakePhoto.IsEnabled = true;

ShowStatusMessage("Photo taken");

catch (Exception ex)

ShowExceptionMessage(ex);

TakePhoto.IsEnabled = true;

// Enables the grayscale effect.

private async void AddRemoveEffect_Checked(object sender,


RoutedEventArgs e)

try

AddRemoveEffect.IsEnabled = false;

VideoEffectDefinition def = new


VideoEffectDefinition("GrayscaleTransform.GrayscaleEffect");

await mediaCapture.AddVideoEffectAsync(def,
MediaStreamType.Photo);

ShowStatusMessage("Add effect to video preview


successful");

AddRemoveEffect.IsEnabled = true;

catch (Exception ex)

ShowExceptionMessage(ex);

// Removes the grayscale effect.

private async void AddRemoveEffect_Unchecked(object sender,


RoutedEventArgs e)

try

AddRemoveEffect.IsEnabled = false;

await
mediaCapture.ClearEffectsAsync(Windows.Media.Capture.MediaStreamType.Ph
oto);

ShowStatusMessage("Remove effect from preview


successful");

AddRemoveEffect.IsEnabled = true;

catch (Exception ex)

ShowExceptionMessage(ex);

На следующем рисунке показан элемент MediaCapture app .


Next Steps
Пример показывает способ записи фотографий (по одной) с веб-камеры по
умолчанию. Пример расширений мультимедиа делает больше. Здесь показано,
как перечислить устройства веб-камеры и работать с локальными обработчиками
схем. В примере также показаны другие эффекты мультимедиа, которые работают
как на отдельных фотографиях, так и в потоках видео.

См. также раздел


Библиотека шаблонов C++ среды выполнения Windows (WRL)

Microsoft Media Foundation


Практическое руководство. Создание
классического компонента COM с
помощью WRL
Статья • 03.04.2023

Библиотеку шаблонов C++ (WRL) среда выполнения Windows можно использовать


для создания базовых классических com-компонентов для использования в
классических приложениях, а также для приложений универсальная платформа
Windows (UWP). Для создания com-компонентов библиотека шаблонов среда
выполнения Windows C++ может потребовать меньше кода, чем ATL. Сведения о
подмножестве COM, который поддерживает библиотека шаблонов среда
выполнения Windows C++, см. в среда выполнения Windows библиотеке шаблонов
C++ (WRL).

В этом документе показано, как использовать библиотеку шаблонов среда


выполнения Windows C++ для создания базового COM-компонента. Хотя можно
использовать механизм развертывания, который наилучшим образом
соответствует требованиям, в этом документе также показан простой способ
регистрации и использования компонента модели COM из обычного приложения
для настольных систем.

Использование библиотеки шаблонов C++ среда


выполнения Windows для создания базового
классического COM-компонента
1. В Visual Studio создайте проект пустого решения . Присвойт проекту имя,
например WRLClassicCOM .

2. Добавьте проект Win32 в решение. Присвойт проекту имя, например


CalculatorComponent . На вкладке "Параметры приложения " выберите
библиотеку DLL.

3. Добавьте файл Midl (IDL) в проект. Присвойт файлу имя, например


CalculatorComponent.idl .

4. Добавьте этот код в файл CalculatorComponent.idl:

C++
import "ocidl.idl";

[uuid(0DBABB94-CE99-42F7-ACBD-E698B2332C60), version(1.0)]

interface ICalculatorComponent : IUnknown

HRESULT Add([in] int a, [in] int b, [out, retval] int* value);

[uuid(9D3E6826-CB8E-4D86-8B14-89F0D7EFCD01), version(1.0)]

library CalculatorComponentLib

[uuid(E68F5EDD-6257-4E72-A10B-4067ED8E85F2), version(1.0)]

coclass CalculatorComponent

[default] interface ICalculatorComponent;

};

5. В файле CalculatorComponent.cpp определите класс CalculatorComponent . Класс


CalculatorComponent наследуется от Microsoft::WRL::RuntimeClass.

Microsoft::WRL::RuntimeClassFlags< ClassicCom> указывает, что класс является


производным от IUnknown , а не IInspectable. ( IInspectable доступно только
для среда выполнения Windows компонентов приложения.) CoCreatableClass
создает фабрику для класса, который можно использовать с такими
функциями, как CoCreateInstance.

C++

#include "pch.h" // Use stdafx.h in Visual Studio 2017 and earlier

#include "CalculatorComponent_h.h"

#include <wrl.h>

using namespace Microsoft::WRL;

class CalculatorComponent: public


RuntimeClass<RuntimeClassFlags<ClassicCom>, ICalculatorComponent>

public:

CalculatorComponent()

STDMETHODIMP Add(_In_ int a, _In_ int b, _Out_ int* value)

*value = a + b;

return S_OK;

};

CoCreatableClass(CalculatorComponent);

6. Используйте следующий код для замены кода в dllmain.cpp . Этот файл


определяет функции экспорта библиотек DLL. Эти функции используют класс
Microsoft::WRL::Module для управления фабриками классов для модуля.

C++

#include "pch.h" // Use stdafx.h in Visual Studio 2017 and earlier

#include <wrl\module.h>

using namespace Microsoft::WRL;

#if !defined(__WRL_CLASSIC_COM__)

STDAPI DllGetActivationFactory(_In_ HSTRING activatibleClassId,


_COM_Outptr_ IActivationFactory** factory)

return
Module<InProc>::GetModule().GetActivationFactory(activatibleClassId,
factory);

#endif

#if !defined(__WRL_WINRT_STRICT__)

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, _COM_Outptr_


void** ppv)

return Module<InProc>::GetModule().GetClassObject(rclsid, riid,


ppv);

#endif

STDAPI DllCanUnloadNow()

return Module<InProc>::GetModule().Terminate() ? S_OK : S_FALSE;

STDAPI_(BOOL) DllMain(_In_opt_ HINSTANCE hinst, DWORD reason, _In_opt_


void*)

if (reason == DLL_PROCESS_ATTACH)

DisableThreadLibraryCalls(hinst);

return TRUE;

7. Добавьте файл определения модуля (DEF) в проект. Присвойт файлу имя,


например CalculatorComponent.def . Этот файл передает компоновщику имена
функций, подлежащих экспорту. Откройте диалоговое окно "Страницы
свойств" для проекта, а затем в разделе"Входные
данныекомпоновщика>свойств> конфигурации" задайте для свойства файла
определения модуля значение DEF-файла.

8. Добавьте в файл CalculatorComponent.def следующий код:

LIBRARY

EXPORTS

DllGetActivationFactory PRIVATE

DllGetClassObject PRIVATE

DllCanUnloadNow PRIVATE

9. Добавьте файл runtimeobject.lib в строку компоновщика. Сведения о том, как


это сделать, см. в разделе.Lib "Файлы как входные данные компоновщика".

Использование компонента модели COM в обычном


приложении для настольных систем
1. Зарегистрируйте компонент модели COM в реестре Windows. Для этого
создайте файл записей регистрации, назовите его RegScript.reg и добавьте
следующий текст. Замените <dll-path> на путь к библиотеке DLL, например
C:\temp\WRLClassicCOM\Debug\CalculatorComponent.dll .

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{E68F5EDD-6257-4E72-A10B-
4067ED8E85F2}]

@="CalculatorComponent Class"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{E68F5EDD-6257-4E72-A10B-
4067ED8E85F2}\InprocServer32]

@="<dll-path>"

"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{E68F5EDD-6257-4E72-A10B-
4067ED8E85F2}\Programmable]

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{E68F5EDD-6257-4E72-A10B-
4067ED8E85F2}\TypeLib]

@="{9D3E6826-CB8E-4D86-8B14-89F0D7EFCD01}"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{E68F5EDD-6257-4E72-A10B-
4067ED8E85F2}\Version]

@="1.0"

2. Запустите RegScript.reg или добавьте его в событие после сборки проекта.


Дополнительные сведения см. в диалоговом окне командной строки события
перед сборкой или после сборки.

3. Добавьте проект консольного приложения Win32 в решение. Присвойт


проекту имя, например Calculator .

4. Используйте этот код для замены содержимого Calculator.cpp :

C++

#include "pch.h" // Use stdafx.h in Visual Studio 2017 and earlier

#include "..\CalculatorComponent\CalculatorComponent_h.h"

const IID IID_ICalculatorComponent =


{0x0DBABB94,0xCE99,0x42F7,0xAC,0xBD,0xE6,0x98,0xB2,0x33,0x2C,0x60};

const CLSID CLSID_CalculatorComponent =


{0xE68F5EDD,0x6257,0x4E72,0xA1,0x0B,0x40,0x67,0xED,0x8E,0x85,0xF2};

// Prints an error string for the provided source code line and HRESULT

// value and returns the HRESULT value as an int.

int PrintError(unsigned int line, HRESULT hr)

wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);

return hr;

int wmain()

HRESULT hr;

// Initialize the COM library.

hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);

if (FAILED(hr))

return PrintError(__LINE__, hr);

ICalculatorComponent* calc = nullptr; // Interface to COM


component.

// Create the CalculatorComponent object.

hr = CoCreateInstance(CLSID_CalculatorComponent, nullptr,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&calc));

if (SUCCEEDED(hr))

// Test the component by adding two numbers.

int result;

hr = calc->Add(4, 5, &result);

if (FAILED(hr))

PrintError(__LINE__, hr);

else

wprintf_s(L"result = %d\n", result);

// Free the CalculatorComponent object.

calc->Release();

else

// Object creation failed. Print a message.

PrintError(__LINE__, hr);
}

// Free the COM library.

CoUninitialize();

return hr;

/* Output:

result = 9

*/

Отказоустойчивость
В этом документе используются стандартные функции COM для демонстрации
использования библиотеки шаблонов среда выполнения Windows C++ для
создания com-компонента и его доступности для любой технологии с поддержкой
COM. Вы также можете использовать среда выполнения Windows типов библиотек
шаблонов C++, таких как Microsoft::WRL::ComPtr в классическом приложении для
управления временем существования COM и других объектов. Следующий код
использует библиотеку шаблонов среда выполнения Windows C++ для управления
временем существования указателя ICalculatorComponent . Класс CoInitializeWrapper
является программой-оболочкой RAII, которая гарантирует, что библиотека COM
освобождена и время ее жизни превысит время жизни объекта интеллектуального
указателя ComPtr .

C++

#include "pch.h" // Use stdafx.h in Visual Studio 2017 and earlier

#include <wrl.h>

#include "..\CalculatorComponent\CalculatorComponent_h.h"

using namespace Microsoft::WRL;

const IID IID_ICalculatorComponent =


{0x0DBABB94,0xCE99,0x42F7,0xAC,0xBD,0xE6,0x98,0xB2,0x33,0x2C,0x60};

const CLSID CLSID_CalculatorComponent =


{0xE68F5EDD,0x6257,0x4E72,0xA1,0x0B,0x40,0x67,0xED,0x8E,0x85,0xF2};

// Prints an error string for the provided source code line and HRESULT

// value and returns the HRESULT value as an int.

int PrintError(unsigned int line, HRESULT hr)

wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);

return hr;

int wmain()

HRESULT hr;

// RAII wrapper for managing the lifetime of the COM library.

class CoInitializeWrapper

HRESULT _hr;

public:

CoInitializeWrapper(DWORD flags)

_hr = CoInitializeEx(nullptr, flags);

~CoInitializeWrapper()

if (SUCCEEDED(_hr))

CoUninitialize();
}

operator HRESULT()

return _hr;

};

// Initialize the COM library.

CoInitializeWrapper initialize(COINIT_APARTMENTTHREADED);

if (FAILED(initialize))

return PrintError(__LINE__, initialize);

ComPtr<ICalculatorComponent> calc; // Interface to COM component.

// Create the CalculatorComponent object.

hr = CoCreateInstance(CLSID_CalculatorComponent, nullptr,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(calc.GetAddressOf()));

if (SUCCEEDED(hr))

// Test the component by adding two numbers.

int result;

hr = calc->Add(4, 5, &result);

if (FAILED(hr))

return PrintError(__LINE__, hr);

wprintf_s(L"result = %d\n", result);

else

// Object creation failed. Print a message.

return PrintError(__LINE__, hr);

return 0;

См. также раздел


Библиотека шаблонов C++ среды выполнения Windows (WRL)
Практическое руководство.
Непосредственное создание
экземпляра компонентов WRL
Статья • 03.04.2023

Узнайте, как использовать библиотеку шаблонов среда выполнения Windows C++


(WRL)Microsoft::WRL::Make и Microsoft::WRL::D etails::MakeAndInitialize для создания
экземпляра компонента из модуля, определяющего его.

С помощью создания компонентов напрямую можно уменьшить нагрузку, когда


нет необходимости использовать фабрики классов или другие механизмы. Вы
можете создать экземпляр компонента непосредственно в универсальная
платформа Windows приложениях и в классических приложениях.

Чтобы узнать, как использовать библиотеку шаблонов среда выполнения Windows


C++, чтобы создать классический COM-компонент и создать его экземпляр из
внешнего классического приложения, см. статью "Создание классического COM-
компонента".

Здесь приведено два примера. В первом примере используется функция Make для
создания экземпляра компонента. Во втором примере для создания компонента,
который может создать ошибку во время построения, используется функция
MakeAndInitialize . (Так как COM обычно использует значения HRESULT вместо

исключений для указания ошибок, тип COM обычно не вызывается из


конструктора. MakeAndInitialize позволяет компоненту проверять его аргументы
построения с помощью RuntimeClassInitialize метода.) Оба примера определяют
базовый интерфейс средства ведения журнала и реализуют этот интерфейс,
определяя класс, который записывает сообщения в консоль.

) Важно!

Оператор нельзя использовать для new создания экземпляров среда


выполнения Windows компонентов библиотеки шаблонов C++. Поэтому
всегда рекомендуется использовать функцию Make или MakeAndInitialize ,
чтобы создать компонент напрямую.

Создание базового компонента средства ведения


журнала и его экземпляров
1. В Visual Studio создайте проект консольного приложения Win32 . Присвойт
проекту имя, например WRLLogger.

2. Добавьте в проект файл Midl File (IDL ), присвойте файлу ILogger.idl имя и
добавьте следующий код:

C++

import "ocidl.idl";

// Prints text to the console.

[uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)]

interface ILogger : IUnknown

HRESULT Log([in] LPCWSTR text);

3. Используйте следующий код для замены содержимого WRLLogger.cpp .

C++

#include "pch.h" // Use stdafx.h in Visual Studio 2017 and earlier

#include <wrl\implements.h>

#include <comutil.h>

#include "ILogger_h.h"

using namespace Microsoft::WRL;

// Writes logging messages to the console.

class CConsoleWriter : public


RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger>

public:

STDMETHODIMP Log(_In_ PCWSTR text)

wprintf_s(L"%s\n", text);
return S_OK;

private:

// Make destroyable only through Release.

~CConsoleWriter()

};

int wmain()

ComPtr<CConsoleWriter> writer = Make<CConsoleWriter>();

HRESULT hr = writer->Log(L"Logger ready.");

return hr;

/* Output:

Logger ready.

*/

Обработка сбоя построения для базового компонента


средства ведения журнала
1. Замените определение класса CConsoleWriter следующим кодом: Эта версия
содержит частную строковую переменную-член и переопределяет метод
RuntimeClass::RuntimeClassInitialize . RuntimeClassInitialize завершается
ошибкой, если вызов завершается сбоем SHStrDup .

C++

// Writes logging messages to the console.

class CConsoleWriter : public


RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger>

public:

// Initializes the CConsoleWriter object.

// Failure here causes your object to fail construction with the


HRESULT you choose.

HRESULT RuntimeClassInitialize(_In_ PCWSTR category)

return SHStrDup(category, &m_category);

STDMETHODIMP Log(_In_ PCWSTR text)

wprintf_s(L"%s: %s\n", m_category, text);

return S_OK;

private:

PWSTR m_category;

// Make destroyable only through Release.

~CConsoleWriter()

CoTaskMemFree(m_category);

};

2. Замените wmain следующим кодом: Эта версия используется для


MakeAndInitialize создания экземпляра CConsoleWriter объекта и проверки
результата HRESULT.

C++

int wmain()

ComPtr<CConsoleWriter> writer;

HRESULT hr = MakeAndInitialize<CConsoleWriter>(&writer, L"INFO");

if (FAILED(hr))

wprintf_s(L"Object creation failed. Result = 0x%x", hr);

return hr;

hr = writer->Log(L"Logger ready.");

return hr;

/* Output:

INFO: Logger ready.

*/

См. также раздел


Библиотека шаблонов C++ среды выполнения Windows (WRL)

Microsoft::WRL::Make

Microsoft::WRL::D etails::MakeAndInitialize
Практическое руководство.
Использование winmdidl.exe и
midlrt.exe для создания H-файлов из
метаданных Windows
Статья • 03.04.2023

Winmdidl.exe и midlrt.exe разрешают взаимодействие COM-уровня между


машинным кодом C++ и компонентами среды выполнения Windows. Winmdidl.exe
принимает в качестве входных данных WINMD-файл, содержащий метаданные для
компонента среды выполнения Windows, и выводит IDL-файл. Midlrt.exe
преобразовывает этот IDL-файл в файлы заголовков, которые можно использовать
в коде C++. Оба инструмента запускаются с помощью командной строки.

Эти инструменты используются в следующих двух сценариях:

Создание пользовательских IDL-файлов и файлов заголовков, чтобы


приложение C++, написанное с помощью библиотеки шаблонов среда
выполнения Windows (WRL), пользовалось пользовательским компонентом
среда выполнения Windows.

создание прокси-сервера и файлов-заглушек для определяемых


пользователем типов событий в компоненте среды выполнения Windows.
Дополнительные сведения см. в разделе Пользовательские события и методы
доступа к событиям в среда выполнения Windows Компоненты.

Эти инструменты требуются только для синтаксического анализа пользовательских


WINMD-файлов. IDL- и H-файлы для компонентов операционной системы Windows
уже созданы. По умолчанию в Windows 8.1 они находятся в папке \Program Files
(x86)\Windows Kits\8.1\Include\winrt\.

Расположение инструментов
По умолчанию в [Windows 8.1 winmdidl.exe и midlrt.exe находятся в папке
C:\Program Files (x86)\Windows Kits\8.1\. Различные версии этих инструментов также
доступны в папках \bin\x86\ и \bin\x64\.

Аргументы командной строки winmdidl


Winmdidl.exe [/nologo] [/suppressversioncheck] [/time] [/outdir:dir]
[/banner:file] [/utf8] Winmdfile

/nologo

Блокирует отображение в консоли сообщения об авторских правах и номере


версии winmdidl.

/suppressversioncheck

Не используется.

/Время

Выводит общее время выполнения в окно консоли.

/outdir:dir

Задает выходной каталог. Если путь содержит пробелы, используйте кавычки.


Выходной каталог по умолчанию — <drive>:\Users\
<username>\AppData\Local\VirtualStore\Program Files (x86)\Microsoft Visual Studio
12.0\.

/banner:file

Указывает файл, содержащий пользовательский текст, который необходимо


вставить в начало сообщения по умолчанию об авторских правах и версии
winmdidl в верхней части сгенерированного IDL-файла. Если путь содержит
пробелы, используйте кавычки.

/utf8

Файл будет отформатирован в кодировке UTF-8.

Winmdfile

Имя WINMD-файла для анализа. Если путь содержит пробелы, используйте


кавычки.

Аргументы командной строки midlrt


См. статью Компоненты MIDLRT и среда выполнения Windows.

Примеры
В следующем примере показана работа команды winmdidl в командной строке
Visual Studio x86. Она определяет выходную папку и файл, содержащий
специальный текст баннера, который следует добавить в сгенерированный IDL-
файл.

C:\Program Files (x86)\Microsoft Visual Studio 12.0>winmdidl /nologo

/outdir:c:\users\giraffe\documents\ /banner:c:\users\giraffe\documents\banner.txt
"C:\Users\giraffe\Documents\Visual Studio

2013\Projects\Test_for_winmdidl\Debug\Test_for_winmdidl\test_for_winmdidl.winmd"

В следующем примере показан вывод в окно консоли результата работы команды


winmdidl, который указывает, что операция выполнена успешно.

Создание c:\users\giraffe\documents\\Test_for_winmdidl.idl

Затем для созданного IDL-файла выполняется команда midlrt. Обратите внимание,


что аргумент metadata_dir указан после имени IDL-файла. Путь \WinMetadata\
является обязательным — это расположение для windows.winmd.

C:\Program Files (x86)\Microsoft Visual Studio 12.0> midlrt

"c:\users\username\documents\test_for_winmdidl.idl" /metadata_dir
"C:\Windows\System32\WinMetadata"

Комментарии
Выходной файл операции winmdidl будет иметь то же имя, что и входной файл, но
с расширением IDL.

При разработке компонента среды выполнения Windows, который будет доступен


из WRL, можно указать в качестве действий после сборки запуск инструментов
winmdidl.exe и midlrt.exe для создания IDL- и H-файлов при каждой сборке. Пример
см. в разделе Вызов событий в компонентах среда выполнения Windows.
Основные API WRL по категориям
Статья • 03.04.2023

В следующих таблицах перечислены основные среда выполнения Windows классы,


структуры, функции и макросы библиотеки шаблонов C++. Конструкции во
вспомогательных пространствах имен и классах опущены. Эти списки дополняют
документацию по API, упорядоченную по пространству имен.

Классы
Заголовок Описание

Класс ActivationFactory Позволяет одному или нескольким классам быть


активированными средой выполнения Windows.

Класс AsyncBase Реализует асинхронный конечный автомат среды


выполнения Windows.

Класс ClassFactory Реализует базовую функциональность интерфейса


IClassFactory .

Класс ComPtr Создает тип интеллектуальный указатель , который


представляет интерфейс, определяемый параметром
шаблона. ComPtr автоматически поддерживает счетчик
ссылок для указателя базового интерфейса и освобождает
интерфейс, когда счетчик ссылок становится равен нулю.

Класс Event (библиотека Представляет событие.


шаблонов C++ среды
выполнения Windows)

EventSource Представляет событие. Функции-члены EventSource


добавляют, удаляют и вызывают обработчики событий.

Класс FtmBase Представляет свободнопоточный объект маршаллера.

Класс HandleT Представляет дескриптор объекта.

Класс HString Обеспечивает поддержку управления дескрипторами


HSTRING.

Класс HStringReference Представляет объект HSTRING, созданный из существующей


строки.

Класс module Представляет коллекцию связанных объектов.


Заголовок Описание

Класс Вызывает обработчик событий при освобождении


Module::GenericReleaseNotifier последнего объекта в текущем модуле. Обработчик
событий задается лямбда-выражением, функтором или
указателем на функцию.

Класс Вызывает обработчик событий при освобождении


Module::MethodReleaseNotifier последнего объекта в текущем модуле. Обработчик
событий задается объектом и его указателем на член
метода.

Класс Module::ReleaseNotifier Вызывает обработчик событий при освобождении


последнего объекта в модуле.

Класс RoInitializeWrapper Инициализирует среда выполнения Windows.

Класс RuntimeClass Представляет экземпляр класса, который наследует


указанное число интерфейсов и предоставляет указанную
среду выполнения Windows, классическую COM-модель и
поддержку слабых ссылок.

Класс SimpleActivationFactory Предоставляет основной механизм для создания базового


класса среды выполнения Windows или классической
модели COM.

Класс SimpleClassFactory Предоставляет основной механизм для создания базового


класса.

Класс WeakRef Представляет собой слабую ссылку , которая может


использоваться только в среде выполнения Windows, а не в
классической модели COM. Слабая ссылка представляет
собой объект, который может быть доступен или
недоступен.

Структуры
Заголовок Описание

ChainInterfaces Указывает функции проверки и инициализации, которые могут


- структура применяться к набору идентификаторов интерфейсов.

CloakedIid - Указывает шаблонам RuntimeClass , Implements и ChainInterfaces , что


структура указанный интерфейс недоступен в списке IID.

Implements - QueryInterface Реализует и GetIid для указанных интерфейсов.


структура
Заголовок Описание

MixIn - Гарантирует, что класс среды выполнения является производным от


структура интерфейсов среды выполнения Windows, если таковые имеются, а затем
от интерфейсов классической модели COM.

Функции
Заголовок Описание

Функция Регистрирует и извлекает экземпляр указанного типа,


ActivateInstance определенного в указанном идентификаторе класса.

Функция AsWeak Извлекает слабую ссылку на определенный экземпляр.

Функция обратного Создает объект, функция-член которого является методом


вызова обратного вызова.

Функция Создает фабрику, производящую экземпляры указанного класса,


CreateActivationFactory которые могут быть активированы средой выполнения Windows.

Функция Создает фабрику, которая создает экземпляры указанного класса.


CreateClassFactory

Функция Извлекает фабрику активации для типа, указанного в параметре


GetActivationFactory шаблона.

Функция Make Инициализирует указанный класс среда выполнения Windows.

Макросы
Заголовок Описание

Макросы Для Заполняет внутренний кэш, содержащий фабрику, которая может


активируемых классов создать экземпляр указанного класса.

Макрос Задает имя класса среды выполнения и уровень доверия.


InspectableClass

См. также раздел


Библиотека шаблонов C++ среды выполнения Windows (WRL)
Справочник по WRL
Статья • 03.04.2023

В этом разделе содержатся справочные сведения о библиотеке шаблонов среда


выполнения Windows C++ (WRL).

7 Примечание

Библиотека шаблонов среда выполнения Windows C++ определяет


функциональные возможности, которые поддерживают среда выполнения
Windows инфраструктуру библиотеки шаблонов C++ и не предназначены для
использования непосредственно из кода. Такая функциональность описана в
этой документации.

В этом разделе
Пространство имен Microsoft::WRL

Определяет основные типы, составляющие библиотеку шаблонов среда


выполнения Windows C++.

Пространство имен Microsoft::WRL::Wrappers

Определяет оболочки типа "Получение ресурса есть инициализация" (RAII),


которые упрощают управление временем существования объектов, строк и
дескрипторов.

Пространство имен Microsoft::WRL::Wrappers::HandleTraits

Описывает характеристики общих типов ресурсов на основе дескрипторов.

Пространство имен Windows::Foundation

Включает базовые функции среда выполнения Windows, такие как создание


объектов и фабрики.

Связанные разделы
Библиотека шаблонов C++ среды выполнения Windows (WRL)

Представляет среда выполнения Windows библиотеку шаблонов C++, библиотеку


шаблонов на основе COM, которая предоставляет низкоуровневый способ
создания и использования среда выполнения Windows компонентов.
Пространство имен Microsoft::WRL
Статья • 03.04.2023

Определяет основные типы, составляющие библиотеку шаблонов среда


выполнения Windows C++.

Синтаксис
C++

namespace Microsoft::WRL;

Члены

Определения типов

Имя Описание

InhibitWeakReferencePolicy RuntimeClassFlags<WinRt | InhibitWeakReference>

Классы

name Описание

Класс ActivationFactory Позволяет одному или нескольким классам быть активированными


средой выполнения Windows.

Класс AsyncBase Реализует асинхронный конечный автомат среды выполнения


Windows.

Класс ClassFactory Реализует базовую функциональность интерфейса IClassFactory .

Класс ComPtr Создает тип интеллектуальный указатель , который представляет


интерфейс, определяемый параметром шаблона. ComPtr
автоматически поддерживает счетчик ссылок для указателя
базового интерфейса и освобождает интерфейс, когда счетчик
ссылок становится равен нулю.

Класс Класс шаблона, используемый для типов аргументов событий для


DeferrableEventArgs задержек.
name Описание

EventSource Представляет событие. Функции-члены EventSource добавляют,


удаляют и вызывают обработчики событий.

Класс FtmBase Представляет свободнопоточный объект маршаллера.

Класс модуля Представляет коллекцию связанных объектов.

Класс RuntimeClass Представляет экземпляр класса, который наследует указанное


число интерфейсов и предоставляет указанную среду выполнения
Windows, классическую COM-модель и поддержку слабых ссылок.

Класс Предоставляет основной механизм для создания базового класса


SimpleActivationFactory среды выполнения Windows или классической модели COM.

Класс Предоставляет основной механизм для создания базового класса.


SimpleClassFactory

Класс WeakRef Представляет собой слабую ссылку , которая может использоваться


только в среде выполнения Windows, а не в классической модели
COM. Слабая ссылка представляет собой объект, который может
быть доступен или недоступен.

Структуры

Имя Описание

ChainInterfaces - Указывает функции проверки и инициализации, которые могут


структура применяться к набору идентификаторов интерфейсов.

CloakedIid - Указывает шаблонам RuntimeClass , Implements и ChainInterfaces , что


структура указанный интерфейс недоступен в списке IID.

Implements - QueryInterface Реализует и GetIid для указанных интерфейсов.


структура

MixIn - структура Гарантирует, что класс среды выполнения является производным от


интерфейсов среды выполнения Windows, если таковые имеются, а
затем от интерфейсов классической модели COM.

RuntimeClassFlags Содержит тип для экземпляра RuntimeClass.


- структура

Перечисления

Имя Описание
Имя Описание

AsyncResultType - Указывает тип результата, возвращаемого методом GetResults() .


перечисление

ModuleType - Указывает, должен ли модуль поддерживать внутрипроцессный


перечисление или внепроцессный сервер.

RuntimeClassType - Указывает поддерживаемый тип экземпляра RuntimeClass .


перечисление

Функции

Имя Описание

Функция AsWeak Извлекает слабую ссылку на определенный экземпляр.

Функция обратного Создает объект, функция-член которого является методом


вызова (WRL) обратного вызова.

Функция Создает фабрику, производящую экземпляры указанного класса,


CreateActivationFactory которые могут быть активированы средой выполнения Windows.

Функция Создает фабрику, которая создает экземпляры указанного класса.


CreateClassFactory

Make Function Инициализирует указанный класс среда выполнения Windows.

Требования
Заголовок: async.h, client.h, corewrappers.h, event.h, ftm.h, implements.h, internal.h,
module.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL::Wrappers
Макрос ActivatableClass
Статья • 03.04.2023

Заполняет внутренний кэш, содержащий фабрику, которая может создать


экземпляр указанного класса.

Синтаксис
C++

ActivatableClass(

className

);

ActivatableClassWithFactory(

className,

factory

);

ActivatableClassWithFactoryEx(

className,

factory,

serverName

);

Параметры
Classname

Имя создаваемого класса.

фабрика

Фабрика, которая создаст экземпляр указанного класса.

serverName

Имя, указывающее подмножество фабрик в модуле.

Комментарии
Не используйте эти макросы с классической моделью COM, если только вы не
используете директиву #undef , чтобы убедиться, что __WRL_WINRT_STRICT__
определение макроса удалено.
Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

См. также раздел


Класс module
ActivationFactory - класс
Статья • 03.04.2023

Позволяет одному или нескольким классам быть активированными средой


выполнения Windows.

Синтаксис
C++

template <

typename I0 = Details::Nil,

typename I1 = Details::Nil,

typename I2 = Details::Nil

>

class ActivationFactory :

public Details::RuntimeClass<

typename Details::InterfaceListHelper<

IActivationFactory,

I0,

I1,

I2,

Details::Nil

>::TypeT,

RuntimeClassFlags<WinRt | InhibitWeakReference>,

false

>;

Параметры
I0

Нулевой интерфейс.

I1

Первый интерфейс.

I2

Второй интерфейс.

Комментарии
ActivationFactory предоставляет методы регистрации и основные функциональные

IActivationFactory возможности интерфейса. ActivationFactory также позволяет


предоставить пользовательскую реализацию фабрики.

В следующем фрагменте кода символически показано, как использовать


ActivationFactory.

C++

struct MyClassFactory : public


ActivationFactory<IMyAddtionalInterfaceOnFactory>

STDMETHOD(ActivateInstance) (_Outptr_result_nullonfailure_
IInspectable** ppvObject)

// my custom implementation

return S_OK;

};

ActivatableClassWithFactory(MyClass, MyClassFactory);

// or if a default factory is used:

//ActivatableClassWithFactory(MyClass, SimpleActivationFactory);

В следующем фрагменте кода показано, как использовать структуру Implements для


указания более трех идентификаторов интерфейсов.

struct MyFactory : ActivationFactory<Implements<I1, I2, I3>, I4, I5>;

Члены

Открытые конструкторы

name Описание

ActivationFactory::ActivationFactory Инициализирует класс ActivationFactory .

Открытые методы

name Описание

ActivationFactory::AddRef Увеличивает количество ссылок текущего


ActivationFactory объекта.

ActivationFactory::GetIids Извлекает массив идентификаторов


реализованного интерфейса.
name Описание

ActivationFactory::GetRuntimeClassName Возвращает имя класса среды выполнения


объекта, который создает текущий
ActivationFactory экземпляр.

ActivationFactory::GetTrustLevel Возвращает уровень доверия объекта, который


создает текущий ActivationFactory экземпляр.

ActivationFactory::QueryInterface Извлекает указатель на указанный интерфейс.

ActivationFactory::Release Уменьшает количество ссылок текущего


ActivationFactory объекта.

Иерархия наследования
I0

ChainInterfaces

I0

RuntimeClassBase

ImplementsHelper

DontUseNewUseMake

RuntimeClassFlags

RuntimeClassBaseT

RuntimeClass

ActivationFactory

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

ActivationFactory::ActivationFactory
Инициализирует класс ActivationFactory .

C++

ActivationFactory();

ActivationFactory::AddRef
Увеличивает количество ссылок текущего ActivationFactory объекта.

C++

STDMETHOD_(

ULONG,

AddRef

)();

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, описывающее тип сбоя.

ActivationFactory::GetIids
Извлекает массив идентификаторов реализованного интерфейса.

C++

STDMETHOD(

GetIids

)(_Out_ ULONG *iidCount, _Deref_out_ _Deref_post_cap_(*iidCount) IID


**iids);

Параметры
iidCount

После завершения этой операции количество идентификаторов взаимодействия в


массиве iids .

iids

После завершения операции представляет массив идентификаторов


реализованного интерфейса.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, описывающее тип сбоя. E_OUTOFMEMORY является возможной
ошибкой HRESULT.

ActivationFactory::GetRuntimeClassName
Возвращает имя класса среды выполнения объекта, который создает текущий
ActivationFactory экземпляр.

C++

STDMETHOD(

GetRuntimeClassName

)(_Out_ HSTRING* runtimeName);

Параметры
runtimeName

После завершения этой операции дескриптор строки, содержащей имя класса


среды выполнения объекта, экземпляра, созданного текущим ActivationFactory
экземпляром.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, описывающее тип сбоя.

ActivationFactory::GetTrustLevel
Возвращает уровень доверия объекта, который создает текущий ActivationFactory
экземпляр.

C++

STDMETHOD(

GetTrustLevel

)(_Out_ TrustLevel* trustLvl);

Параметры
trustLvl

После завершения этой операции уровень доверия класса среды выполнения,


который ActivationFactory создает экземпляр .

Возвращаемое значение
S_OK в случае успешного выполнения; В противном случае возникает ошибка
утверждения, а для trustLvl задано значение FullTrust .

ActivationFactory::QueryInterface
Извлекает указатель на указанный интерфейс.

C++

STDMETHOD(

QueryInterface

)(REFIID riid, _Deref_out_ void **ppvObject);

Параметры
riid

Идентификатор интерфейса.

ppvObject

После завершения этой операции указатель на интерфейс, заданный параметром


riid.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, описывающее тип сбоя.

ActivationFactory::Release
Уменьшает количество ссылок текущего ActivationFactory объекта.
C++

STDMETHOD_(

ULONG,

Release

)();

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, описывающее тип сбоя.
Класс AgileActivationFactory
Статья • 03.04.2023

Представляет фабрику активации, удобную для подразделения, которая реализует


FtmBase.

Синтаксис
C++

template <

typename I0 = Details::Nil,

typename I1 = Details::Nil,

typename I2 = Details::Nil,

FactoryCacheFlags cacheFlagValue = FactoryCacheDefault

>

class AgileActivationFactory :

public ActivationFactory<

Implements<FtmBase, I0>,

I1,

I2,

cacheFlagValue

>;

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL

Класс ActivationFactory
Класс AgileEventSource
Статья • 03.04.2023

Представляет событие, вызванное компонентом Agile, который является


компонентом, к которому можно получить доступ из любого потока. Наследует от
EventSource и переопределяет функцию-член Add дополнительным параметром
типа для указания параметров вызова события Agile.

Синтаксис
C++

template<

typename TDelegateInterface,

typename TEventSourceOptions =
Microsoft::WRL::InvokeModeOptions<FireAll>

>

class AgileEventSource :

public Microsoft::WRL::EventSource<

TDelegateInterface, TEventSourceOptions>;

Параметры
TDelegateInterface

Интерфейс делегата, представляющего обработчик событий.

TEventSourceOptions

Структура InvokeModeOptions , поле invokeMode которой имеет значение


InvokeMode::StopOnFirstError или InvokeMode::FireAll .

Комментарии
Подавляющее большинство компонентов в среда выполнения Windows являются
гибкими компонентами. Дополнительные сведения см. в разделе Потоки и
маршалинг (C++/CX).

Иерархия наследования
EventSource
AgileEventSource

Требования
Заголовок: event.h

Пространство имен: Microsoft::WRL

Элементы

Открытые методы

name Описание

Метод Добавляет обработчик событий Agile, представленный указанным


AgileEventSource::Add интерфейсом делегата, в набор обработчиков событий для текущего
объекта AgileEventSource .

Метод AgileEventSource::Add
Добавляет обработчик событий, представленный указанным интерфейсом
делегата, к набору обработчиков событий для текущего объекта EventSource .

Синтаксис
C++

HRESULT Add(

_In_ TDelegateInterface* delegateInterface,

_Out_ EventRegistrationToken* token

);

Параметры
delegateInterface

Интерфейс для объекта делегата, который представляет обработчик событий.

token

После завершения операции представляет дескриптор события. Используйте этот


маркер в качестве параметра метода для Remove() отмены обработчика событий.
Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

См. также раздел


Пространство имен Microsoft::WRL
AsWeak - функция
Статья • 03.04.2023

Извлекает слабую ссылку на определенный экземпляр.

Синтаксис
C++

template<typename T>

HRESULT AsWeak(

_In_ T* p,

_Out_ WeakRef* pWeak

);

Параметры
T

Указатель на тип параметра p.

Экземпляр типа .

pWeak

После завершения этой операции указатель на слабую ссылку на параметр p.

Возвращаемое значение
S_OK, если эта операция выполнена успешно; в противном случае — ошибка
HRESULT, указывающая причину сбоя.

Требования
Заголовок: client.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
AsyncBase - класс
Статья • 03.04.2023

Реализует асинхронный конечный автомат среды выполнения Windows.

Синтаксис
C++

template <

typename TComplete,

typename TProgress = Details::Nil,

AsyncResultType resultType = SingleResult

>

class AsyncBase : public AsyncBase<TComplete, Details::Nil, resultType>;

template <typename TComplete, AsyncResultType resultType>

class AsyncBase<TComplete, Details::Nil, resultType> :

public Microsoft::WRL::Implements<IAsyncInfo>;

Параметры
TComplete

Обработчик событий, который вызывается при завершении асинхронной


операции.

TProgress

Обработчик событий, который вызывается, когда выполняющаяся асинхронная


операция сообщает о текущем ходе выполнения операции.

resultType

Одно из значений перечисления AsyncResultType . По умолчанию — SingleResult .

Члены

Открытые конструкторы

name Описание

AsyncBase::AsyncBase Инициализирует экземпляр класса AsyncBase .


Открытые методы

name Описание

AsyncBase::Cancel Отменяет асинхронную операцию.

AsyncBase::Close Закрывает асинхронную операцию.

AsyncBase::FireCompletion Вызывает обработчик событий завершения или сбрасывает


внутренний делегат хода выполнения.

AsyncBase::FireProgress Вызывает текущий обработчик событий процесса выполнения.

AsyncBase::get_ErrorCode Извлекает код ошибки для текущей асинхронной операции.

AsyncBase::get_Id Извлекает дескриптор асинхронной операции.

AsyncBase::get_Status Извлекает значение, указывающее состояние асинхронной


операции.

AsyncBase::GetOnComplete Копирует адрес текущего обработчика событий завершения в


указанную переменную.

AsyncBase::GetOnProgress Копирует адрес текущего обработчика событий процесса


выполнения в указанную переменную.

AsyncBase::p ut_Id Задает дескриптор асинхронной операции.

AsyncBase::P Задает для адреса обработчика событий завершения указанное


utOnComplete значение.

AsyncBase::P utOnProgress Задает заданное значение для обработчика событий хода


выполнения.

Защищенные методы

Имя Описание

AsyncBase::CheckValidStateForDelegateCall Проверяет, можно ли изменить свойства


делегата в текущем асинхронном состоянии.

AsyncBase::CheckValidStateForResultsCall Проверяет, можно ли собирать результаты


асинхронной операции в текущем асинхронном
состоянии.

AsyncBase::ContinueAsyncOperation Определяет, должна ли асинхронная операция


продолжать обработку или должна быть
остановлена.
Имя Описание

AsyncBase::CurrentStatus Извлекает состояние текущей асинхронной


операции.

AsyncBase::ErrorCode Извлекает код ошибки для текущей асинхронной


операции.

AsyncBase::OnCancel При переопределении в производном классе


отменяет асинхронную операцию.

AsyncBase::OnClose При переопределении в производном классе


закрывает асинхронную операцию.

AsyncBase::OnStart При переопределении в производном классе


запускает асинхронную операцию.

AsyncBase::Start Запускает асинхронную операцию.

AsyncBase::TryTransitionToCompleted Указывает, завершена ли текущая асинхронная


операция.

AsyncBase::TryTransitionToError Указывает, может ли указанный код ошибки


изменить внутреннее состояние ошибки.

Иерархия наследования
AsyncBase

AsyncBase

Требования
Заголовок: async.h

Пространство имен: Microsoft::WRL

AsyncBase::AsyncBase
Инициализирует экземпляр класса AsyncBase .

C++

AsyncBase();

AsyncBase::Cancel
Отменяет асинхронную операцию.

C++

STDMETHOD(

Cancel

)(void);

Возвращаемое значение
По умолчанию всегда возвращает S_OK.

Комментарии
Cancel() является реализацией IAsyncInfo::Cancel по умолчанию и не выполняет

фактических действий. Чтобы фактически отменить асинхронную операцию,


переопределите чистый OnCancel() виртуальный метод.

AsyncBase::CheckValidStateForDelegateCall
Проверяет, можно ли изменить свойства делегата в текущем асинхронном
состоянии.

C++

inline HRESULT CheckValidStateForDelegateCall();

Возвращаемое значение
S_OK, можно ли изменить свойства делегата; в противном случае
E_ILLEGAL_METHOD_CALL.

AsyncBase::CheckValidStateForResultsCall
Проверяет, можно ли собирать результаты асинхронной операции в текущем
асинхронном состоянии.

C++
inline HRESULT CheckValidStateForResultsCall();

Возвращаемое значение
S_OK, можно ли собирать результаты; в противном случае
E_ILLEGAL_METHOD_CALLE_ILLEGAL_METHOD_CALL.

AsyncBase::Close
Закрывает асинхронную операцию.

C++

STDMETHOD(

Close

)(void) override;

Возвращаемое значение
S_OK, если операция закрывается или уже закрыта; в противном случае
E_ILLEGAL_STATE_CHANGE.

Комментарии
Close() является реализацией IAsyncInfo::Close по умолчанию и не выполняет
фактических действий. Чтобы фактически закрыть асинхронную операцию,
переопределите чистый OnClose() виртуальный метод.

AsyncBase::ContinueAsyncOperation
Определяет, должна ли асинхронная операция продолжать обработку или должна
быть остановлена.

C++

inline bool ContinueAsyncOperation();

Возвращаемое значение
true Значение , если текущее состояние асинхронной операции запущено, что

означает, что операция должна быть продолжена. false В противном случае —


значение , что означает, что операция должна быть остановлена.

AsyncBase::CurrentStatus
Извлекает состояние текущей асинхронной операции.

C++

inline void CurrentStatus(

Details::AsyncStatusInternal *status

);

Параметры
status

Расположение, в котором эта операция сохраняет текущее состояние.

Комментарии
Данная операция является потокобезопасной.

AsyncBase::ErrorCode
Извлекает код ошибки для текущей асинхронной операции.

C++

inline void ErrorCode(

HRESULT *error

);

Параметры
error

Расположение, в котором эта операция хранит текущий код ошибки.

Комментарии
Данная операция является потокобезопасной.

AsyncBase::FireCompletion
Вызывает обработчик событий завершения или сбрасывает внутренний делегат
хода выполнения.

C++

void FireCompletion(

void

) override;

virtual void FireCompletion();

Комментарии
Первая версия сбрасывает внутреннюю переменную делегата FireCompletion()
хода выполнения. Вторая версия вызывает обработчик событий завершения, если
асинхронная операция завершена.

AsyncBase::FireProgress
Вызывает текущий обработчик событий процесса выполнения.

C++

void FireProgress(

const typename ProgressTraits::Arg2Type arg

);

Параметры
Arg

Метод обработчика событий для запуска.

Комментарии
ProgressTraits является производным от структуры ArgTraitsHelper.
AsyncBase::get_ErrorCode
Извлекает код ошибки для текущей асинхронной операции.

C++

STDMETHOD(

get_ErrorCode

)(HRESULT* errorCode) override;

Параметры
errorCode

Расположение, в котором хранится текущий код ошибки.

Возвращаемое значение
S_OK в случае успешного выполнения; В противном случае
E_ILLEGAL_METHOD_CALL, если текущая асинхронная операция закрыта.

AsyncBase::get_Id
Извлекает дескриптор асинхронной операции.

C++

STDMETHOD(

get_Id

)(unsigned int *id) override;

Параметры
идентификатор

Расположение, в котором должен храниться дескриптор.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае
E_ILLEGAL_METHOD_CALL.
Комментарии
Этот метод реализует IAsyncInfo::get_Id .

AsyncBase::get_Status
Извлекает значение, указывающее состояние асинхронной операции.

C++

STDMETHOD(

get_Status

)(AsyncStatus *status) override;

Параметры
status

Расположение, в котором будет храниться состояние. Дополнительные сведения


см. в разделе Windows::Foundation::AsyncStatus Перечисление.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае
E_ILLEGAL_METHOD_CALL.

Комментарии
Этот метод реализует IAsyncInfo::get_Status .

AsyncBase::GetOnComplete
Копирует адрес текущего обработчика событий завершения в указанную
переменную.

C++

STDMETHOD(

GetOnComplete

)(TComplete** completeHandler);

Параметры
completeHandler

Расположение, в котором хранится адрес текущего обработчика событий


завершения.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае
E_ILLEGAL_METHOD_CALL.

AsyncBase::GetOnProgress
Копирует адрес текущего обработчика событий процесса выполнения в указанную
переменную.

C++

STDMETHOD(

GetOnProgress

)(TProgress** progressHandler);

Параметры
progressHandler

Расположение, в котором сохраняется адрес текущего обработчика событий


процесса выполнения.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае
E_ILLEGAL_METHOD_CALL.

AsyncBase::OnCancel
При переопределении в производном классе отменяет асинхронную операцию.

C++

virtual void OnCancel(

void

) = 0;

AsyncBase::OnClose
При переопределении в производном классе закрывает асинхронную операцию.

C++

virtual void OnClose(

void

) = 0;

AsyncBase::OnStart
При переопределении в производном классе запускает асинхронную операцию.

C++

virtual HRESULT OnStart(

void

) = 0;

AsyncBase::p ut_Id
Задает дескриптор асинхронной операции.

C++

STDMETHOD(

put_Id

)(const unsigned int id);

Параметры
идентификатор

Ненулевой дескриптор.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае E_INVALIDARG или
E_ILLEGAL_METHOD_CALL.

AsyncBase::P utOnComplete
Задает для адреса обработчика событий завершения указанное значение.

C++

STDMETHOD(

PutOnComplete

)(TComplete* completeHandler);

Параметры
completeHandler

Адрес, на который задается обработчик событий завершения.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае
E_ILLEGAL_METHOD_CALL.

AsyncBase::P utOnProgress
Задает заданное значение для обработчика событий хода выполнения.

C++

STDMETHOD(

PutOnProgress

)(TProgress* progressHandler);

Параметры
progressHandler

Адрес, для которого задан обработчик событий хода выполнения.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае
E_ILLEGAL_METHOD_CALL.

AsyncBase::Start
Запускает асинхронную операцию.

C++

STDMETHOD(

Start

)(void);

Возвращаемое значение
S_OK, если операция запущена или уже запущена; в противном случае
E_ILLEGAL_STATE_CHANGE.

Комментарии
Start() — это защищенный метод, который не отображается извне, так как

асинхронные операции "горячего запуска" перед возвратом к вызывающей


объекту.

AsyncBase::TryTransitionToCompleted
Указывает, завершена ли текущая асинхронная операция.

C++

bool TryTransitionToCompleted(

void

);

Возвращаемое значение
true Значение , если асинхронная операция завершена; в противном случае —
false .

AsyncBase::TryTransitionToError
Указывает, может ли указанный код ошибки изменить внутреннее состояние
ошибки.

C++

bool TryTransitionToError(

const HRESULT error

);

Параметры
error

Ошибка HRESULT.

Возвращаемое значение
true Значение , если внутреннее состояние ошибки было изменено; в противном

случае — false .

Комментарии
Эта операция изменяет состояние ошибки только в том случае, если для состояния
ошибки уже задано значение S_OK. Эта операция не оказывает влияния, если
состояние ошибки уже является ошибкой, отменено, завершено или закрыто.
AsyncResultType - перечисление
Статья • 03.04.2023

Указывает тип результата, возвращаемого методом GetResults() .

Синтаксис
C++

enum AsyncResultType;

Участники

Значения

Имя Описание

MultipleResults Вызывается набор из нескольких результатов, которые последовательно


отображаются между Start состоянием и до Close() .

SingleResult Один результат, который отображается после возникновения Complete


события.

Требования
Заголовок: async.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
Функция обратного вызова (WRL)
Статья • 03.04.2023

Создает объект, функция-член которого является методом обратного вызова.

Синтаксис
C++

template<

typename TDelegateInterface,

typename TCallback

>

ComPtr<TDelegateInterface> Callback(

TCallback callback

);

template<

typename TDelegateInterface,

typename TCallbackObject

>

ComPtr<TDelegateInterface> Callback(

_In_ TCallbackObject *object,

_In_ HRESULT (TCallbackObject::* method)()

);

template<

typename TDelegateInterface,

typename TCallbackObject,

typename TArg1

>

ComPtr<TDelegateInterface> Callback(

_In_ TCallbackObject *object,

_In_ HRESULT (TCallbackObject::* method)(TArg1)

);

template<

typename TDelegateInterface,

typename TCallbackObject,

typename TArg1,

typename TArg2

>

ComPtr<TDelegateInterface> Callback(

_In_ TCallbackObject *object,

_In_ HRESULT (TCallbackObject::* method)(TArg1,

TArg2)

);

template<

typename TDelegateInterface,

typename TCallbackObject,

typename TArg1,

typename TArg2,

typename TArg3

>

ComPtr<TDelegateInterface> Callback(

_In_ TCallbackObject *object,

_In_ HRESULT (TCallbackObject::* method)(TArg1,

TArg2,

TArg3)

);

template<

typename TDelegateInterface,

typename TCallbackObject,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4

>

ComPtr<TDelegateInterface> Callback(

_In_ TCallbackObject *object,

_In_ HRESULT (TCallbackObject::* method)(TArg1,

TArg2,

TArg3,

TArg4)

);

template<

typename TDelegateInterface,

typename TCallbackObject,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5

>

ComPtr<TDelegateInterface> Callback(

_In_ TCallbackObject *object,

_In_ HRESULT (TCallbackObject::* method)(TArg1,

TArg2,

TArg3,

TArg4,

TArg5)

);

template<

typename TDelegateInterface,

typename TCallbackObject,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6

>

ComPtr<TDelegateInterface> Callback(

_In_ TCallbackObject *object,

_In_ HRESULT (TCallbackObject::* method)(TArg1,

TArg2,

TArg3,

TArg4,

TArg5,

TArg6)

);

template<

typename TDelegateInterface,

typename TCallbackObject,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6,

typename TArg7

>

ComPtr<TDelegateInterface> Callback(

_In_ TCallbackObject *object,

_In_ HRESULT (TCallbackObject::* method)(TArg1,

TArg2,

TArg3,

TArg4,

TArg5,

TArg6,

TArg7)

);

template<

typename TDelegateInterface,

typename TCallbackObject,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6,

typename TArg7,

typename TArg8

>

ComPtr<TDelegateInterface> Callback(

_In_ TCallbackObject *object,

_In_ HRESULT (TCallbackObject::* method)(TArg1,

TArg2,

TArg3,

TArg4,

TArg5,

TArg6,

TArg7,

TArg8)

);

template<

typename TDelegateInterface,

typename TCallbackObject,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6,

typename TArg7,

typename TArg8,

typename TArg9

>

ComPtr<TDelegateInterface> Callback(

_In_ TCallbackObject *object,

_In_ HRESULT (TCallbackObject::* method)(TArg1,

TArg2,

TArg3,

TArg4,

TArg5,

TArg6,

TArg7,

TArg8,

TArg9)

);

Параметры
TDelegateInterface

Параметр шаблона, определяющий интерфейс делегата, который вызывается при


возникновении события.

TCallback

Параметр шаблона, определяющий тип объекта, который представляет объект и


его функцию-член обратного вызова.

TCallbackObject

Параметр шаблона, определяющий объект, функция-член которого является


методом, вызываемым при возникновении события.

TArg1

Параметр шаблона, который определяет тип первого аргумента метода обратного


вызова.

TArg2

Параметр шаблона, который определяет тип второго аргумента метода обратного


вызова.

TArg3

Параметр шаблона, который определяет тип третьего аргумента метода обратного


вызова.

TArg4

Параметр шаблона, который определяет тип четвертого аргумента метода


обратного вызова.

TArg5

Параметр шаблона, который определяет тип пятого аргумента метода обратного


вызова.

TArg6

Параметр шаблона, который определяет тип шестого аргумента метода обратного


вызова.

TArg7

Параметр шаблона, который определяет тип седьмого аргумента метода обратного


вызова.

TArg8

Параметр шаблона, указывающий тип восьмого аргумента метода обратного


вызова.

TArg9

Параметр шаблона, который определяет тип девятого аргумента метода обратного


вызова.

Обратного вызова

Объект, который представляет объект обратного вызова и его функцию-член.

object

Объект, функция-член которого вызывается при возникновении события.

method

Функция-член, которую необходимо вызвать при возникновении события.

Возвращаемое значение
Объект, функция-член которого является методом обратного вызова.

Комментарии
Основанием объекта делегата должно быть IUnknown , а не IInspectable .

Требования
Заголовок: event.h
Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
CancelTransitionPolicy - перечисление
Статья • 03.04.2023

Указывает, как попытка асинхронной операции перейти в состояние терминала


завершенного или ошибки должна вести себя в отношении запрошенного
клиентом состояния отмены.

Синтаксис
C++

enum CancelTransitionPolicy;

Участники

Значения

Имя Описание

RemainCanceled Если асинхронная операция в данный момент находится в


запрошенном клиентом состоянии отмены, это означает, что
данный элемент остается в отмененном состоянии, в отличие от
перехода к окончательному состоянию завершения или ошибки.

TransitionFromCanceled Если асинхронная операция в данный момент находится в


запрошенном клиентом состоянии отмены, это означает, что
состояние должно перейти из данного состояния отмены в
окончательное состояние завершения или ошибки, как определено
вызовом, который использует этот флажок.

Требования
Заголовок: async.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
ChainInterfaces - структура
Статья • 03.04.2023

Указывает функции проверки и инициализации, которые могут применяться к


набору идентификаторов интерфейсов.

Синтаксис
C++

template <

typename I0,

typename I1,

typename I2 = Details::Nil,

typename I3 = Details::Nil,

typename I4 = Details::Nil,

typename I5 = Details::Nil,

typename I6 = Details::Nil,

typename I7 = Details::Nil,

typename I8 = Details::Nil,

typename I9 = Details::Nil

>

struct ChainInterfaces : I0;

template <

typename DerivedType,

typename BaseType,

bool hasImplements,

typename I1,

typename I2,

typename I3,

typename I4,

typename I5,

typename I6,

typename I7,

typename I8,

typename I9

>

struct ChainInterfaces<
MixIn<

DerivedType,

BaseType,

hasImplements

>, I1, I2, I3, I4, I5, I6, I7, I8, I9

>;

Параметры
I0

(Обязательно) Идентификатор интерфейса 0.

I1

(Обязательно) Идентификатор интерфейса 1.

I2

(Необязательно) Идентификатор интерфейса 2.

I3

(Необязательно) Идентификатор интерфейса 3.

I4

(Необязательно) Идентификатор интерфейса 4.

I5

(Необязательно) Идентификатор интерфейса 5.

I6

(Необязательно) Идентификатор интерфейса 6.

I7

(Необязательно) Идентификатор интерфейса 7.

I8

(Необязательно) Идентификатор интерфейса 8.

I9

(Необязательно) Идентификатор интерфейса 9.

Производный тип

Производный тип.

BaseType

Базовый тип производного типа.

hasImplements

Логическое значение, которое, если true , означает, что нельзя использовать


структуру MixIn с классом, который не является производным от шаблона
Implements .

Элементы

Защищенные методы
Имя Описание

ChainInterfaces::CanCastTo Указывает, можно ли привести указанный идентификатор


интерфейса к каждой специализации, определенной
параметрами ChainInterface шаблона.

ChainInterfaces::CastToUnknown Приводит указатель интерфейса типа, определенного


параметром шаблона I0 , к указателю на IUnknown .

ChainInterfaces::FillArrayWithIid Сохраняет идентификатор интерфейса, определенный


параметром шаблона I0 , в указанном расположении в
указанном массиве идентификаторов интерфейсов.

ChainInterfaces::Verify Проверяет, наследуется ли каждый интерфейс,


определенный параметрами шаблона от I0 до I9 , от
IUnknown и (или) IInspectable и что I0 наследует от I1 до I9.

Защищенные константы

Имя Описание

ChainInterfaces::IidCount Общее количество идентификаторов интерфейсов, содержащихся


в интерфейсах, указанных параметрами шаблона от I0 до I9.

Иерархия наследования
I0

ChainInterfaces

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

ChainInterfaces::CanCastTo
Указывает, можно ли привести указанный идентификатор интерфейса к каждой
специализации, определенной параметрами шаблона, не заданными по
умолчанию.

C++
__forceinline bool CanCastTo(

REFIID riid,

_Deref_out_ void **ppv

);

Параметры
riid

Идентификатор интерфейса.

Ppv

Указатель на последний успешно приведение идентификатора интерфейса.

Возвращаемое значение
true значение , если все операции приведения выполнены успешно; в противном
случае — false .

ChainInterfaces::CastToUnknown
Приводит указатель интерфейса типа, определенного параметром шаблона I0 , к
указателю на IUnknown .

C++

__forceinline IUnknown* CastToUnknown();

Возвращаемое значение
Указатель на объект IUnknown .

ChainInterfaces::FillArrayWithIid
Сохраняет идентификатор интерфейса, определенный параметром шаблона I0 , в
указанном расположении в указанном массиве идентификаторов интерфейсов.

C++

__forceinline static void FillArrayWithIid(

_Inout_ unsigned long &index,

_In_ IID* iids

);

Параметры
index

Указатель на значение индекса в массиве iids .

iids

Массив идентификаторов интерфейсов.

ChainInterfaces::IidCount
Общее количество идентификаторов интерфейсов, содержащихся в интерфейсах,
указанных параметрами шаблона от I0 до I9.

C++

static const unsigned long IidCount = Details::InterfaceTraits<I0>::IidCount


+ Details::InterfaceTraits<I1>::IidCount +
Details::InterfaceTraits<I2>::IidCount +
Details::InterfaceTraits<I3>::IidCount +
Details::InterfaceTraits<I4>::IidCount +
Details::InterfaceTraits<I5>::IidCount +
Details::InterfaceTraits<I6>::IidCount +
Details::InterfaceTraits<I7>::IidCount +
Details::InterfaceTraits<I8>::IidCount +
Details::InterfaceTraits<I9>::IidCount;

Возвращаемое значение
Общее количество идентификаторов интерфейсов.

Комментарии
Параметры шаблона I0 и I1 являются обязательными, а параметры от I2 до I9
являются необязательными. Число IID каждого интерфейса обычно равно 1.

ChainInterfaces::Verify
Проверяет, наследуется ли каждый интерфейс, определенный параметрами
шаблона от I0 до I9 , от IUnknown и (или) IInspectable и что I0 наследует от I1 до I9.
C++

WRL_NOTHROW __forceinline static void Verify();

Комментарии
Если операция проверки завершается ошибкой, static_assert выдает сообщение
об ошибке с описанием причины.

Параметры шаблона I0 и I1 являются обязательными, а параметры от I2 до I9


являются необязательными.
ClassFactory - класс
Статья • 03.04.2023

Реализует базовую функциональность интерфейса IClassFactory .

Синтаксис
C++

template <

typename I0 = Details::Nil,

typename I1 = Details::Nil,

typename I2 = Details::Nil

>

class ClassFactory :

public Details::RuntimeClass<

typename Details::InterfaceListHelper<

IClassFactory,

I0,

I1,

I2,

Details::Nil

>::TypeT,

RuntimeClassFlags<ClassicCom | InhibitWeakReference>,

false

>;

Параметры
I0

Нулевой интерфейс.

I1

Первый интерфейс.

I2

Второй интерфейс.

Комментарии
Используйте ClassFactory для предоставления пользовательской реализации
фабрики.
В следующем шаблоне программирования показано, как использовать структуру
Implements для указания более трех интерфейсов в фабрике классов.

struct MyFactory : ClassFactory<Implements<I1, I2, I3>, I4, I5>

Члены

Открытые конструкторы

name Описание

ClassFactory::ClassFactory

Открытые методы

name Описание

ClassFactory::AddRef Увеличивает количество ссылок для текущего ClassFactory


объекта.

ClassFactory::LockServer Увеличивает или уменьшает количество базовых объектов,


отслеживаемых текущим ClassFactory объектом.

ClassFactory::QueryInterface Извлекает указатель на интерфейс, заданный параметром .

ClassFactory::Release Уменьшает количество ссылок для текущего ClassFactory


объекта.

Иерархия наследования
I0

ChainInterfaces

I0

RuntimeClassBase

ImplementsHelper

DontUseNewUseMake

RuntimeClassFlags
RuntimeClassBaseT

RuntimeClass

ClassFactory

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

ClassFactory::AddRef
Увеличивает количество ссылок для текущего ClassFactory объекта.

C++

STDMETHOD_(

ULONG,

AddRef

)();

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, описывающее тип сбоя.

ClassFactory::ClassFactory
C++

WRL_NOTHROW ClassFactory();

ClassFactory::LockServer
Увеличивает или уменьшает количество базовых объектов, отслеживаемых
текущим ClassFactory объектом.

C++
STDMETHOD(

LockServer

)(BOOL fLock);

Параметры
Стадо

true для увеличения числа отслеживаемых объектов. false Значение для

уменьшения числа отслеживаемых объектов.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение E_FAIL.

Комментарии
ClassFactory отслеживает объекты в базовом экземпляре класса Module .

ClassFactory::QueryInterface
Извлекает указатель на интерфейс, заданный параметром .

C++

STDMETHOD(

QueryInterface

)(REFIID riid, _Deref_out_ void **ppvObject);

Параметры
riid

Идентификатор интерфейса.

ppvObject

После завершения этой операции указатель на интерфейс, заданный параметром


riid.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, описывающее тип сбоя.

ClassFactory::Release
Уменьшает количество ссылок для текущего ClassFactory объекта.

C++

STDMETHOD_(

ULONG,

Release

)();

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, описывающее тип сбоя.
CloakedIid - структура
Статья • 03.04.2023

Указывает шаблонам RuntimeClass , Implements и ChainInterfaces , что указанный


интерфейс недоступен в списке IID.

Синтаксис
C++

template<typename T>

struct CloakedIid : T;

Параметры

Скрытый (скрытый) интерфейс.

Комментарии
Ниже приведен пример использования CloakedIid : struct MyRuntimeClass :
RuntimeClass<CloakedIid<IMyCloakedInterface>> {} .

Иерархия наследования
T

CloakedIid

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
Класс ComposableBase
Статья • 03.04.2023

Синтаксис
C++

template<typename FactoryInterface = IInspectable>

class ComposableBase;

Параметры
FactoryInterface

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
Класс ComPtr
Статья • 03.04.2023

Создает тип интеллектуальный указатель , который представляет интерфейс,


определяемый параметром шаблона. ComPtr автоматически поддерживает счетчик
ссылок для указателя базового интерфейса и освобождает интерфейс, когда
счетчик ссылок становится равен нулю.

Синтаксис
C++

template <typename T>

class ComPtr;

template<class U>

friend class ComPtr;

Параметры
T

Интерфейс, ComPtr который представляет.

Класс, которому является текущий ComPtr друг. (Шаблон, который использует этот
параметр, защищен.)

Remarks
ComPtr<> объявляет тип, представляющий базовый указатель интерфейса.
Используется для ComPtr<> объявления переменной, а затем с помощью оператора
доступа к члену со стрелкой ( -> ) для доступа к функции-члену интерфейса.

Дополнительные сведения о смарт-указателях см. в подразделе "Интеллектуальные


указатели COM" статьи о методах программирования COM .

Элементы
Общедоступные определения типов

Имя Описание

InterfaceType Синоним типа, указанного параметром шаблона T .

Открытые конструкторы

name Описание

ComPtr::ComPtr Инициализирует новый экземпляр класса ComPtr . Перегрузки


предоставляют конструкторы по умолчанию, конструкторы копирования,
перемещения и преобразования.

ComPtr::~ComPtr Деинициализирует экземпляр ComPtr .

Открытые методы

name Описание

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_ члена данных, который
содержит указатель на выпущенный интерфейс.
name Описание

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 Указывает, управляет ли ComPtr объект временем


Microsoft::WRL::Details::BoolType существования интерфейса.

Защищенные члены данных

Имя Описание

ComPtr::ptr_ Содержит указатель на интерфейс, связанный с этим, и управляется этим


ComPtr .

Иерархия наследования
ComPtr

Требования
Заголовка: client.h

Пространство имен: Microsoft::WRL

ComPtr::~ComPtr
Деинициализирует экземпляр ComPtr .

C++

WRL_NOTHROW ~ComPtr();

ComPtr::As
ComPtr Возвращает объект, представляющий интерфейс, определенный указанным
параметром шаблона.

C++

template<typename U>

HRESULT As(

_Out_ ComPtr<U>* p

) const;

template<typename U>

HRESULT As(

_Out_ Details::ComPtrRef<ComPtr<U>> p

) const;

Параметры
U

Интерфейс, представленный параметром p .

Объект ComPtr , представляющий интерфейс, заданный параметром U . Параметр p


не должен ссылаться на текущий ComPtr объект.
Remarks
Первый шаблон — это форма, которую необходимо использовать в коде. Второй
шаблон является внутренней вспомогательной специализацией. Он поддерживает
функции языка C++, такие как ключевое слово вычета auto типов.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — значение HRESULT ,
указывающее на ошибку.

ComPtr::AsIID
ComPtr Возвращает объект, представляющий интерфейс, определенный указанным
идентификатором интерфейса.

C++

WRL_NOTHROW HRESULT AsIID(

REFIID riid,

_Out_ ComPtr<IUnknown>* p

) const;

Параметры
riid

Идентификатор интерфейса.

Если объект имеет интерфейс, идентификатор которого равен riid , удвоительный


косвенный указатель на интерфейс, указанный параметром riid . В противном
случае указатель на IUnknown .

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — значение HRESULT ,

указывающее на ошибку.

ComPtr::AsWeak
Извлекает слабую ссылку на текущий объект.

C++

HRESULT AsWeak(

_Out_ WeakRef* pWeakRef

);

Параметры
pWeakRef

После завершения операции представляет указатель на объект слабой ссылки.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

ComPtr::Attach
Связывает это ComPtr с типом интерфейса, заданным текущим параметром типа
шаблона.

C++

void Attach(

_In_opt_ InterfaceType* other

);

Параметры
other

Тип интерфейса.

ComPtr::ComPtr
Инициализирует новый экземпляр класса ComPtr . Перегрузки предоставляют
конструкторы по умолчанию, конструкторы копирования, перемещения и
преобразования.

C++
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 .

Возвращаемое значение

Remarks
Первый конструктор — это конструктор по умолчанию, который неявно создает
пустой объект. Второй конструктор указывает __nullptr, что явно создает пустой
объект.
Третий конструктор создает объект из объекта, указанного указателем. Теперь
ComPtr он владеет памятью с указанием на память и поддерживает счетчик ссылок.

Четвертый и пятый конструкторы — конструкторы копирования. Пятый


конструктор копирует объект, если он преобразуется в текущий тип.

Шестая и седьмая конструкторы являются конструкторами перемещения. Седьмой


конструктор перемещает объект, если он преобразуется в текущий тип.

ComPtr::CopyTo
Копирует текущий или указанный интерфейс, связанный с этим ComPtr , в
указанный указатель.

C++

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 операция завершилась сбоем.

Remarks
Первая функция возвращает копию указателя на интерфейс, связанный с этим
ComPtr . Эта функция всегда возвращает . S_OK

Вторая функция выполняет QueryInterface операцию с интерфейсом, связанным с


этим ComPtr , для интерфейса, указанного параметром riid .

Третья функция выполняет операцию с интерфейсом QueryInterface , связанным с


этим ComPtr , для базового интерфейса U параметра.

ComPtr::Detach
Отменяет связь этого объекта ComPtr с интерфейсом, который он представляет.

C++

T* Detach();

Возвращаемое значение
Указатель на интерфейс, который был представлен этим объектом ComPtr .

ComPtr::Get
Извлекает указатель на интерфейс, связанный с этим ComPtr .

C++

T* Get() const;

Возвращаемое значение
Указатель на интерфейс, связанный с этим ComPtr .

ComPtr::GetAddressOf
Извлекает адрес ptr_ элемента данных, который содержит указатель на интерфейс,
представленный этим ComPtr элементом.

C++

T* const* GetAddressOf() const;

T** GetAddressOf();

Возвращаемое значение
Адрес переменной.

ComPtr::InternalAddRef
Увеличивает число ссылок интерфейса, связанного с этим ComPtr .

C++

void InternalAddRef() const;

Remarks
Этот метод защищен.

ComPtr::InternalRelease
Выполняет операцию выпуска COM в интерфейсе, связанном с этим ComPtr .

C++

unsigned long InternalRelease();

Remarks
Этот метод защищен.

ComPtr::operator&
Освобождает интерфейс, связанный с этим объектом ComPtr , а затем извлекает
адрес объекта ComPtr .

C++

Details::ComPtrRef<WeakRef> operator&()

const Details::ComPtrRef<const WeakRef> operator&() const

Возвращаемое значение
Слабая ссылка на текущий объект ComPtr .

Remarks
Этот метод отличается от ComPtr::GetAddressOf того, что этот метод освобождает
ссылку на указатель интерфейса. Используется ComPtr::GetAddressOf , если
требуется адрес указателя интерфейса, но не требуется освобождать этот
интерфейс.

ComPtr::operator->
Извлекает указатель на тип, заданный текущим параметром шаблона.

C++

WRL_NOTHROW Microsoft::WRL::Details::RemoveIUnknown<InterfaceType>*
operator->() const;

Возвращаемое значение
Указатель на тип, заданный текущим именем типа шаблона.

Remarks
Эта вспомогательная функция удаляет лишнюю нагрузку, вызванную
использованием макроса STDMETHOD. Эта функция делает IUnknown типы private
вместо virtual .
ComPtr::operator=
Присваивает значение текущему ComPtr .

C++

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 .

Remarks
Первая версия этого оператора присваивает текущему ComPtr значению пустое
значение.

В второй версии, если указатель назначаемый интерфейс не совпадает с текущим


ComPtr указателем интерфейса, второй указатель интерфейса назначается
текущему ComPtr .

В третьей версии указатель интерфейса назначения назначается текущему


ComPtr объекту.

В четвертой версии, если указатель интерфейса присваиваемого значения не


совпадает с текущим ComPtr указателем интерфейса, второй указатель интерфейса
назначается текущему ComPtr .

Пятая версия является оператором копирования; Ссылка на объект ComPtr


присваивается текущему ComPtr объекту.

Шестая версия — это оператор копирования, использующий семантику


перемещения; ссылка rvalue на тип ComPtr , если какой-либо тип является
статическим приведением, а затем назначается текущему ComPtr объекту.

Седьмой вариант — это оператор копирования, использующий семантику


перемещения; Ссылка rvalue на ComPtr тип U является статическим приведением, а
затем назначается текущему ComPtr объекту.

ComPtr::operator==
Определение равенства двух объектов ComPtr .

C++

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 .

Ссылка на другой ComPtr объект.

Возвращаемое значение
Первый оператор возвращает true значение, если объект равен объекту a ; b в
противном случае false .

Второй и третий операторы дают значение true , если объект a равен nullptr ; в
противном случае false .

ComPtr::operator!=
Указывает, не равны ли два ComPtr объекта.

C++

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 .

Ссылка на другой ComPtr объект.


Возвращаемое значение
Первый оператор возвращает значение true , если объект не равен объекту a b ; в
противном случае false .

Второй и третий операторы дают значение true , если объект a не равен nullptr ;
в противном случае false .

ComPtr::operator
Microsoft::WRL::Details::BoolType
Указывает, управляет ли ComPtr объект временем существования интерфейса.

C++

WRL_NOTHROW operator Microsoft::WRL::Details::BoolType() const;

Возвращаемое значение
Если с этим ComPtr связан интерфейс, адрес BoolStruct::Member элемента данных; в
противном случае nullptr .

ComPtr::ptr_
Содержит указатель на интерфейс, связанный с этим, и управляется этим ComPtr .

C++

InterfaceType *ptr_;

Remarks
ptr_ является внутренним, защищенным элементом данных.

ComPtr::ReleaseAndGetAddressOf
Освобождает интерфейс, связанный с этим ComPtr , а затем извлекает адрес ptr_
члена данных, который содержит указатель на выпущенный интерфейс.
C++

T** ReleaseAndGetAddressOf();

Возвращаемое значение
Адрес ptr_ элемента данных этого ComPtr элемента.

ComPtr::Reset
Освобождает интерфейс, связанный с этим ComPtr , и возвращает новое число
ссылок.

C++

unsigned long Reset();

Возвращаемое значение
Количество ссылок, оставшихся в базовом интерфейсе, если таковые есть.

ComPtr::Swap
Обмен интерфейсом, управляемым текущим ComPtr , с интерфейсом, управляемым
указанным ComPtr .

C++

void Swap(

_Inout_ ComPtr&& r

);

void Swap(

_Inout_ ComPtr& r

);

Параметры
r

Объект ComPtr .
CreateActivationFactory - функция
Статья • 03.04.2023

Создает фабрику, производящую экземпляры указанного класса, которые могут


быть активированы средой выполнения Windows.

Синтаксис
C++

template<typename Factory>

inline HRESULT STDMETHODCALLTYPE CreateActivationFactory(

_In_ unsigned int *flags, _In_ const CreatorMap* entry,

REFIID riid,

_Outptr_ IUnknown **ppFactory) throw();

Параметры
flags

Сочетание одного или нескольких значений перечисления RuntimeClassType .

Запись

Указатель на CreatorMap, содержащий сведения об инициализации и регистрации


параметра.

riid

Ссылка на идентификатор интерфейса.

ppFactory

Если эта операция завершается успешно, создается указатель на фабрику


активации.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

Комментарии
Ошибка утверждения возникает, если фабрика параметров шаблона не является
производным от интерфейса IActivationFactory .

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

См. также раздел


Microsoft::WRL::Wrappers::D space
CreateClassFactory - функция
Статья • 03.04.2023

Создает фабрику, которая создает экземпляры указанного класса.

Синтаксис
C++

template<typename Factory>

inline HRESULT STDMETHODCALLTYPE CreateClassFactory(

_In_ unsigned int *flags,

_In_ const CreatorMap* entry,

REFIID riid,

_Outptr_ IUnknown **ppFactory

) throw();

Параметры
flags

Сочетание одного или нескольких значений перечисления RuntimeClassType .

Запись

Указатель на CreatorMap, содержащий сведения об инициализации и регистрации


параметра.

riid

Ссылка на идентификатор интерфейса.

ppFactory

Если эта операция завершается успешно, создается указатель на фабрику классов.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

Комментарии
Ошибка утверждения возникает, если фабрика параметров шаблона не является
производным от интерфейса IClassFactory .
Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

См. также раздел


Microsoft::WRL::Wrappers::D space
Класс DeferrableEventArgs
Статья • 03.04.2023

Класс шаблона, используемый для типов аргументов событий для задержек.

Синтаксис
C++

template <typename TEventArgsInterface, typename TEventArgsClass>

class DeferrableEventArgs : public TEventArgsInterface;

Параметры
TEventArgsInterface

Тип интерфейса, который объявляет аргументы для отложенного события.

TEventArgsClass

Класс, реализующий TEventArgsInterface.

Элементы

Открытые методы

name Описание

DeferrableEventArgs::GetDeferral Возвращает ссылку на объект Deferral ,


представляющий отложенное событие.

DeferrableEventArgs::InvokeAllFinished Вызывается, чтобы указать, что вся обработка для


отложенного события завершена.

Комментарии
Экземпляры этого класса передаются в обработчики событий для отложенных
событий. Параметры шаблона представляют интерфейс, определяющий
подробные сведения об аргументах событий для конкретного типа отложенного
события, а также класс, реализующий этот интерфейс.
Класс отображается как первый аргумент обработчика событий для отложенного
события. Можно вызвать метод GetDeferral , чтобы получить объект Deferral, из
которого можно получить все сведения о отложенных событиях. После
завершения обработки событий необходимо вызвать завершение в объекте
«Задержка». Затем следует вызвать InvokeAllFinished в конце метода обработчика
событий, что гарантирует правильное завершение всех отложенных событий.

Требования
Заголовок: event.h

Пространство имен: Microsoft::WRL

DeferrableEventArgs::GetDeferral
Возвращает ссылку на объект Deferral , представляющий отложенное событие.

C++

HRESULT GetDeferral([out, retval] Windows::Foundation::IDeferral** result)

Параметры
result

Указатель, который будет ссылаться на объект Deferral после завершения вызова.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

DeferrableEventArgs::InvokeAllFinished
Вызывается, чтобы указать, что вся обработка для отложенного события
завершена.

C++

void InvokeAllFinished()

Комментарии
Этот метод следует вызывать после вызова метода InvokeAll из источника события.
Вызов этого метода предотвращает ввод последующих задержек и вызывает
принудительное выполнение обработчика завершения, если задержки
отсутствовали.
EventSource - класс
Статья • 03.04.2023

Представляет событие, не являющегося гибким. Функции-члены EventSource


добавляют, удаляют и вызывают обработчики событий. Для событий Agile
используйте AgileEventSource.

Синтаксис
C++

template<typename TDelegateInterface>

class EventSource;

Параметры
TDelegateInterface

Интерфейс делегата, представляющего обработчик событий.

Члены

Открытые конструкторы

name Описание

EventSource::EventSource Инициализирует новый экземпляр класса EventSource .

Открытые методы

name Описание

EventSource::Add Добавляет обработчик событий, представленный указанным


интерфейсом делегата, к набору обработчиков событий для
текущего EventSource объекта .

EventSource::GetSize Извлекает количество обработчиков событий, связанных с текущим


EventSource объектом .

EventSource::InvokeAll Вызывает каждый обработчик событий, связанный с текущим


EventSource объектом, используя указанные типы и аргументы.
name Описание

EventSource::Remove Удаляет обработчик событий, представленный указанным маркером


регистрации события, из набора обработчиков событий, связанных с
текущим EventSource объектом.

Защищенные члены данных

Имя Описание

EventSource::addRemoveLock_ Синхронизирует доступ к массиву targets_ при добавлении,


удалении или вызове обработчиков событий.

EventSource::targets_ Массив из одного или нескольких обработчиков событий.

EventSource::targetsPointerLock_ Синхронизирует доступ к элементам внутренних данных


даже при добавлении, удалении или вызове обработчиков
событий для этого источника событий.

Иерархия наследования
EventSource

Требования
Заголовок: event.h

Пространство имен: Microsoft::WRL

EventSource::Add
Добавляет обработчик событий, представленный указанным интерфейсом
делегата, к набору обработчиков событий для текущего EventSource объекта .

C++

HRESULT Add(

_In_ TDelegateInterface* delegateInterface,

_Out_ EventRegistrationToken* token

);

Параметры
delegateInterface

Интерфейс для объекта делегата, который представляет обработчик событий.

token

После завершения операции представляет дескриптор события. Используйте этот


маркер в качестве параметра метода Remove(), чтобы отменить обработчик
событий.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

EventSource::addRemoveLock_
Синхронизирует доступ к массиву targets_ при добавлении, удалении или вызове
обработчиков событий.

C++

Wrappers::SRWLock addRemoveLock_;

EventSource::EventSource
Инициализирует новый экземпляр класса EventSource .

C++

EventSource();

EventSource::GetSize
Извлекает количество обработчиков событий, связанных с текущим EventSource
объектом .

C++

size_t GetSize() const;


Возвращаемое значение
Количество обработчиков событий в targets_.

EventSource::InvokeAll
Вызывает каждый обработчик событий, связанный с текущим EventSource
объектом, используя указанные типы и аргументы.

C++

void InvokeAll();

template <

typename T0

>

void InvokeAll(

T0arg0

);

template <

typename T0,

typename T1

>

void InvokeAll(

T0arg0,

T1arg1

);

template <

typename T0,

typename T1,

typename T2

>

void InvokeAll(

T0arg0,

T1arg1,

T2arg2

);

template <

typename T0,

typename T1,

typename T2,

typename T3

>

void InvokeAll(

T0arg0,

T1arg1,

T2arg2,

T3arg3

);

template <

typename T0,

typename T1,

typename T2,

typename T3,

typename T4

>

void InvokeAll(

T0arg0,

T1arg1,

T2arg2,

T3arg3,

T4arg4

);

template <

typename T0,

typename T1,

typename T2,

typename T3,

typename T4,

typename T5

>

void InvokeAll(

T0arg0,

T1arg1,

T2arg2,

T3arg3,

T4arg4,

T5arg5

);

template <

typename T0,

typename T1,

typename T2,

typename T3,

typename T4,

typename T5,

typename T6

>

void InvokeAll(

T0arg0,

T1arg1,

T2arg2,

T3arg3,

T4arg4,

T5arg5,

T6arg6

);

template <

typename T0,

typename T1,

typename T2,

typename T3,

typename T4,

typename T5,

typename T6,

typename T7

>

void InvokeAll(

T0arg0,

T1arg1,

T2arg2,

T3arg3,

T4arg4,

T5arg5,

T6arg6,

T7arg7

);

template <

typename T0,

typename T1,

typename T2,

typename T3,

typename T4,

typename T5,

typename T6,

typename T7,

typename T8

>

void InvokeAll(

T0arg0,

T1arg1,

T2arg2,

T3arg3,

T4arg4,

T5arg5,

T6arg6,

T7arg7,

T8arg8

);

template <

typename T0,

typename T1,

typename T2,

typename T3,

typename T4,

typename T5,

typename T6,

typename T7,

typename T8,

typename T9

>

void InvokeAll(

T0arg0,

T1arg1,

T2arg2,

T3arg3,

T4arg4,

T5arg5,

T6arg6,

T7arg7,

T8arg8,

T9arg9

);

Параметры
T0

Тип нулевого аргумента обработчика событий.

T1

Тип первого аргумента обработчика событий.

T2

Тип второго аргумента обработчика событий.

T3

Тип третьего аргумента обработчика событий.

T4

Тип четвертого аргумента обработчика событий.

T5

Тип пятого аргумента обработчика событий.

T6

Тип шестого аргумента обработчика событий.

T7

Тип седьмого аргумента обработчика событий.

T8

Тип восьмого аргумента обработчика событий.

T9

Тип девятого аргумента обработчика событий.

arg0

Нулевой аргумент обработчика событий.

arg1

Первый аргумент обработчика событий.

arg2

Второй аргумент обработчика событий.


arg3

Третий аргумент обработчика событий.

arg4

Четвертый аргумент обработчика событий.

arg5

Пятый аргумент обработчика событий.

arg6

Шестой аргумент обработчика событий.

arg7

Седьмой аргумент обработчика событий.

arg8

Восьмой аргумент обработчика событий.

arg9

Девятый аргумент обработчика событий.

EventSource::Remove
Удаляет обработчик событий, представленный указанным маркером регистрации
события, из набора обработчиков событий, связанных с текущим EventSource
объектом.

C++

HRESULT Remove(

EventRegistrationToken token

);

Параметры
token

Дескриптор, представляющий обработчик событий. Этот маркер был возвращен,


когда обработчик событий был зарегистрирован методом Add().

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.
Комментарии
Дополнительные сведения о EventRegistrationToken структуре см. в разделе
Структура Windows::Foundation::EventRegistrationToken справочной документации
по среда выполнения Windows.

EventSource::targets_
Массив из одного или нескольких обработчиков событий.

C++

ComPtr<Details::EventTargetArray> targets_;

Комментарии
При возникновении события, представленного текущим EventSource объектом,
вызываются обработчики событий.

EventSource::targetsPointerLock_
Синхронизирует доступ к внутренним элементам данных даже при добавлении,
удалении или вызове обработчиков событий для этого EventSource .

C++

Wrappers::SRWLock targetsPointerLock_;

Перечисление FactoryCacheFlags
Статья • 03.04.2023

Определяет, кэшируются ли объекты фабрики.

Синтаксис
C++

enum FactoryCacheFlags;

Remarks
По умолчанию при создании объекта ModuleType политика кэширования фабрики
указывается как параметр шаблона ModuleType. Чтобы переопределить эту
политику, укажите значение FactoryCacheFlags при создании объекта фабрики.

Политика Описание

FactoryCacheDefault Используется политика кэширования объекта Module .

FactoryCacheEnabled Включает кэширование фабрики независимо от параметра шаблона


ModuleType , используемого для создания объекта Module .

FactoryCacheDisabled Выключает кэширование фабрики независимо от параметра


шаблона ModuleType , используемого для создания объекта Module .

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
FtmBase - класс
Статья • 03.04.2023

Представляет свободнопоточный объект маршаллера.

Синтаксис
C++

class FtmBase :

public Microsoft::WRL::Implements<

Microsoft::WRL::RuntimeClassFlags<WinRtClassicComMix>,

Microsoft::WRL::CloakedIid<IMarshal>

>;

Remarks
Дополнительные сведения см. в разделе Класс RuntimeClass.

Члены

Открытые конструкторы

name Описание

FtmBase::FtmBase Инициализирует новый экземпляр класса FtmBase .

Открытые методы

name Описание

FtmBase::CreateGlobalInterfaceTable Создает таблицу глобального интерфейса (GIT).

FtmBase::D isconnectObject Принудительно освобождает все внешние


подключения к объекту. Сервер объекта вызывает
реализацию этого метода объекта перед завершением
работы.

FtmBase::GetMarshalSizeMax Получение верхней границы количества байтов,


необходимого для маршалирования указанного
указателя интерфейса на указанный объект.
name Описание

FtmBase::GetUnmarshalClass Возвращает идентификатор CLSID, который COM


использует для поиска библиотеки DLL, содержащей
код для соответствующего прокси-сервера. COM
загружает эту библиотеку DLL для создания
неинициализированного экземпляра прокси-сервера.

FtmBase::MarshalInterface Записывает в поток данные, необходимые для


инициализации прокси-объекта в некотором
клиентском процессе.

FtmBase::ReleaseMarshalData Уничтожает маршалированные пакеты данных.

FtmBase::UnmarshalInterface Инициализирует созданный прокси-сервер и


возвращает указатель интерфейса на этот прокси-
сервер.

Открытые члены данных

Имя Описание

FtmBase::marshaller_ Содержит ссылку на свободнопоточный маршалер.

Иерархия наследования
FtmBase

Требования
Заголовок: ftm.h

Пространство имен: Microsoft::WRL

FtmBase::CreateGlobalInterfaceTable
Создает таблицу глобального интерфейса (GIT).

C++

static HRESULT CreateGlobalInterfaceTable(

__out IGlobalInterfaceTable **git

);

Параметры
git

После завершения этой операции — указатель на глобальную таблицу интерфейса.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

Комментарии
Для получения дополнительной информации см. IGlobalInterfaceTable.

FtmBase::D isconnectObject
Принудительно освобождает все внешние подключения к объекту. Сервер объекта
вызывает реализацию этого метода объекта перед завершением работы.

C++

STDMETHODIMP DisconnectObject(

__in DWORD dwReserved

) override;

Параметры
DwReserved

Зарезервировано для будущего использования; должно иметь значение нуль.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

FtmBase::FtmBase
Инициализирует новый экземпляр класса FtmBase .

C++
FtmBase();

FtmBase::GetMarshalSizeMax
Получение верхней границы количества байтов, необходимого для
маршалирования указанного указателя интерфейса на указанный объект.

C++

STDMETHODIMP GetMarshalSizeMax(

__in REFIID riid,

__in_opt void *pv,

__in DWORD dwDestContext,

__reserved void *pvDestContext,

__in DWORD mshlflags,

__out DWORD *pSize

) override;

Параметры
riid

Ссылка на идентификатор интерфейса для маршалинга.

Pv

Указатель интерфейса для маршалинга; может иметь значение NULL.

dwDestContext

Контекст назначения, в котором необходимо отменить удаление указанного


интерфейса.

Укажите одно или несколько значений перечисления MSHCTX.

В настоящее время размежевание может происходить либо в другом объекте


текущего процесса (MSHCTX_INPROC), либо в другом процессе на том же
компьютере, что и текущий процесс (MSHCTX_LOCAL).

pvDestContext

Зарезервировано для использования в будущем; значение должно иметь значение


NULL.

mshlflags

Флаг, указывающий, должны ли данные для маршалинга передаваться обратно в


клиентский процесс (типичный случай) или записываться в глобальную таблицу,
где их могут извлечь несколько клиентов. Укажите одно или несколько значений
перечисления MSHLFLAGS.

pSize

После завершения этой операции наведите указатель на верхнюю границу объема


данных, записываемых в поток маршалинга.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае E_FAIL или
E_NOINTERFACE.

FtmBase::GetUnmarshalClass
Возвращает идентификатор CLSID, который COM использует для поиска
библиотеки DLL, содержащей код для соответствующего прокси-сервера. COM
загружает эту библиотеку DLL для создания неинициализированного экземпляра
прокси-сервера.

C++

STDMETHODIMP GetUnmarshalClass(

__in REFIID riid,

__in_opt void *pv,

__in DWORD dwDestContext,

__reserved void *pvDestContext,

__in DWORD mshlflags,

__out CLSID *pCid

) override;

Параметры
riid

Ссылка на идентификатор интерфейса для маршалинга.

Pv

Указатель на интерфейс для маршалинга; может иметь значение NULL, если


вызывающий объект не имеет указателя на нужный интерфейс.

dwDestContext

Контекст назначения, в котором необходимо отменить удаление указанного


интерфейса.
Укажите одно или несколько значений перечисления MSHCTX.

Размежевание может происходить либо в другом объекте текущего процесса


(MSHCTX_INPROC), либо в другом процессе на том же компьютере, что и текущий
процесс (MSHCTX_LOCAL).

pvDestContext

Зарезервировано для использования в будущем; значение должно иметь значение


NULL.

mshlflags

После завершения этой операции наведите указатель на ИДЕНТИФИКАТОР CLSID,


который будет использоваться для создания прокси-сервера в клиентском
процессе.

pCid

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае S_FALSE.

FtmBase::MarshalInterface
Записывает в поток данные, необходимые для инициализации прокси-объекта в
некотором клиентском процессе.

C++

STDMETHODIMP MarshalInterface(

__in IStream *pStm,

__in REFIID riid,

__in_opt void *pv,

__in DWORD dwDestContext,

__reserved void *pvDestContext,

__in DWORD mshlflags

) override;

Параметры
pStm

Указатель на поток, используемый во время маршалинга.

riid

Ссылка на идентификатор интерфейса для маршалинга. Он должен быть


производным от интерфейса IUnknown .

Pv

Указатель на указатель интерфейса для маршалинга; может иметь значение NULL,


если вызывающий объект не имеет указателя на нужный интерфейс.

dwDestContext

Контекст назначения, в котором необходимо отменить удаление указанного


интерфейса.

Укажите одно или несколько значений перечисления MSHCTX.

Размежевание может происходить в другом объекте текущего процесса


(MSHCTX_INPROC) или в другом процессе на том же компьютере, что и текущий
процесс (MSHCTX_LOCAL).

pvDestContext

Зарезервировано для будущего использования; должно иметь значение нуль.

mshlflags

Указывает, должны ли данные для маршалинга передаваться обратно в клиентский


процесс (в типичном случае) или записываться в глобальную таблицу, где их могут
извлечь несколько клиентов.

Возвращаемое значение
S_OK. Указатель интерфейса успешно маршалирован.

E_NOINTERFACE Указанный интерфейс не поддерживается.

STG_E_MEDIUMFULL Поток заполнен.

E_FAIL. Операция завершилась сбоем.

FtmBase::marshaller_
Содержит ссылку на свободнопоточный маршалер.

C++

Microsoft::WRL::ComPtr<IMarshal> marshaller_; ;

FtmBase::ReleaseMarshalData
Уничтожает маршалированные пакеты данных.

C++

STDMETHODIMP ReleaseMarshalData(

__in IStream *pStm

) override;

Параметры
pStm

Указатель на поток, содержащий пакет данных, который требуется уничтожить.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

FtmBase::UnmarshalInterface
Инициализирует созданный прокси-сервер и возвращает указатель интерфейса на
этот прокси-сервер.

C++

STDMETHODIMP UnmarshalInterface(

__in IStream *pStm,

__in REFIID riid,

__deref_out void **ppv

) override;

Параметры
pStm

Указатель на поток, из которого должен быть удален указатель интерфейса.

riid

Ссылка на идентификатор интерфейса для отмены привязки.

Ppv

После завершения этой операции — адрес переменной указателя, которая


получает указатель интерфейса, запрошенный в riid. Если эта операция выполнена
успешно, *ppv содержит запрошенный указатель интерфейса для отмены удаления.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае E_NOINTERFACE или
E_FAIL.
Функция GetModuleBase
Статья • 03.04.2023

Извлекает указатель ModuleBase , который позволяет увеличивать и уменьшать


количество ссылок объекта RuntimeClass .

Синтаксис
C++

inline Details::ModuleBase* GetModuleBase() throw()

Возвращаемое значение
Указатель на объект ModuleBase .

Комментарии
Эта внутренняя функция используется для увеличения и уменьшения числа ссылок
объекта.

Эту функцию можно использовать для управления счетчиками ссылок, вызывая


ModuleBase::IncrementObjectCount и ModuleBase::D ecrementObjectCount.

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
Implements - структура
Статья • 03.04.2023

QueryInterface Реализует и GetIid для указанных интерфейсов.

Синтаксис
C++

template <

typename I0,

typename I1 = Details::Nil,

typename I2 = Details::Nil,

typename I3 = Details::Nil,

typename I4 = Details::Nil,

typename I5 = Details::Nil,

typename I6 = Details::Nil,

typename I7 = Details::Nil,

typename I8 = Details::Nil,

typename I9 = Details::Nil

>

struct __declspec(novtable) Implements :

Details::ImplementsHelper<

RuntimeClassFlags<WinRt>,
typename Details::InterfaceListHelper<

I0, I1, I2, I3, I4, I5, I6, I7, I8, I9

>::TypeT

>,

Details::ImplementsBase;

template <

int flags,

typename I0,

typename I1,

typename I2,

typename I3,

typename I4,

typename I5,

typename I6,

typename I7,

typename I8

>

struct __declspec(novtable) Implements<

RuntimeClassFlags<flags>,
I0, I1, I2, I3, I4, I5, I6, I7, I8> :

Details::ImplementsHelper<

RuntimeClassFlags<flags>,
typename Details::InterfaceListHelper<

I0, I1, I2, I3, I4, I5, I6, I7, I8

>::TypeT

>,

Details::ImplementsBase;

Параметры
I0

Нулевой идентификатор интерфейса. (обязательный параметр)

I1

Первый идентификатор интерфейса. (необязательно)

I2

Второй идентификатор интерфейса. (необязательно)

I3

Третий идентификатор интерфейса. (необязательно)

I4

Четвертый идентификатор интерфейса. (необязательно)

I5

Пятый идентификатор интерфейса. (необязательно)

I6

Шестой идентификатор интерфейса. (необязательно)

I7

Седьмой идентификатор интерфейса. (необязательно)

I8

Восьмой идентификатор интерфейса. (необязательно)

I9

Девятый идентификатор интерфейса. (необязательно)

flags

Флаги конфигурации для класса . Одно или несколько перечислений


RuntimeClassType , указанных в структуре RuntimeClassFlags .

Комментарии
Наследуется от списка указанных интерфейсов и реализует вспомогательные
шаблоны для QueryInterface и GetIid .
Каждый параметр интерфейса I0 – I9 должен быть производным от IUnknown ,
IInspectable или от шаблона ChainInterfaces . Параметр flags определяет, создается
ли поддержка для IUnknown или IInspectable .

Элементы

Общедоступные определения типов

Имя Описание

ClassFlags Синоним для RuntimeClassFlags<WinRt> .

Защищенные методы

Имя Описание

Реализует::CanCastTo Возвращает указатель на указанный интерфейс.

Реализует::CastToUnknown Возвращает указатель на базовый IUnknown интерфейс.

Реализует::FillArrayWithIid Вставляет идентификатор интерфейса, заданный текущим


параметром нулевого шаблона, в указанный элемент массива.

Защищенные константы

Имя Описание

Реализует::IidCount Содержит количество идентификаторов реализованных интерфейсов.

Иерархия наследования
I0

ChainInterfaces

I0

ImplementsBase

ImplementsHelper
Implements

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

Реализует::CanCastTo
Возвращает указатель на указанный интерфейс.

C++

__forceinline HRESULT CanCastTo(

REFIID riid,

_Deref_out_ void **ppv

);

Параметры
riid

Ссылка на идентификатор интерфейса.

Ppv

В случае успешного выполнения — указатель на интерфейс, заданный riid.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — HRESULT,
указывающее на ошибку, например E_NOINTERFACE.

Комментарии
Это внутренняя вспомогающая функция, которая выполняет операцию
QueryInterface.

Реализует::CastToUnknown
Возвращает указатель на базовый IUnknown интерфейс.
C++

__forceinline IUnknown* CastToUnknown();

Возвращаемое значение
Эта операция всегда выполняется успешно и возвращает IUnknown указатель.

Комментарии
Внутренняя вспомогательная функция.

Реализует::FillArrayWithIid
Вставляет идентификатор интерфейса, заданный текущим параметром нулевого
шаблона, в указанный элемент массива.

C++

__forceinline static void FillArrayWithIid(

unsigned long &index,

_In_ IID* iids

);

Параметры
index

Отсчитываемый от нуля индекс, указывающий начальный элемент массива для


этой операции. После завершения этой операции индекс увеличивается на 1.

iids

Массив типа IID.

Комментарии
Внутренняя вспомогательная функция.

Реализует::IidCount
Содержит количество идентификаторов реализованных интерфейсов.
C++

static const unsigned long IidCount;

Макрос InspectableClass
Статья • 03.04.2023

Задает имя класса среды выполнения и уровень доверия.

Синтаксис
C++

InspectableClass(

runtimeClassName,

trustLevel)

Параметры
runtimeClassName

Полное текстовое имя класса среды выполнения.

trustLevel

Одно из перечисленных значений TrustLevel .

Комментарии
Макрос InspectableClass можно использовать только с среда выполнения Windows
типами.

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

См. также раздел


Класс RuntimeClass
Структура InvokeModeOptions
Статья • 03.04.2023

Указывает, следует ли запускать все события в очереди делегатов или прекратить


срабатывание после возникновения ошибки. Допустимые значения указываются в
перечислении InvokeMode .

Синтаксис
C++

enum InvokeMode

StopOnFirstError = 1,

FireAll = 2,

};

struct InvokeModeOptions

static const InvokeMode invokeMode = invokeModeValue;


};

Требования
Заголовок: event.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL

Класс Microsoft::WRL::AgileEventSource
Функция Make
Статья • 03.04.2023

Инициализирует указанный класс среда выполнения Windows. Используйте эту


функцию, чтобы создать экземпляр компонента, который определен в том же
модуле.

Синтаксис
C++

template <

typename T,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6,

typename TArg7,

typename TArg8,

typename TArg9

>

ComPtr<T> Make(

TArg1 &&arg1,

TArg2 &&arg2,

TArg3 &&arg3,

TArg4 &&arg4,

TArg5 &&arg5,

TArg6 &&arg6,

TArg7 &&arg7,

TArg8 &&arg8,

TArg9 &&arg9

);

template <

typename T,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6,

typename TArg7,

typename TArg8

>

ComPtr<T> Make(

TArg1 &&arg1,

TArg2 &&arg2,

TArg3 &&arg3,

TArg4 &&arg4,

TArg5 &&arg5,

TArg6 &&arg6,

TArg7 &&arg7,

TArg8 &&arg8

);

template <

typename T,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6,

typename TArg7

>

ComPtr<T> Make(

TArg1 &&arg1,

TArg2 &&arg2,

TArg3 &&arg3,

TArg4 &&arg4,

TArg5 &&arg5,

TArg6 &&arg6,

TArg7 &&arg7

);

template <

typename T,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6

>

ComPtr<T> Make(

TArg1 &&arg1,

TArg2 &&arg2,

TArg3 &&arg3,

TArg4 &&arg4,

TArg5 &&arg5,

TArg6 &&arg6

);

template <

typename T,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5

>

ComPtr<T> Make(

TArg1 &&arg1,

TArg2 &&arg2,

TArg3 &&arg3,

TArg4 &&arg4,

TArg5 &&arg5

);

template <

typename T,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4

>

ComPtr<T> Make(

TArg1 &&arg1,

TArg2 &&arg2,

TArg3 &&arg3,

TArg4 &&arg4

);

template <

typename T,

typename TArg1,

typename TArg2,

typename TArg3

>

ComPtr<T> Make(

TArg1 &&arg1,

TArg2 &&arg2,

TArg3 &&arg3

);

template <

typename T,

typename TArg1,

typename TArg2

>

ComPtr<T> Make(

TArg1 &&arg1,

TArg2 &&arg2

);

template <

typename T,

typename TArg1

>

ComPtr<T> Make(

TArg1 &&arg1

);

template <

typename T

>

ComPtr<T> Make();

Параметры
T

Определяемый пользователем класс, наследуемый от WRL::RuntimeClass .


TArg1

Тип аргумента 1, который передается указанному классу среды выполнения.

TArg2

Тип аргумента 2, передаваемого указанному классу среды выполнения.

TArg3

Тип аргумента 3, передаваемого указанному классу среды выполнения.

TArg4

Тип аргумента 4, который передается указанному классу среды выполнения.

TArg5

Тип аргумента 5, передаваемого в указанный класс среды выполнения.

TArg6

Тип аргумента 6, который передается указанному классу среды выполнения.

TArg7

Тип аргумента 7, который передается указанному классу среды выполнения.

TArg8

Тип аргумента 8, который передается указанному классу среды выполнения.

TArg9

Тип аргумента 9, который передается в указанный класс среды выполнения.

arg1

Аргумент 1, передаваемый указанному классу среды выполнения.

arg2

Аргумент 2, передаваемый указанному классу среды выполнения.

arg3

Аргумент 3, передаваемый указанному классу среды выполнения.

arg4

Аргумент 4, передаваемый указанному классу среды выполнения.

arg5

Аргумент 5, передаваемый указанному классу среды выполнения.

arg6

Аргумент 6, передаваемый указанному классу среды выполнения.


arg7

Аргумент 7, передаваемый указанному классу среды выполнения.

arg8

Аргумент 8, передаваемый указанному классу среды выполнения.

arg9

Аргумент 9, передаваемый указанному классу среды выполнения.

Возвращаемое значение
Объект ComPtr<T> в случае успешного завершения операции; в противном
случае — значение nullptr .

Комментарии
Дополнительные сведения о различиях между этой функцией и Microsoft::WRL::D
etails::MakeAndInitialize см. в разделе Практическое руководство.

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
MixIn - структура
Статья • 03.04.2023

Гарантирует, что класс среды выполнения является производным от интерфейсов


среды выполнения Windows, если таковые имеются, а затем от интерфейсов
классической модели COM.

Синтаксис
C++

template<

typename Derived,

typename MixInType,

bool hasImplements = __is_base_of(Details::ImplementsBase, MixInType)

>

struct MixIn;

Параметры
Производный

Тип, производный от структуры Implements .

MixInType

Базовый тип.

hasImplements

true Значение , если MixInType является производным от текущей реализации


базового типа; false Иначе.

Комментарии
Если класс является производным от среда выполнения Windows и COM-
интерфейсов класса, в списке объявлений классов сначала должны быть
перечислены все среда выполнения Windows интерфейсы, а затем все
классические COM-интерфейсы. MixIn гарантирует, что интерфейсы указаны в
правильном порядке.

Иерархия наследования
MixIn

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
Module - класс
Статья • 03.04.2023

Представляет коллекцию связанных объектов.

Синтаксис
C++

template<ModuleType moduleType>

class Module;

template<>

class Module<InProc> : public Details::ModuleBase;

template<>

class Module<OutOfProc> : public Module<InProc>;

Параметры
moduleType

Сочетание одного или нескольких значений перечисления ModuleType .

Элементы

Защищенные классы

Имя Описание

Module::GenericReleaseNotifier Вызывает обработчик событий при освобождении


последнего объекта в текущем модуле. Обработчик
событий задается лямбда-выражением, функтором или
указателем на функцию.

Module::MethodReleaseNotifier Вызывает обработчик событий при освобождении


последнего объекта в текущем модуле. Обработчик
событий задается объектом и его элементом указателя на
метод.

Module::ReleaseNotifier Вызывает обработчик событий при освобождении


последнего объекта в модуле.
Открытые конструкторы

name Описание

Module::~Module Деинициализирует текущий Module экземпляр класса .

Защищенные конструкторы

Имя Описание

Module::Module Инициализирует новый экземпляр класса Module .

Открытые методы

name Описание

Module::Create Создает экземпляр модуля.

Module::D Уменьшает количество объектов, отслеживаемых модулем.


ecrementObjectCount

Module::GetActivationFactory Получает фабрику активации для модуля.

Module::GetClassObject Извлекает кэш фабрик классов.

Module::GetModule Создает экземпляр модуля.

Module::GetObjectCount Извлекает количество объектов, управляемых этим


модулем.

Module::IncrementObjectCount Увеличивает количество объектов, отслеживаемых


модулем.

Module::RegisterCOMObject Регистрирует один или несколько объектов модели COM,


чтобы другие приложения могли к ним подключиться.

Module::RegisterObjects Регистрирует ОБЪЕКТЫ COM или среда выполнения


Windows, чтобы к ним могли подключаться другие
приложения.

Module::RegisterWinRTObject Регистрирует один или несколько объектов среда


выполнения Windows, чтобы к ним могли подключаться
другие приложения.

Module::Terminate Приводит к завершению работы всех экземпляров фабрик,


созданных модулем.
name Описание

Module::UnregisterCOMObject Отменяет регистрацию одного или нескольких объектов


модели COM, что предотвращает подключение к ним
других приложений.

Module::UnregisterObjects Отменяет регистрацию объектов в указанном модуле.


Таким образом другие приложения не смогут
подключиться к ним.

Module::UnregisterWinRTObject Отменяет регистрацию одного или нескольких объектов


среда выполнения Windows, чтобы другие приложения не
подключались к ним.

Защищенные методы

Имя Описание

Module::Create Создает экземпляр модуля.

Защищенные члены данных

Имя Описание

Module::objectCount_ Отслеживает количество классов, созданных с помощью функции


Make .

Module::releaseNotifier_ Содержит указатель на ReleaseNotifier объект .

Макросы

Имя Описание

ActivatableClass Заполняет внутренний кэш, содержащий фабрику, которая


может создать экземпляр указанного класса. Этот макрос
задает параметры идентификатора фабрики и группы по
умолчанию.

ActivatableClassWithFactory Заполняет внутренний кэш, содержащий фабрику, которая


может создать экземпляр указанного класса. Этот макрос
позволяет указать конкретный параметр фабрики.
Имя Описание

ActivatableClassWithFactoryEx Заполняет внутренний кэш, содержащий фабрику, которая


может создать экземпляр указанного класса. Этот макрос
позволяет указать определенные параметры идентификатора
фабрики и группы.

Иерархия наследования
ModuleBase

Module

Module

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

Module::~Module
Деинициализирует текущий Module экземпляр класса .

C++

virtual ~Module();

Module::Create
Создает экземпляр модуля.

C++

WRL_NOTHROW static Module& Create();

template<typename T>

WRL_NOTHROW static Module& Create(

T callback

);

template<typename T>

WRL_NOTHROW static Module& Create(

_In_ T* object,

_In_ void (T::* method)()

);

Параметры
T

Тип модуля.

Обратного вызова

Вызывается при освобождении объекта последнего экземпляра модуля.

object

Параметры объекта и метода используются в сочетании. Указывает на объект


последнего экземпляра при освобождении объекта последнего экземпляра в
модуле.

method

Параметры объекта и метода используются в сочетании. Указывает на метод


объекта последнего экземпляра при освобождении объекта последнего
экземпляра в модуле.

Возвращаемое значение
Ссылка на модуль.

Module::D ecrementObjectCount
Уменьшает количество объектов, отслеживаемых модулем.

C++

virtual long DecrementObjectCount();

Возвращаемое значение
Счетчик перед операцией уменьшения.

Module::GetActivationFactory
Получает фабрику активации для модуля.
C++

WRL_NOTHROW HRESULT GetActivationFactory(

_In_ HSTRING pActivatibleClassId,

_Deref_out_ IActivationFactory **ppIFactory,

wchar_t* serverName = nullptr

);

Параметры
pActivatibleClassId

Представляет IID класса среды выполнения.

ppIFactory

Представляет интерфейс IActivationFactory указанного класса среды выполнения.

serverName

Имя подмножества фабрик класса в текущем модуле. Укажите имя сервера,


используемое в макросе ActivatableClassWithFactoryEx , или укажите nullptr ,
чтобы получить имя сервера по умолчанию.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, возвращаемое GetActivationFactory.

Module::GetClassObject
Извлекает кэш фабрик классов.

C++

HRESULT GetClassObject(

REFCLSID clsid,

REFIID riid,

_Deref_out_ void **ppv,

wchar_t* serverName = nullptr

);

Параметры
Clsid

Идентификатор класса.
riid

Запрошенный идентификатор интерфейса.

Ppv

Указатель на возвращаемый объект.

serverName

Имя сервера, указанное в макросе ActivatableClassWithFactory ,


ActivatableClassWithFactoryEx или ActivatableClass ; в противном случае —
значение nullptr для получения имени сервера по умолчанию.

Возвращаемое значение

Комментарии
Используйте этот метод только для COM, а не для среда выполнения Windows. Этот
метод предоставляет только IClassFactory методы.

Module::GetModule
Создает экземпляр модуля.

C++

static Module& GetModule();

WRL_NOTHROW static Module& GetModule();

Возвращаемое значение
Ссылка на модуль.

Module::GetObjectCount
Извлекает количество объектов, управляемых этим модулем.

C++

virtual long GetObjectCount() const;

Возвращаемое значение
Текущее количество объектов, управляемых этим модулем.

Module::IncrementObjectCount
Увеличивает количество объектов, отслеживаемых модулем.

C++

virtual long IncrementObjectCount();

Возвращаемое значение
Счетчик перед операцией приращения.

Module::Module
Инициализирует новый экземпляр класса Module .

C++

Module();

Комментарии
Этот конструктор является защищенным и не может быть вызван ключевым
словом new . Вместо этого вызовите Module::GetModule или Module::Create.

Module::objectCount_
Отслеживает количество классов, созданных с помощью функции Make .

C++

volatile long objectCount_;

Module::RegisterCOMObject
Регистрирует один или несколько объектов модели COM, чтобы другие
приложения могли к ним подключиться.
C++

WRL_NOTHROW virtual HRESULT RegisterCOMObject(

const wchar_t* serverName,

IID* clsids,

IClassFactory** factories,

DWORD* cookies,

unsigned int count);

Параметры
serverName

Полное имя сервера.

clsids

Массив регистрируемых идентификаторов CLSID.

factories

Массив интерфейсов IUnknown объектов класса, чья доступность публикуется.

Файлы cookie

После завершения операции представляет массив указателей на значения, которые


определяют зарегистрированные объекты класса. Эти значения в дальнейшем
используются для отмены регистрации.

count

Количество идентификаторов CLSID, которые необходимо зарегистрировать.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT (например, CO_E_OBJISREG), указывающее причину неудачного
завершения операции.

Комментарии
COM-объекты зарегистрированы с помощью перечислителя CLSCTX_LOCAL_SERVER
перечисления CLSCTX.

Тип соединения с зарегистрированными объектами определяется сочетанием


текущего параметра шаблона comflag и перечислителя REGCLS_SUSPENDED
перечисления REGCLS.
Module::RegisterObjects
Регистрирует ОБЪЕКТЫ COM или среда выполнения Windows, чтобы к ним могли
подключаться другие приложения.

C++

HRESULT RegisterObjects(

ModuleBase* module,

const wchar_t* serverName);

Параметры
Модуль

Массив объектов COM или среда выполнения Windows.

serverName

Имя сервера, который создал объекты.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее причину неудачного завершения операции.

Module::RegisterWinRTObject
Регистрирует один или несколько объектов среда выполнения Windows, чтобы к
ним могли подключаться другие приложения.

C++

HRESULT RegisterWinRTObject(const wchar_t* serverName,

wchar_t** activatableClassIds,

WINRT_REGISTRATION_COOKIE* cookie,

unsigned int count)

Параметры
serverName

Имя, которое определяет подмножество объектов, затронутых этой операцией.


activatableClassIds

Массив активируемых идентификаторов CLSID для регистрации.

Cookie

Значение, которое идентифицирует зарегистрированные объекты класса. Это


значение в дальнейшем используется для отмены регистрации.

count

Количество объектов, которое необходимо зарегистрировать.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT (например, CO_E_OBJISREG), указывающее причину неудачного
завершения операции.

Module::releaseNotifier_
Содержит указатель на ReleaseNotifier объект .

C++

ReleaseNotifier *releaseNotifier_;

Module::Terminate
Приводит к завершению работы всех экземпляров фабрик, созданных модулем.

C++

void Terminate();

Комментарии
Освобождает фабрики в кэше.

Module::UnregisterCOMObject
Отменяет регистрацию одного или нескольких объектов модели COM, что
предотвращает подключение к ним других приложений.
C++

virtual HRESULT UnregisterCOMObject(

const wchar_t* serverName,

DWORD* cookies,

unsigned int count

Параметры
serverName

(Не используется)

Файлы cookie

Массив указателей на значения, которые идентифицируют объекты класса для


отмены регистрации. Массив был создан методом RegisterCOMObject .

count

Количество классов для отмены регистрации.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее причину неудачного завершения операции.

Module::UnregisterObjects
Отменяет регистрацию объектов в указанном модуле. Таким образом другие
приложения не смогут подключиться к ним.

C++

HRESULT UnregisterObjects(

ModuleBase* module,

const wchar_t* serverName);

Параметры
Модуль

Указатель на модуль.

serverName

Представляет имя, которое определяет подмножество объектов, затронутых этой


операцией.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее причину неудачного завершения операции.

Module::UnregisterWinRTObject
Отменяет регистрацию одного или нескольких объектов среда выполнения
Windows, чтобы другие приложения не подключались к ним.

C++

virtual HRESULT UnregisterWinRTObject(

unsigned int,

_Inout_ WINRT_REGISTRATION_COOKIE* cookie

);

Параметры
Cookie

Указатель на значение, определяющее объект класса, регистрация которого


должна быть отменена.
Класс Module::GenericReleaseNotifier
Статья • 03.04.2023

Вызывает обработчик событий при освобождении последнего объекта в текущем модуле.


Обработчик событий задается лямбда-выражением, функтором или указателем на
функцию.

Синтаксис
C++

template<typename T>

class GenericReleaseNotifier : public ReleaseNotifier;

Параметры
T

Тип данных-члена, который содержит расположение обработчика событий.

Члены

Открытые конструкторы

name Описание

Module::GenericReleaseNotifier::GenericReleaseNotifier Инициализирует новый экземпляр класса


Module::GenericReleaseNotifier .

Открытые методы

name Описание

Module::GenericReleaseNotifier::Invoke Вызывает обработчик событий, связанный с текущим


Module::GenericReleaseNotifier объектом .

Защищенные члены данных

Имя Описание

Module::GenericReleaseNotifier::callback_ Содержит обработчик событий лямбда-выражения,


функтора или указателя на функцию, связанный с текущим
Module::GenericReleaseNotifier объектом.
Иерархия наследования
ReleaseNotifier

GenericReleaseNotifier

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

Module::GenericReleaseNotifier::callback_
Содержит обработчик событий лямбда-выражения, функтора или указателя на функцию,
связанный с текущим Module::GenericReleaseNotifier объектом.

C++

T callback_;

Module::GenericReleaseNotifier::GenericReleaseNotifier
Инициализирует новый экземпляр класса Module::GenericReleaseNotifier .

C++

GenericReleaseNotifier(

T callback,

bool release

) throw() : ReleaseNotifier(release), callback_(callback);

Параметры
Обратного вызова

Обработчик событий лямбда-выражения, функтора или указателя на функцию, который


можно вызвать с помощью оператора функции в скобках ( () ).

Выпуска

Укажите true , чтобы включить вызов базового метода Module::ReleaseNotifier::Release(); в


противном случае укажите false .

Module::GenericReleaseNotifier::Invoke
Вызывает обработчик событий, связанный с текущим Module::GenericReleaseNotifier
объектом .

C++

void Invoke();

Класс Module::MethodReleaseNotifier
Статья • 03.04.2023

Вызывает обработчик событий при освобождении последнего объекта в текущем модуле.


Обработчик событий задается объектом и его указателем на член метода.

Синтаксис
C++

template<typename T>

class MethodReleaseNotifier : public ReleaseNotifier;

Параметры
T

Тип объекта, функция-член которого является обработчиком событий.

Члены

Открытые конструкторы

name Описание

Module::MethodReleaseNotifier::MethodReleaseNotifier Инициализирует новый экземпляр класса


Module::MethodReleaseNotifier .

Открытые методы

name Описание

Module::MethodReleaseNotifier::Invoke Вызывает обработчик событий, связанный с текущим


Module::MethodReleaseNotifier объектом .

Защищенные члены данных

Имя Описание

Module::MethodReleaseNotifier::method_ Содержит указатель на обработчик событий для текущего


Module::MethodReleaseNotifier объекта.
Имя Описание

Module::MethodReleaseNotifier::object_ Содержит указатель на объект, функция-член которого


является обработчиком событий для текущего
Module::MethodReleaseNotifier объекта.

Иерархия наследования
ReleaseNotifier

MethodReleaseNotifier

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

Module::MethodReleaseNotifier::Invoke
Вызывает обработчик событий, связанный с текущим Module::MethodReleaseNotifier
объектом .

C++

void Invoke();

Module::MethodReleaseNotifier::method_
Содержит указатель на обработчик событий для текущего Module::MethodReleaseNotifier
объекта.

C++

void (T::* method_)();

Module::MethodReleaseNotifier::MethodReleaseNotifier
Инициализирует новый экземпляр класса Module::MethodReleaseNotifier .

C++

MethodReleaseNotifier(

_In_ T* object,

_In_ void (T::* method)(),

bool release) throw() :

ReleaseNotifier(release), object_(object),

method_(method);

Параметры
object

Объект, функция-член которого является обработчиком событий.

method

Функция-член объекта параметра, который является обработчиком событий.

Выпуска

Укажите true , чтобы включить вызов базового метода Module::ReleaseNotifier::Release(); в


противном случае укажите false .

Module::MethodReleaseNotifier::object_
Содержит указатель на объект, функция-член которого является обработчиком событий для
текущего Module::MethodReleaseNotifier объекта.

C++

T* object_;

Класс Module::ReleaseNotifier
Статья • 03.04.2023

Вызывает обработчик событий при освобождении последнего объекта в модуле.

Синтаксис
C++

class ReleaseNotifier;

Члены

Открытые конструкторы

name Описание

Module::ReleaseNotifier::~ReleaseNotifier Деинициализирует текущий


Module::ReleaseNotifier экземпляр класса .

Module::ReleaseNotifier::ReleaseNotifier Инициализирует новый экземпляр класса


Module::ReleaseNotifier .

Открытые методы

name Описание

Module::ReleaseNotifier::Invoke При реализации вызывает обработчик событий при


освобождении последнего объекта в модуле.

Module::ReleaseNotifier::Release Удаляет текущий Module::ReleaseNotifier объект , если


объект был создан с параметром true .

Иерархия наследования
ReleaseNotifier

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

Module::ReleaseNotifier::~ReleaseNotifier
Деинициализирует текущий Module::ReleaseNotifier экземпляр класса .

C++

WRL_NOTHROW virtual ~ReleaseNotifier();

Module::ReleaseNotifier::Invoke
При реализации вызывает обработчик событий при освобождении последнего
объекта в модуле.

C++

virtual void Invoke() = 0;

Module::ReleaseNotifier::Release
Удаляет текущий Module::ReleaseNotifier объект , если объект был создан с
параметром true .

C++

void Release() throw();

Module::ReleaseNotifier::ReleaseNotifier
Инициализирует новый экземпляр класса Module::ReleaseNotifier .

C++

ReleaseNotifier(bool release) throw();

Параметры
Выпуска

true Значение , чтобы удалить этот экземпляр при вызове Release метода; false
значение , чтобы не удалять этот экземпляр.
ModuleType - перечисление
Статья • 03.04.2023

Указывает, должен ли модуль поддерживать внутрипроцессный или


внепроцессный сервер.

Синтаксис
C++

enum ModuleType;

Участники

Значения

Имя Описание

InProc Внутрипроцессный сервер.

OutOfProc Внепроцессный сервер.

DisableCaching Отключите механизм кэширования в модуле.

InProcDisableCaching Сочетание и InProc DisableCaching .

OutOfProcDisableCaching Сочетание и OutOfProc DisableCaching .

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
Оператор operator!= (Microsoft::WRL)
Статья • 03.04.2023

Оператор неравенства для объектов ComPtr и ComPtrRef .

Синтаксис
C++

WRL_NOTHROW bool operator!=(

const ComPtr<T>& a,

const ComPtr<U>& b

);

WRL_NOTHROW bool operator!=(

const ComPtr<T>& a,

decltype(__nullptr)

);

WRL_NOTHROW bool operator!=(

decltype(__nullptr),

const ComPtr<T>& a

);

WRL_NOTHROW bool operator!=(

const Details::ComPtrRef<ComPtr<T>>& a,

const Details::ComPtrRef<ComPtr<U>>& b

);

WRL_NOTHROW bool operator!=(

const Details::ComPtrRef<ComPtr<T>>& a,

decltype(__nullptr)

);

WRL_NOTHROW bool operator!=(

decltype(__nullptr),

const Details::ComPtrRef<ComPtr<T>>& a

);

WRL_NOTHROW bool operator!=(

const Details::ComPtrRef<ComPtr<T>>& a,

void* b

);

WRL_NOTHROW bool operator!=(

void* b,

const Details::ComPtrRef<ComPtr<T>>& a

);

Параметры
a

Левый объект.
b

Правый объект.

Возвращаемое значение
true , если объекты не равны, иначе false .

Требования
Заголовок: client.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
Оператор operator== (Microsoft::WRL)
Статья • 03.04.2023

Оператор равенства для объектов ComPtr и ComPtrRef .

Синтаксис
C++

WRL_NOTHROW bool operator==(

const ComPtr<T>& a,

const ComPtr<U>& b

);

WRL_NOTHROW bool operator==(

const ComPtr<T>& a,

decltype(__nullptr)

);

WRL_NOTHROW bool operator==(

decltype(__nullptr),

const ComPtr<T>& a

);

WRL_NOTHROW bool operator==(

const Details::ComPtrRef<ComPtr<T>>& a,

const Details::ComPtrRef<ComPtr<U>>& b

);

WRL_NOTHROW bool operator==(

const Details::ComPtrRef<ComPtr<T>>& a,

decltype(__nullptr)

);

WRL_NOTHROW bool operator==(

decltype(__nullptr),

const Details::ComPtrRef<ComPtr<T>>& a

);

WRL_NOTHROW bool operator==(

const Details::ComPtrRef<ComPtr<T>>& a,

void* b

);

WRL_NOTHROW bool operator==(

void* b,

const Details::ComPtrRef<ComPtr<T>>& a

);

Параметры
a

Левый объект.
b

Правый объект.

Возвращаемое значение
Значение true , если объекты равны, в противном случае — значение false .

Требования
Заголовок: client.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
operator< Оператор (Microsoft::WRL)
Статья • 03.04.2023

Определяет, меньше ли адрес одного объекта, чем адрес другого.

Синтаксис
C++

template<class T, class U>

bool operator<(const ComPtr<T>& a, const ComPtr<U>& b) throw();

template<class T, class U>

bool operator<(const Details::ComPtrRef<ComPtr<T>>& a, const


Details::ComPtrRef<ComPtr<U>>& b) throw();

Параметры
a

Левый объект.

Правый объект.

Возвращаемое значение
true значение , если адрес меньше адреса b; в противном случае — false .

Требования
Заголовок: client.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
Класс RuntimeClass
Статья • 03.04.2023

Представляет класс WinRT или COM, который наследует указанные интерфейсы и


предоставляет указанные среда выполнения Windows, классическую поддержку
COM и слабую поддержку ссылок.

Этот класс предоставляет стандартные реализации классов WinRT и COM,


предоставляя реализацию QueryInterface , AddRef Release и т. д., управляет
счетчиком ссылок модуля и поддерживает предоставление фабрики классов для
активируемых объектов.

Синтаксис
C++

template <typename ...TInterfaces> class RuntimeClass

template <unsigned int classFlags, typename ...TInterfaces> class


RuntimeClass;

Параметры
classFlags

Необязательный параметр. Сочетание одного или нескольких RuntimeClassType


значений перечисления. Макрос __WRL_CONFIGURATION_LEGACY__ можно определить,
чтобы изменить значение classFlags по умолчанию для всех классов среды
выполнения в проекте. Если они определены, RuntimeClass экземпляры по
умолчанию не являются гибкими. Если они не определены, RuntimeClass
экземпляры по умолчанию являются гибкими. Чтобы избежать неоднозначности,
всегда указывайте вход Microsoft::WRL::FtmBase TInterfaces или
RuntimeClassType::InhibitFtmBase . Если InhibitFtmBase и FtmBase оба используются,

объект будет гибким.

TInterfaces

Список интерфейсов, которые объект реализует за пределами IUnknown или другие


интерфейсы, IInspectable управляемые RuntimeClassType. Кроме того, он может
выводить список других классов, которые должны быть производными, в частности
Microsoft::WRL::FtmBase , для того, чтобы сделать объект гибким и привести его к
реализации IMarshal .
Элементы
RuntimeClassInitialize

Функция, которая инициализирует объект, если MakeAndInitialize шаблон функции


используется для создания объекта. Возвращается S_OK , если объект был успешно
инициализирован, или код ошибки COM, если инициализация завершилась сбоем.
Код ошибки COM распространяется как возвращаемое значение MakeAndInitialize .
Метод RuntimeClassInitialize не вызывается, если Make шаблон функции
используется для создания объекта.

Открытые конструкторы

name Описание

RuntimeClass::RuntimeClass Инициализирует текущий RuntimeClass экземпляр класса.

RuntimeClass::~RuntimeClass Деинициализирует текущий RuntimeClass экземпляр класса.

Открытые методы

name Описание

RuntimeClass::AddRef Увеличивает число ссылок для текущего RuntimeClass


объекта.

RuntimeClass::DecrementReference Уменьшает количество ссылок для текущего


RuntimeClass объекта.

RuntimeClass::GetIids Возвращает массив, который может содержать


идентификаторы интерфейса, реализованные текущим
RuntimeClass объектом.

RuntimeClass::GetRuntimeClassName Возвращает имя класса среды выполнения текущего


RuntimeClass объекта.

RuntimeClass::GetTrustLevel Возвращает уровень доверия текущего RuntimeClass


объекта.

RuntimeClass::GetWeakReference Возвращает указатель на слабый ссылочный объект


для текущего RuntimeClass объекта.

RuntimeClass::InternalAddRef Увеличивает число ссылок к текущему RuntimeClass


объекту.
name Описание

RuntimeClass::QueryInterface Извлекает указатель на указанный идентификатор


интерфейса.

RuntimeClass::Release Выполняет операцию выпуска COM для текущего


RuntimeClass объекта.

Иерархия наследования
Иерархия — это сведения о реализации.

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

RuntimeClass::~RuntimeClass
Деинициализирует текущий RuntimeClass экземпляр класса.

C++

virtual ~RuntimeClass();

RuntimeClass::AddRef
Увеличивает число ссылок для текущего RuntimeClass объекта.

C++

STDMETHOD_(

ULONG,

AddRef

)();

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — значение HRESULT ,
указывающее на ошибку.
RuntimeClass::DecrementReference
Уменьшает количество ссылок для текущего RuntimeClass объекта.

C++

ULONG DecrementReference();

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — значение HRESULT ,

указывающее на ошибку.

RuntimeClass::GetIids
Возвращает массив, который может содержать идентификаторы интерфейса,
реализованные текущим RuntimeClass объектом.

C++

STDMETHOD(

GetIids

(_Out_ ULONG *iidCount,

_Deref_out_ _Deref_post_cap_(*iidCount) IID **iids);

Параметры
iidCount

По завершении этой операции общее количество элементов в массиве iids .

iids

После завершения операции представляет указатель на массив идентификаторов


интерфейса.

Возвращаемое значение
Значение S_OK в случае успешного выполнения; в противном случае — значение
E_OUTOFMEMORY .
RuntimeClass::GetRuntimeClassName
Возвращает имя класса среды выполнения текущего RuntimeClass объекта.

C++

STDMETHOD( GetRuntimeClassName )(
_Out_ HSTRING* runtimeName

);

Параметры
runtimeName

После завершения операции представляет имя класса среды выполнения.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — значение HRESULT ,

указывающее на ошибку.

Комментарии
Если или __WRL_FORCE_INSPECTABLE_CLASS_MACRO__ не определена ошибка
утверждения, возникает __WRL_STRICT__ ошибка утверждения.

RuntimeClass::GetTrustLevel
Возвращает уровень доверия текущего RuntimeClass объекта.

C++

STDMETHOD(GetTrustLevel)(

_Out_ TrustLevel* trustLvl

);

Параметры
trustLvl

По завершении этой операции уровень доверия текущего RuntimeClass объекта.


Возвращаемое значение
Всегда S_OK .

Комментарии
Если или __WRL_FORCE_INSPECTABLE_CLASS_MACRO__ не определена ошибка
утверждения, возникает __WRL_STRICT__ ошибка утверждения.

RuntimeClass::GetWeakReference
Возвращает указатель на слабый ссылочный объект для текущего RuntimeClass
объекта.

C++

STDMETHOD(

GetWeakReference

)(_Deref_out_ IWeakReference **weakReference);

Параметры
weakReference

После завершения операции представляет указатель на объект слабой ссылки.

Возвращаемое значение
Всегда S_OK .

RuntimeClass::InternalAddRef
Увеличивает число ссылок к текущему RuntimeClass объекту.

C++

ULONG InternalAddRef();

Возвращаемое значение
Результирующее число ссылок.
RuntimeClass::QueryInterface
Извлекает указатель на указанный идентификатор интерфейса.

C++

STDMETHOD(

QueryInterface

(REFIID riid,

_Deref_out_ void **ppvObject);

Параметры
riid

Идентификатор интерфейса.

ppvObject

По завершении этой операции указатель на интерфейс, указанный параметром


riid .

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — значение HRESULT ,

указывающее на ошибку.

RuntimeClass::Release
Выполняет операцию выпуска COM для текущего RuntimeClass объекта.

C++

STDMETHOD_(

ULONG,

Release

)();

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — значение HRESULT ,
указывающее на ошибку.
Комментарии
Если число ссылок становится нулевым, RuntimeClass объект удаляется.

RuntimeClass::RuntimeClass
Инициализирует текущий RuntimeClass экземпляр класса.

C++

RuntimeClass();

RuntimeClassFlags - структура
Статья • 03.04.2023

Содержит тип для экземпляра RuntimeClass.

Синтаксис
C++

template <unsigned int flags>

struct RuntimeClassFlags;

Параметры
flags

Значение перечисления RuntimeClassType .

Элементы

Открытые константы

Имя Описание

Константа RuntimeClassFlags::value Содержит значение перечисления RuntimeClassType .

Иерархия наследования
RuntimeClassFlags

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

Константа RuntimeClassFlags::value
Поле, содержащее значение перечисления RuntimeClassType .

C++

static const unsigned int value = flags;

RuntimeClassType - перечисление
Статья • 03.04.2023

Указывает поддерживаемый тип экземпляра RuntimeClass .

Синтаксис
C++

enum RuntimeClassType;

Участники

Значения

Имя Описание

ClassicCom Классический класс среды выполнения COM.

Delegate Эквивалент ClassicCom .

InhibitFtmBase Отключает FtmBase поддержку, пока __WRL_CONFIGURATION_LEGACY__ не


определен.

InhibitWeakReference Отключает поддержку слабых ссылок.

WinRt Класс среда выполнения Windows.

WinRtClassicComMix Комбинация WinRt  и ClassicCom .

Требования
Заголовок: implements.h

Пространство имен: Microsoft::WRL

См. также раздел


Пространство имен Microsoft::WRL
SimpleActivationFactory - класс
Статья • 03.04.2023

Предоставляет основной механизм для создания базового класса среды


выполнения Windows или классической модели COM.

Синтаксис
C++

template<typename Base>

class SimpleActivationFactory : public ActivationFactory<>;

Параметры
Базы

Базовый класс.

Комментарии
Базовый класс должен предоставлять конструктор по умолчанию.

В следующем примере кода показано, как использовать SimpleActivationFactory с


макросом ActivateableClassWithFactoryEx .

ActivatableClassWithFactoryEx(MyClass, SimpleActivationFactory, MyServerName);

Элементы

Открытые методы

name Описание

Метод Создает экземпляр указанного интерфейса.


SimpleActivationFactory::ActivateInstance

Метод Возвращает имя класса среды выполнения


SimpleActivationFactory::GetRuntimeClassName экземпляра класса, указанного параметром
шаблона базового класса.
name Описание

Метод SimpleActivationFactory::GetTrustLevel Возвращает уровень доверия экземпляра


класса, указанного параметром шаблона
базового класса.

Иерархия наследования
I0

ChainInterfaces

I0

RuntimeClassBase

ImplementsHelper

DontUseNewUseMake

RuntimeClassFlags

RuntimeClassBaseT

RuntimeClass

ActivationFactory

SimpleActivationFactory

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

Метод
SimpleActivationFactory::ActivateInstance
Создает экземпляр указанного интерфейса.

C++
STDMETHOD( ActivateInstance )(

_Deref_out_ IInspectable **ppvObject

);

Параметры
ppvObject

После завершения этой операции указатель на экземпляр объекта, указанного


параметром Base шаблона класса.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

Комментарии
Если __WRL_STRICT__ параметр определен, возникает ошибка утверждения, если
базовый класс, указанный в параметре шаблона класса, не является производным
от RuntimeClass или не настроен со значением перечисления WinRt или
WinRtClassicComMix RuntimeClassType .

Метод
SimpleActivationFactory::GetRuntimeClassName
Получает имя класса среды выполнения экземпляра класса, указанного в
параметре шаблона класса Base .

C++

STDMETHOD( GetRuntimeClassName )(
_Out_ HSTRING* runtimeName

);

Параметры
runtimeName

После завершения операции представляет имя класса среды выполнения.


Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

Комментарии
Если __WRL_STRICT__ параметр определен, ошибка утверждения возникает, если
класс, указанный параметром шаблона класса, не является производным Base от
RuntimeClass или не настроен со значением перечисления WinRt или
WinRtClassicComMix RuntimeClassType .

Метод SimpleActivationFactory::GetTrustLevel
Возвращает уровень доверия экземпляра класса, заданного параметром Base
шаблона класса.

C++

STDMETHOD(

GetTrustLevel

)(_Out_ TrustLevel* trustLvl);

Параметры
trustLvl

После завершения этой операции уровень доверия текущего объекта класса.

Возвращаемое значение
Всегда S_OK.
SimpleClassFactory - класс
Статья • 03.04.2023

Предоставляет основной механизм для создания базового класса.

Синтаксис
C++

template<typename Base>

class SimpleClassFactory : public ClassFactory<>;

Параметры
Базы

Базовый класс.

Комментарии
Базовый класс должен предоставлять конструктор по умолчанию.

В следующем примере кода показано, как использовать SimpleClassFactory макрос


ActivatableClassWithFactoryEx .

ActivatableClassWithFactoryEx(MyClass, SimpleClassFactory, MyServerName);

Элементы

Открытые методы

name Описание

Метод SimpleClassFactory::CreateInstance Создает экземпляр указанного интерфейса.

Иерархия наследования
I0
ChainInterfaces

I0

RuntimeClassBase

ImplementsHelper

DontUseNewUseMake

RuntimeClassFlags

RuntimeClassBaseT

RuntimeClass

ClassFactory

SimpleClassFactory

Требования
Заголовок: module.h

Пространство имен: Microsoft::WRL

Метод SimpleClassFactory::CreateInstance
Создает экземпляр указанного интерфейса.

C++

STDMETHOD( CreateInstance )(

_Inout_opt_ IUnknown* pUnkOuter,

REFIID riid,

_Deref_out_ void** ppvObject

);

Параметры
pUnkOuter

Должно быть nullptr ; в противном случае возвращается значение


CLASS_E_NOAGGREGATION.
SimpleClassFactory не поддерживает агрегирование. Если статистическая обработка
поддерживается, а создаваемый объект является частью агрегата, pUnkOuter будет
указателем на управляющий IUnknown интерфейс агрегата.

riid

Идентификатор интерфейса объекта, который требуется создать.

ppvObject

После завершения этой операции указатель на экземпляр объекта, указанного


параметром riid .

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

Комментарии
Если __WRL_STRICT__ параметр определен, возникает ошибка утверждения, если
базовый класс, указанный в параметре шаблона класса, не является производным
от RuntimeClass или не настроен со значением перечисления ClassicCom или
WinRtClassicComMix RuntimeClassType .
Класс WeakRef
Статья • 17.10.2022

Представляет собой слабую ссылку , которая может использоваться только в среде


выполнения Windows, а не в классической модели COM. Слабая ссылка
представляет собой объект, который может быть доступен или недоступен.

Синтаксис
C++

class WeakRef : public ComPtr<IWeakReference>;

Члены

Открытые конструкторы

Имя Описание

WeakRef::WeakRef Инициализирует новый экземпляр класса WeakRef .


Конструктор

WeakRef::~WeakRef Выполняет деинициализацию текущего экземпляра WeakRef


использовал класса.

Открытые методы

Имя Описание

WeakRef::As Задает указанный ComPtr параметр указателя для представления


указанного интерфейса.

WeakRef::AsIID Задает указанный ComPtr параметр указателя для представления


УКАЗАННОГО идентификатора интерфейса.

WeakRef::CopyTo Присваивает указатель на интерфейс (при его наличии) указанной


переменной указателя.

Открытые операторы
Название Описание

WeakRef::operator& ComPtrRef Возвращает объект, представляющий текущий WeakRef


объект.

Примечания
WeakRef Объект поддерживает строгую ссылку, которая связана с объектом и

может быть допустимой или недопустимой. Чтобы получить строгую ссылку, As()
вызовите метод или AsIID() . Когда строгая ссылка допустима, возможно
обращение к связанному объекту. Когда строгая ссылка недопустима ( nullptr ),
связанный объект недоступен.

WeakRef Объект обычно используется для представления объекта, существование


которого управляется внешним потоком или приложением. Например, создайте
WeakRef объект из ссылки на файловый объект. Пока открыт файл, строгая ссылка

является действительной. Но если закрыть файл, строгая ссылка станет


недействительной.

существуют изменения в As работе методов, AsIID и CopyTo в Windows SDK. Ранее


после вызова любого из этих методов можно было проверить WeakRef nullptr ,
чтобы определить, успешно ли получена строгая ссылка, как в следующем коде:

C++

WeakRef wr;

strongComptrRef.AsWeak(&wr);

// Now suppose that the object strongComPtrRef points to no longer exists

// and the following code tries to get a strong ref from the weak ref:

ComPtr<ISomeInterface> strongRef;
HRESULT hr = wr.As(&strongRef);

// This check won't work with the Windows 10 SDK version of the library.

// Check the input pointer instead.

if(wr == nullptr)

wprintf(L"Couldn't get strong ref!");

приведенный выше код не работает при использовании пакета SDK для Windows
10 (или более поздней версии). Вместо этого проверьте указатель, переданный в
параметре nullptr .
C++

if (strongRef == nullptr)

wprintf(L"Couldn't get strong ref!");

Иерархия наследования
ComPtr
 └ WeakRef

Requirements (Требования)
Заголовок client.h

Имен Microsoft::WRL

Конструктор WeakRef::WeakRef
Инициализирует новый экземпляр класса WeakRef .

C++

WeakRef();

WeakRef(

decltype(__nullptr)

);

WeakRef(

_In_opt_ IWeakReference* ptr

);

WeakRef(

const ComPtr<IWeakReference>& ptr

);

WeakRef(

const WeakRef& ptr

);

WeakRef(

_Inout_ WeakRef&& ptr

);

Параметры
ptr

Указатель, ссылка или rvalue-ссылка на существующий объект, который


инициализирует текущий WeakRef объект.

Примечания
Первый конструктор инициализирует пустой WeakRef объект. Второй конструктор
инициализирует WeakRef объект из указателя на IWeakReference интерфейс. Третий
конструктор инициализирует WeakRef объект из ссылки на ComPtr<IWeakReference>
объект. Четвертый и пятый конструкторы инициализируют WeakRef объект из
другого WeakRef объекта.

WeakRef::~WeakRef использовал
Выполняет деинициализацию текущего экземпляра WeakRef класса.

C++

~WeakRef();

WeakRef::As
Задает указанный ComPtr параметр указателя для представления указанного
интерфейса.

C++

template<typename U>

HRESULT As(

_Out_ ComPtr<U>* ptr

);

template<typename U>

HRESULT As(

_Out_ Details::ComPtrRef<ComPtr<U>> ptr

);

Параметры
U

Идентификатор интерфейса.

ptr

По завершении этой операции объект, представляющий параметр U.

Возвращаемое значение
S_OK значение, если эта операция завершилась с ошибкой; в противном

случае возвращается значение HRESULT, указывающее на причину сбоя


операции, и ptr устанавливается в nullptr значение.

S_OK Если эта операция завершилась успешно, но текущий WeakRef объект

уже был освобожден. Параметр ptr устанавливается в значение nullptr .

S_OK Если эта операция выполняется, но текущий WeakRef объект не является

производным от параметра U . Параметр ptr устанавливается в значение


nullptr .

Примечания
Если параметр U имеет значение IWeakReference или не является производным от
IInspectable , генерируется ошибка.

Первый шаблон — это форма, которую необходимо использовать в коде. Второй


шаблон является внутренней, вспомогательной специализацией; Он поддерживает
функции языка C++, такие как auto ключевое слово выведения типа.

начиная с Windows 10 пакета SDK этот метод не устанавливает WeakRef экземпляр в


nullptr значение, если не удалось получить слабую ссылку, поэтому следует

избегать проверки ошибок, которые проверяют значение WeakRef для nullptr .


Вместо этого проверьте ptr для nullptr .

WeakRef::AsIID
Задает указанный ComPtr параметр указателя для представления УКАЗАННОГО
идентификатора интерфейса.

C++

HRESULT AsIID(

REFIID riid,

_Out_ ComPtr<IInspectable>* ptr

);

Параметры
riid

Идентификатор интерфейса.

ptr

Когда эта операция завершается, объект, представляющий параметр riid .

Возвращаемое значение
S_OK значение, если эта операция завершилась с ошибкой; в противном

случае возвращается значение HRESULT, указывающее на причину сбоя


операции, и ptr устанавливается в nullptr значение.

S_OK Если эта операция завершилась успешно, но текущий WeakRef объект


уже был освобожден. Параметр ptr устанавливается в значение nullptr .

S_OK Если эта операция выполняется, но текущий WeakRef объект не является

производным от параметра riid . Параметр ptr устанавливается в значение


nullptr . (Дополнительные сведения см. в разделе "Примечания".)

Примечания
Если параметр riid не является производным от IInspectable , генерируется
ошибка. Эта ошибка заменяет возвращаемое значение.

Первый шаблон — это форма, которую необходимо использовать в коде. Второй


шаблон (не показан здесь, но объявленный в файле заголовка) является
внутренней вспомогательной специализацией, поддерживающей функции языка
C++, такие как auto ключевое слово выведения типа.

начиная с Windows 10 пакета SDK этот метод не устанавливает WeakRef экземпляр в


nullptr значение, если не удалось получить слабую ссылку, поэтому следует
избегать проверки ошибок, которые проверяют значение WeakRef для nullptr .
Вместо этого проверьте ptr nullptr наличие.

WeakRef::CopyTo
Присваивает указатель на интерфейс (при его наличии) указанной переменной
указателя.

C++

HRESULT CopyTo(

REFIID riid,

_Deref_out_ IInspectable** ptr


);

template<typename U>

HRESULT CopyTo(

_Deref_out_ U** ptr

);

HRESULT CopyTo(

_Deref_out_ IWeakReference** ptr

);

Параметры
U

IInspectable Указатель интерфейса. Если U объект не является производным от

IInspectable , создается ошибка.

riid

Идентификатор интерфейса. Если riid объект не является производным от


IWeakReference , создается ошибка.

ptr

Двунаправленный косвенный указатель на IInspectable или IWeakReference .

Возвращаемое значение
S_OK в случае успеха. в противном случае возвращается значение HRESULT,

описывающее сбой. Дополнительные сведения см. в разделе Примечания.

Примечания
Возвращаемое значение S_OK означает, что эта операция выполнена успешно, но
не указывает, была ли слабая ссылка разрешена строгой ссылке. Если
возвращается, проверяется, является ли S_OK параметр ptr строгой ссылкой, то
есть параметр ptr не равен nullptr .
начиная с Windows 10 пакета SDK этот метод не устанавливает WeakRef экземпляр в
nullptr значение, если не удалось получить слабую ссылку, поэтому следует
избегать проверки ошибок, которые проверяют значение WeakRef для nullptr .
Вместо этого проверьте ptr nullptr наличие.

WeakRef::operator&
ComPtrRef Возвращает объект, представляющий текущий WeakRef объект.

C++

Details::ComPtrRef<WeakRef> operator&() throw()

Возвращаемое значение
ComPtrRef Объект, представляющий текущий WeakRef объект.

Примечания
WeakRef::operator& является внутренним вспомогательным оператором, который

не предназначен для использования в коде.


Пространство имен
Microsoft::WRL::Details
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

namespace Microsoft::WRL::Details;

Члены

Классы

name Описание

Класс ComPtrRef Представляет ссылку на объект типа ComPtr<T>.

Класс ComPtrRefBase Представляет базовый класс для класса ComPtrRef .

Класс Запрещает использование оператора new в RuntimeClass .


DontUseNewUseMake Следовательно, вместо этого необходимо использовать функцию
Make .

Класс Представляет массив обработчиков событий.


EventTargetArray

Класс MakeAllocator Выделяет память для активируемых классов с слабой поддержкой


ссылок или без нее.

Класс ModuleBase Представляет базовый класс классов Module .

Класс Создает тип, эквивалентный типу IUnknown на основе, но имеющий не


RemoveIUnknown виртуальные QueryInterface методы , AddRef и Release .

Класс WeakReference Представляет слабую ссылку, которую можно использовать с среда


выполнения Windows или классической COM. Слабая ссылка
представляет собой объект, который может быть доступен или
недоступен.
Структуры

Имя Описание

ArgTraits - структура Объявляет указанный интерфейс делегата и анонимную функцию-


член, которая имеет указанное количество параметров.

ArgTraitsHelper - Помогает определить общие характеристики аргументов делегата.


структура

BoolStruct - структура Определяет, управляет ли объект ComPtr временем существования


интерфейса. BoolStruct используется внутри оператора BoolType().

CreatorMap - Содержит сведения о том, как инициализировать, регистрировать и


структура отменять регистрацию объектов.

DerefHelper - Представляет разыменованный указатель на параметр шаблона T* .


структура

EnableIf - структура Определяет данные-член типа, указанного в качестве второго


параметра шаблона, если первый параметр шаблона равен true .

FactoryCache - Содержит расположение фабрики класса и значение,


структура определяющее зарегистрированный объект среда выполнения
Windows или COM-класса.

ImplementsBase - Используется для проверки типов параметров шаблона в разделе


структура Реализация структуры.

ImplementsHelper - Помогает реализовать структуру Implements .


структура

InterfaceList - Используется для создания рекурсивного списка интерфейсов.


структура

InterfaceListHelper - InterfaceList Создает тип путем рекурсивного применения


структура указанных аргументов параметров шаблона.

InterfaceTraits - Реализует общие характеристики интерфейса.


структура

InvokeHelper - Предоставляет реализацию метода на Invoke() основе указанного


структура числа и типа аргументов.

IsBaseOfStrict - Проверяет, является ли один тип базовым для другого.


структура

IsSame - структура Определяет, совпадают ли указанные типы друг с другом.

Структура Nil Используется для указания неуказанным необязательным


параметром шаблона.
Имя Описание

RemoveReference - Удаляет свойство reference или rvalue-reference из указанного


структура параметра шаблона класса.

Структура Используется для обнаружения RuntimeClass в функции Make .


RuntimeClassBase

Структура Предоставляет вспомогательные методы для операций


RuntimeClassBaseT QueryInterface и получения идентификаторов интерфейсов.

VerifyInheritanceHelper Проверяет, является ли один интерфейс производным от другого


- структура интерфейса.

VerifyInterfaceHelper - Проверяет, соответствует ли интерфейс, заданный параметром


структура шаблона, определенным требованиям.

Перечисления

Имя Описание

AsyncStatusInternal Задает сопоставление между внутренними перечислениями состояний


- перечисление асинхронных операций и перечислением
Windows::Foundation::AsyncStatus .

Функции

Имя Описание

Функция Возвращает фабрику активации для указанного


ActivationFactoryCallback идентификатора активации.

Функция Move Перемещает указанный аргумент из одного расположения в


другое.

Функция RaiseException Вызывает исключение в вызывающем потоке.

Функция Swap (WRL) Обмен значениями двух указанных аргументов.

Функция TerminateMap Завершает работу фабрик классов в указанном модуле.

Требования
Заголовок: async.h, client.h, corewrappers.h, event.h, ftm.h, implements.h, internal.h,
module.h
Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL

Пространство имен Microsoft::WRL::Wrappers


ActivationFactoryCallback - функция
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

inline HRESULT STDAPICALLTYPE ActivationFactoryCallback(

HSTRING activationId,

IActivationFactory **ppFactory
);

Параметры
activationId

Дескриптор строки, указывающей имя класса среды выполнения.

ppFactory

После завершения этой операции — фабрика активации, соответствующая


параметру activationId.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, описывающее тип сбоя. Возможные ошибки HRESULT
CLASS_E_CLASSNOTAVAILABLE и E_INVALIDARG.

Комментарии
Возвращает фабрику активации для указанного идентификатора активации.

Среда выполнения Windows вызывает эту функцию обратного вызова для запроса
объекта, указанного именем класса среды выполнения.

Требования
Заголовок: module.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
ArgTraits - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template<typename TMemberFunction>

struct ArgTraits;

template<typename TDelegateInterface>

struct ArgTraits<HRESULT (STDMETHODCALLTYPE TDelegateInterface::*)(void)>;

template<typename TDelegateInterface, typename TArg1>

struct ArgTraits<HRESULT (STDMETHODCALLTYPE TDelegateInterface::*)(TArg1)>;

template<typename TDelegateInterface, typename TArg1, typename TArg2>

struct ArgTraits<

HRESULT (STDMETHODCALLTYPE TDelegateInterface::*)(TArg1, TArg2)>;

template<

typename TDelegateInterface,

typename TArg1,

typename TArg2,

typename TArg3

>

struct ArgTraits<

HRESULT (STDMETHODCALLTYPE TDelegateInterface::*)(TArg1, TArg2, TArg3)>;

template<

typename TDelegateInterface,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4

>

struct ArgTraits<

HRESULT (STDMETHODCALLTYPE TDelegateInterface::*)

(TArg1, TArg2, TArg3, TArg4)>;

template<

typename TDelegateInterface,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5

>

struct ArgTraits<

HRESULT (STDMETHODCALLTYPE TDelegateInterface::*)

(TArg1, TArg2, TArg3, TArg4, TArg5)>;

template<

typename TDelegateInterface,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6

>

struct ArgTraits<

HRESULT (STDMETHODCALLTYPE TDelegateInterface::*)

(TArg1, TArg2, TArg3, TArg4, TArg5, TArg6)>;

template<

typename TDelegateInterface,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6,

typename TArg7

>

struct ArgTraits<

HRESULT (STDMETHODCALLTYPE TDelegateInterface::*)

(TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7)>;

template<

typename TDelegateInterface,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6,

typename TArg7,

typename TArg8

>

struct ArgTraits<

HRESULT (STDMETHODCALLTYPE TDelegateInterface::*)

(TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8)>;

template<

typename TDelegateInterface,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6,

typename TArg7,

typename TArg8,

typename TArg9

>

struct ArgTraits<

HRESULT (STDMETHODCALLTYPE TDelegateInterface::*)

(TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8,


TArg9)>;

Параметры
TMemberFunction

Параметр Typename для структуры ArgTraits, которая не может соответствовать ни


одной Invoke сигнатуре метода.

TDelegateInterface

Интерфейс делегата.

TArg1

Тип первого аргумента Invoke метода.

TArg2

Тип второго аргумента Invoke метода.

TArg3

Тип третьего аргумента Invoke метода.

TArg4

Тип четвертого аргумента Invoke метода.

TArg5

Тип пятого аргумента Invoke метода.

TArg6

Тип шестого аргумента Invoke метода.

TArg7

Тип седьмого аргумента Invoke метода.

TArg8

Тип восьмого аргумента Invoke метода.

TArg9

Тип девятого аргумента Invoke метода.


Комментарии
Структура ArgTraits объявляет указанный интерфейс делегата и анонимную
функцию-член, которая принимает указанное число параметров.

Элементы

Общедоступные определения типов

Имя Описание

Arg1Type Typedef для TArg1.

Arg2Type Typedef для TArg2.

Arg3Type Typedef для TArg3.

Arg4Type Typedef для TArg4.

Arg5Type Typedef для TArg5.

Arg6Type Typedef для TArg6.

Arg7Type Typedef для TArg7.

Arg8Type Typedef для TArg8.

Arg9Type Typedef для TArg9.

Открытые константы

Имя Описание

ArgTraits::args Сохраняет количество параметров в методе Invoke интерфейса делегата.

Иерархия наследования
ArgTraits

Требования
Заголовок: event.h
Пространства имен: Microsoft::WRL::D etails

ArgTraits::args
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

static const int args = -1;

Комментарии
Сохраняет количество параметров в методе Invoke интерфейса делегата. Если args
равно -1, для сигнатуры метода не может быть совпадений Invoke .
ArgTraitsHelper - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template<typename TDelegateInterface>

struct ArgTraitsHelper;

Параметры
TDelegateInterface

Интерфейс делегата.

Комментарии
Помогает определить общие характеристики аргументов делегата.

Элементы

Общедоступные определения типов

Имя Описание

methodType Синоним для decltype(&TDelegateInterface::Invoke) .

Traits Синоним для ArgTraits<methodType> .

Открытые константы

Имя Описание

ArgTraitsHelper::args Помогает ArgTraits::args сохранить количество параметров в методе


Invoke интерфейса делегата.
Иерархия наследования
ArgTraitsHelper

Требования
Заголовок: event.h

Пространства имен: Microsoft::WRL::D etails

ArgTraitsHelper::args
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

static const int args = Traits::args;

Комментарии
Помогает ArgTraitsHelper::args сохранить количество параметров в методе Invoke
интерфейса делегата.
AsyncStatusInternal - перечисление
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

enum AsyncStatusInternal;

Remarks
Задает сопоставление между внутренними перечислениями состояний
асинхронных операций и перечислением Windows::Foundation::AsyncStatus .

Элементы
_Created

Эквивалентно ::Windows::Foundation::AsyncStatus::Created .

_Started

Эквивалентно ::Windows::Foundation::AsyncStatus::Started .

_Completed

Эквивалентно ::Windows::Foundation::AsyncStatus::Completed .

_Cancelled

Эквивалентно ::Windows::Foundation::AsyncStatus::Cancelled .

_Error

Эквивалентно ::Windows::Foundation::AsyncStatus::Error .

Требования
Заголовок: async.h

Пространства имен: Microsoft::WRL::D etails


См. также раздел
Пространство имен Microsoft::WRL::D etails
BoolStruct - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

struct BoolStruct;

Remarks
Структура BoolStruct определяет, управляет ли ComPtr объект временем
существования интерфейса. BoolStruct используется внутри оператора BoolType().

Элементы

Открытые члены данных

Имя Описание

BoolStruct::Member Указывает, что ComPtr управляет временем существования объекта


интерфейса или нет.

Иерархия наследования
BoolStruct

Требования
Заголовок: internal.h

Пространства имен: Microsoft::WRL::D etails

BoolStruct::Member
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

int Member;

Комментарии
Указывает, что ComPtr управляет временем существования объекта интерфейса
или нет.
ComPtrRef - класс
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename T>

class ComPtrRef : public ComPtrRefBase<T>;

Параметры
T

Тип ComPtr<T> или тип, производный от него, а не просто интерфейс,


представленный ComPtr .

Комментарии
Представляет ссылку на объект типа ComPtr<T> .

Члены

Открытые конструкторы

name Описание

ComPtrRef::ComPtrRef Инициализирует новый экземпляр ComPtrRef класса из указанного


указателя на другой ComPtrRef объект.

Открытые методы

name Описание

ComPtrRef::GetAddressOf Извлекает адрес указателя на интерфейс,


представленный текущим ComPtrRef объектом .
name Описание

ComPtrRef::ReleaseAndGetAddressOf Удаляет текущий ComPtrRef объект и возвращает


указатель на интерфейс, представленный ComPtrRef
объектом .

Открытые операторы

Имя Описание

ComPtrRef::operator Удаляет текущий ComPtrRef объект и возвращает указатель на


InterfaceType** интерфейс, представленный ComPtrRef объектом .

ComPtrRef::operator T* Возвращает значение элемента данных ptr_ текущего объекта


ComPtrRef.

ComPtrRef::operator Удаляет текущий ComPtrRef объект , приводит указатель к


void** интерфейсу, представленному ComPtrRef объектом в виде указателя
void на , а затем возвращает указатель приведения.

ComPtrRef::operator* Извлекает указатель на интерфейс, представленный текущим


ComPtrRef объектом .

ComPtrRef::operator== Определение равенства двух объектов ComPtrRef .

ComPtrRef::operator!= Определяет неравенство двух объектов ComPtrRef .

Иерархия наследования
ComPtrRefBase

ComPtrRef

Требования
Заголовок: client.h

Пространства имен: Microsoft::WRL::D etails

ComPtrRef::ComPtrRef
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.
C++

ComPtrRef(

_In_opt_ T* ptr

);

Параметры
Ptr

Базовое значение другого ComPtrRef объекта.

Комментарии
Инициализирует новый экземпляр ComPtrRef класса из указанного указателя на
другой ComPtrRef объект.

ComPtrRef::GetAddressOf
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

InterfaceType* const * GetAddressOf() const;

Возвращаемое значение
Адрес указателя на интерфейс, представленный текущим ComPtrRef объектом .

Комментарии
Извлекает адрес указателя на интерфейс, представленный текущим ComPtrRef
объектом .

ComPtrRef::operator==
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++
bool operator==(

const Details::ComPtrRef<ComPtr<T>>& a,

const Details::ComPtrRef<ComPtr<U>>& b

);

bool operator==(

const Details::ComPtrRef<ComPtr<T>>& a,

decltype(__nullptr)

);

bool operator==(

decltype(__nullptr),

const Details::ComPtrRef<ComPtr<T>>& a

);

bool operator==(

const Details::ComPtrRef<ComPtr<T>>& a,

void* b

);

bool operator==(

void* b,

const Details::ComPtrRef<ComPtr<T>>& a

);

Параметры
a

Ссылка на объект ComPtrRef .

Ссылка на другой ComPtrRef объект или указатель на анонимный тип ( void* ).

Возвращаемое значение
Первый оператор возвращает true значение , если объект a равен объекту b; в
противном случае false — значение .

Второй и третий операторы выдают , true если объект равен ; в nullptr противном
случае — false значение .

Четвертый и пятый операторы дают результат true , если объект a равен объекту
b; в противном случае — false значение .

Комментарии
Определение равенства двух объектов ComPtrRef .

ComPtrRef::operator!=
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

bool operator!=(

const Details::ComPtrRef<ComPtr<T>>& a,

const Details::ComPtrRef<ComPtr<U>>& b

);

bool operator!=(

const Details::ComPtrRef<ComPtr<T>>& a,

decltype(__nullptr)

);

bool operator!=(

decltype(__nullptr),

const Details::ComPtrRef<ComPtr<T>>& a

);

bool operator!=(

const Details::ComPtrRef<ComPtr<T>>& a,

void* b

);

bool operator!=(

void* b,

const Details::ComPtrRef<ComPtr<T>>& a

);

Параметры
a

Ссылка на объект ComPtrRef .

Ссылка на другой ComPtrRef объект или указатель на анонимный объект ( void* ).

Возвращаемое значение
Первый оператор возвращает true значение , если объект a не равен объекту b; в
противном случае — false значение .
Второй и третий операторы выдают , true если объект a не равен ; в
nullptr противном случае — false значение .

Четвертый и пятый операторы дают результат true , если объект a не равен


объекту b; в противном случае — значение false .

Комментарии
Определяет неравенство двух объектов ComPtrRef .

ComPtrRef::operator InterfaceType**
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

operator InterfaceType**();

Комментарии
Удаляет текущий ComPtrRef объект и возвращает указатель на интерфейс,
представленный ComPtrRef объектом .

ComPtrRef::operator*
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

InterfaceType* operator *();

Возвращаемое значение
Указатель на интерфейс, представленный текущим ComPtrRef объектом .

Комментарии
Извлекает указатель на интерфейс, представленный текущим ComPtrRef объектом .

ComPtrRef::operator T*
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

operator T*();

Комментарии
Возвращает значение элемента данных ptr_ текущего ComPtrRef объекта .

ComPtrRef::operator void**
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

operator void**() const;

Комментарии
Удаляет текущий ComPtrRef объект , приводит указатель к интерфейсу,
представленному ComPtrRef объектом в виде указателя void на , а затем
возвращает указатель приведения.

ComPtrRef::ReleaseAndGetAddressOf
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

InterfaceType** ReleaseAndGetAddressOf();

Возвращаемое значение
Указатель на интерфейс, представленный удаленным ComPtrRef объектом.

Комментарии
Удаляет текущий ComPtrRef объект и возвращает указатель на интерфейс,
представленный ComPtrRef объектом .
ComPtrRefBase - класс
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename T>

class ComPtrRefBase;

Параметры
T

Тип ComPtr<T> или тип, производный от него, а не просто интерфейс,


представленный ComPtr .

Комментарии
Представляет базовый класс для класса ComPtrRef .

Элементы

Общедоступные определения типов

Имя Описание

InterfaceType Синоним типа параметра шаблона T.

Открытые операторы

Имя Описание

ComPtrRefBase::operator Приводит текущий элемент данных ptr_ к указателю


IInspectable** IInspectable на интерфейс.
Имя Описание

ComPtrRefBase::operator Приводит текущий элемент данных ptr_ к указателю IUnknown


IUnknown** на интерфейс.

Защищенные члены данных

Имя Описание

ComPtrRefBase::p tr_ Указатель на тип, заданный текущим параметром шаблона.

Иерархия наследования
ComPtrRefBase

Требования
Заголовок: client.h

Пространства имен: Microsoft::WRL::D etails

Оператор ComPtrRefBase::operator
IInspectable**
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

operator IInspectable**() const;

Комментарии
Приводит текущий элемент данных ptr_ к указателю IInspectable на интерфейс.

Если текущий ComPtrRefBase объект не является производным от IInspectable ,


возникает ошибка.

Это приведение доступно только в том случае, если __WRL_CLASSIC_COM__ задано


значение .
Оператор ComPtrRefBase::operator
IUnknown**
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

operator IUnknown**() const;

Комментарии
Приводит текущий элемент данных ptr_ к указателю IUnknown на интерфейс.

Если текущий ComPtrRefBase объект не является производным от IUnknown ,


возникает ошибка.

ComPtrRefBase::p tr_
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

T* ptr_;

Комментарии
Указатель на тип, заданный текущим параметром шаблона. ptr_ — это
защищенный элемент данных.
CreatorMap - структура
Статья • 03.04.2023

Поддерживает среда выполнения Windows инфраструктуру библиотеки шаблонов


C++ и не предназначен для использования непосредственно из кода.

Синтаксис
C++

struct CreatorMap;

Remarks
Содержит сведения об инициализации, регистрации и отмене регистрации
объектов.

CreatorMap содержит следующие сведения:

Как инициализировать, регистрировать и отменять регистрацию объектов.

Сравнение данных активации в зависимости от классической фабрики COM


или среда выполнения Windows.

Сведения о кэше фабрики и имени сервера для интерфейса.

Элементы

Открытые члены данных

Имя Описание

CreatorMap::activationId Представляет идентификатор объекта, который определяется


классическим идентификатором класса COM или именем среда
выполнения Windows.

CreatorMap::factoryCache Сохраняет указатель на кэш фабрики CreatorMap для .

CreatorMap::factoryCreator Создает фабрику для указанного CreatorMap объекта .

CreatorMap::serverName Хранит имя сервера для CreatorMap .


Иерархия наследования
CreatorMap

Требования
Заголовок: module.h

Пространства имен: Microsoft::WRL::D etails

CreatorMap::activationId
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

union {

const IID* clsid;

const wchar_t* (*getRuntimeName)();

} activationId;

Параметры
Clsid

Идентификатор интерфейса.

getRuntimeName

Функция, которая извлекает имя объекта в среде выполнения Windows.

Комментарии
Представляет идентификатор объекта, который определен идентификатором
класса классической модели COM или именем в среде выполнения Windows.

CreatorMap::factoryCache
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++
FactoryCache* factoryCache;

Комментарии
Сохраняет указатель на кэш фабрики CreatorMap для .

CreatorMap::factoryCreator
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

HRESULT (*factoryCreator)(

unsigned int* currentflags,

const CreatorMap* entry,

REFIID iidClassFactory,

IUnknown** factory);

Параметры
currentflags

Один из перечислителей RuntimeClassType .

Запись

A CreatorMap.

iidClassFactory

Идентификатор интерфейса фабрики классов.

фабрика

После завершения операции — адрес фабрики классов.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

Комментарии
Создает фабрику для указанного CreatorMap.
CreatorMap::serverName
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

const wchar_t* serverName;

Комментарии
Хранит имя сервера для объекта CreatorMap.
DerefHelper - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename T>

struct DerefHelper;

template <typename T>

struct DerefHelper<T*>;

Параметры
T

Параметр шаблона.

Комментарии
Представляет разыменованный указатель на параметр шаблона T* .

DerefHelper используется в выражении, таком как :


ComPtr<Details::DerefHelper<ProgressTraits::Arg1Type>::DerefType>

operationInterface; .

Элементы

Общедоступные определения типов

Имя Описание

DerefType Идентификатор для разыменованного параметра шаблона T* .

Иерархия наследования
DerefHelper

Требования
Заголовок: async.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
DontUseNewUseMake - класс
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

class DontUseNewUseMake;

Remarks
Запрещает использование оператора new в RuntimeClass . Следовательно, вместо
этого необходимо использовать функцию Make .

Элементы

Открытые операторы

Имя Описание

DontUseNewUseMake::operator Перегружает оператор new и предотвращает его


new использование в RuntimeClass .

Иерархия наследования
DontUseNewUseMake

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

DontUseNewUseMake::operator new
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

void* operator new(

size_t,

_In_ void* placement

);

Параметры
__unnamed0

Неименованный параметр, который определяет количество байт памяти для


выделения.

Размещения

Выделяемый тип.

Возвращаемое значение
Предоставляет способ передачи дополнительных аргументов при перегрузке
оператора new .

Комментарии
Перегружает оператор new и предотвращает его использование в RuntimeClass .
EnableIf - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <bool b, typename T = void>

struct EnableIf;

template <typename T>

struct EnableIf<true, T>;

Параметры
T

Тип.

Логическое выражение.

Комментарии
Определяет данные-член типа, указанного в качестве второго параметра шаблона,
если первый параметр шаблона равен true .

Элементы

Общедоступные определения типов

Имя Описание

type Если параметр шаблона b имеет true значение , то частичная специализация


определяет элемент type данных как тип T .
Иерархия наследования
EnableIf

Требования
Заголовок: internal.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
Класс EventTargetArray
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

class EventTargetArray :

public Microsoft::WRL::RuntimeClass<

Microsoft::WRL::RuntimeClassFlags<ClassicCom>,

IUnknown

>;

Remarks
Представляет массив обработчиков событий.

Обработчики событий, связанные с объектом EventSource , хранятся в защищенном


элементе EventTargetArray данных.

Члены

Открытые конструкторы

name Описание

EventTargetArray::EventTargetArray Инициализирует новый экземпляр класса


EventTargetArray .

EventTargetArray::~EventTargetArray Деинициализирует текущий EventTargetArray класс.

Открытые методы

name Описание

EventTargetArray::AddTail Добавляет указанный обработчик событий в конец внутреннего


массива обработчиков событий.
name Описание

EventTargetArray::Begin Возвращает адрес первого элемента во внутреннем массиве


обработчиков событий.

EventTargetArray::End Возвращает адрес последнего элемента во внутреннем массиве


обработчиков событий.

EventTargetArray::Length Возвращает текущее количество элементов во внутреннем


массиве обработчиков событий.

Иерархия наследования
EventTargetArray

Требования
Заголовок: event.h

Пространства имен: Microsoft::WRL::D etails

EventTargetArray::~EventTargetArray
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

~EventTargetArray();

Комментарии
Деинициализирует текущий EventTargetArray класс.

EventTargetArray::AddTail
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++
void AddTail(

_In_ IUnknown* element

);

Параметры
Элемент

Указатель на добавляемый обработчик событий.

Комментарии
Добавляет указанный обработчик событий в конец внутреннего массива
обработчиков событий.

AddTail() предназначен для внутреннего использования только классом

EventSource .

EventTargetArray::Begin
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

ComPtr<IUnknown>* Begin();

Возвращаемое значение
Адрес первого элемента во внутреннем массиве обработчиков событий.

Комментарии
Возвращает адрес первого элемента во внутреннем массиве обработчиков
событий.

EventTargetArray::End
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.
C++

ComPtr<IUnknown>* End();

Возвращаемое значение
Адрес последнего элемента во внутреннем массиве обработчиков событий.

Комментарии
Возвращает адрес последнего элемента во внутреннем массиве обработчиков
событий.

EventTargetArray::EventTargetArray
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

EventTargetArray(

_Out_ HRESULT* hr,

size_t items

);

Параметры
ч

После выполнения этой операции конструктора параметр hr указывает, было ли


выделение массива успешным или неудачным. В следующем списке показаны
возможные значения для hr.

S_OK

Операция успешно выполнена.

E_OUTOFMEMORY

Не удалось выделить память для массива.

S_FALSE

Элементы параметров меньше или равны нулю.


items

Количество выделенных элементов массива.

Комментарии
Инициализирует новый экземпляр класса EventTargetArray .

EventTargetArray используется для хранения массива обработчиков событий в


объекте EventSource .

EventTargetArray::Length
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

size_t Length();

Возвращаемое значение
Текущее количество элементов во внутреннем массиве обработчиков событий.

Комментарии
Возвращает текущее количество элементов во внутреннем массиве обработчиков
событий.
FactoryCache - структура
Статья • 03.04.2023

Поддерживает среда выполнения Windows инфраструктуру библиотеки шаблонов


C++ и не предназначен для использования непосредственно из кода.

Синтаксис
C++

struct FactoryCache;

Remarks
Содержит местоположение фабрики класса и значение, которое идентифицирует
зарегистрированный объект класса Среды выполнения Windows или модели COM.

Элементы

Открытые члены данных

Имя Описание

FactoryCache::cookie Содержит значение, идентифицирующее зарегистрированный объект


среда выполнения Windows или COM-класса, а затем используется
для отмены регистрации объекта.

FactoryCache::factory Указывает на фабрику среда выполнения Windows или COM-класса.

Иерархия наследования
FactoryCache

Требования
Заголовок: module.h

Пространства имен: Microsoft::WRL::D etails


FactoryCache::cookie
Поддерживает среда выполнения Windows инфраструктуру библиотеки шаблонов
C++ и не предназначен для использования непосредственно из кода.

C++

union {

WINRT_REGISTRATION_COOKIE winrt;

DWORD com;

} cookie;

Комментарии
Содержит значение, идентифицирующее зарегистрированный объект среда
выполнения Windows или COM-класса, а затем используется для отмены
регистрации объекта.

FactoryCache::factory
Поддерживает среда выполнения Windows инфраструктуру библиотеки шаблонов
C++ и не предназначен для использования непосредственно из кода.

C++

IUnknown* factory;

Комментарии
Указывает на фабрику среда выполнения Windows или COM-класса.
ImplementsBase - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

struct ImplementsBase;

Remarks
Используется для проверки типов параметров шаблона в разделе Реализация
структуры.

Структура ImplementsBase пуста по умолчанию.

Иерархия наследования
ImplementsBase

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
ImplementsHelper - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename RuntimeClassFlagsT, typename ILst, bool


IsDelegateToClass>

friend struct Details::ImplementsHelper;

Параметры
RuntimeClassFlagsT

Поле флагов, указывающее один или несколько перечислителей RuntimeClassType .

ILst

Список идентификаторов интерфейсов.

IsDelegateToClass

Укажите true , является ли текущий Implements экземпляр базовым классом


первого идентификатора интерфейса в ILst; в противном случае — значение false .

Комментарии
Помогает реализовать структуру Implements .

Этот шаблон просматривает список интерфейсов и добавляет их в качестве


базовых классов и в качестве сведений, необходимых для включения
QueryInterface .

Элементы

Защищенные методы

Имя Описание
Имя Описание

ImplementsHelper::CanCastTo Возвращает указатель на указанный идентификатор


интерфейса.

ImplementsHelper::CastToUnknown Возвращает указатель на базовый IUnknown интерфейс


для текущей Implements структуры.

ImplementsHelper::FillArrayWithIid Вставляет идентификатор интерфейса, заданный


текущим параметром нулевого шаблона, в указанный
элемент массива.

ImplementsHelper::IidCount Содержит количество идентификаторов реализованных


интерфейсов в текущем Implements объекте .

Иерархия наследования
ImplementsHelper

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

ImplementsHelper::CanCastTo
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

HRESULT CanCastTo(

REFIID riid,

_Deref_out_ void **ppv

);

HRESULT CanCastTo(

_In_ const IID &iid,

_Deref_out_ void **ppv

);

Параметры
riid

Ссылка на идентификатор интерфейса.

Ppv

Если эта операция выполнена успешно, указатель на интерфейс, указанный в riid


или iid.

Iid

Ссылка на идентификатор интерфейса.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее на ошибку.

Комментарии
Возвращает указатель на указанный идентификатор интерфейса.

ImplementsHelper::CastToUnknown
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

IUnknown* CastToUnknown();

Возвращаемое значение
Указатель на базовый IUnknown интерфейс.

Комментарии
Возвращает указатель на базовый IUnknown интерфейс для текущей Implements
структуры.

ImplementsHelper::FillArrayWithIid
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

void FillArrayWithIid(

_Inout_ unsigned long *index,

_Inout_ IID* iids) throw();

Параметры
index

Отсчитываемый от нуля индекс, указывающий начальный элемент массива для


этой операции. После завершения этой операции индекс увеличивается на 1.

iids

Массив идентификаторов типа.

Комментарии
Вставляет идентификатор интерфейса, заданный текущим параметром нулевого
шаблона, в указанный элемент массива.

ImplementsHelper::IidCount
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

static const unsigned long IidCount;

Комментарии
Содержит количество идентификаторов реализованных интерфейсов в текущем
Implements объекте .
InterfaceList - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename T, typename U>

struct InterfaceList;

Параметры
T

Имя интерфейса; первый интерфейс в рекурсивном списке.

Имя интерфейса; остальные интерфейсы в рекурсивном списке.

Комментарии
Используется для создания рекурсивного списка интерфейсов.

Элементы

Общедоступные определения типов

Имя Описание

FirstT Синоним параметра шаблона T.

RestT Синоним параметра шаблона U.

Иерархия наследования
InterfaceList
Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
InterfaceListHelper - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <

typename T0,

typename T1 = Nil,

typename T2 = Nil,

typename T3 = Nil,

typename T4 = Nil,

typename T5 = Nil,

typename T6 = Nil,

typename T7 = Nil,

typename T8 = Nil,

typename T9 = Nil

>

struct InterfaceListHelper;

template <typename T0>

struct InterfaceListHelper<T0, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil>;

Параметры
T0

Параметр шаблона 0, который является обязательным.

T1

Параметр шаблона 1, который по умолчанию не указан.

T2

Параметр шаблона 2, который по умолчанию не указан. Третий параметр шаблона.

T3

Параметр шаблона 3, который по умолчанию не указан.

T4

Параметр шаблона 4, который по умолчанию не указан.


T5

Параметр шаблона 5, который по умолчанию не указан.

T6

Параметр шаблона 6, который по умолчанию не указан.

T7

Параметр шаблона 7, который по умолчанию не указан.

T8

Параметр шаблона 8, который по умолчанию не указан.

T9

Параметр шаблона 9, который по умолчанию не указан.

Комментарии
Создает тип InterfaceList путем рекурсивного применения указанных аргументов
параметра шаблона.

Шаблон InterfaceListHelper использует параметр шаблона T0 для определения


первого элемента данных в InterfaceList структуре, а затем рекурсивно применяет
шаблон InterfaceListHelper ко всем остальным параметрам шаблона.
InterfaceListHelper останавливается, если отсутствуют оставшиеся параметры
шаблона.

Элементы

Общедоступные определения типов

Имя Описание

TypeT Синоним типа InterfaceList.

Иерархия наследования
InterfaceListHelper

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
InterfaceTraits - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template<typename I0>

struct __declspec(novtable) InterfaceTraits;

template<typename CloakedType>

struct __declspec(novtable) InterfaceTraits<

CloakedIid<CloakedType>

>;

template<>

struct __declspec(novtable) InterfaceTraits<Nil>;

Параметры
I0

Имя интерфейса.

CloakedType

Для RuntimeClass , Implements и ChainInterfaces интерфейс, который не будет в


списке поддерживаемых идентификаторов интерфейсов.

Комментарии
Реализует общие характеристики интерфейса.

Второй шаблон — это специализация для замассированных интерфейсов. Третий


шаблон является специализацией для параметров Nil.

Элементы

Общедоступные определения типов


Имя Описание

Base Синоним параметра шаблона I0 .

Открытые методы

name Описание

InterfaceTraits::CanCastTo Указывает, можно ли привести указанный указатель к


указателю на Base .

InterfaceTraits::CastToBase Приводит определенный указатель к указателю на Base .

InterfaceTraits::CastToUnknown Приводит определенный указатель к указателю на IUnknown .

InterfaceTraits::FillArrayWithIid Назначает идентификатор Base интерфейса элементу


массива, указанному аргументом индекса.

InterfaceTraits::Verify Проверяет правильное Base производное.

Открытые константы

Имя Описание

InterfaceTraits::IidCount Содержит количество идентификаторов интерфейсов, связанных с


текущим InterfaceTraits объектом.

Иерархия наследования
InterfaceTraits

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

InterfaceTraits::CanCastTo
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.
C++

template<typename T>

static __forceinline bool CanCastTo(

_In_ T* ptr,

REFIID riid,

_Deref_out_ void **ppv

);

Параметры
Ptr

Имя указателя на тип.

riid

Идентификатор Base интерфейса .

Ppv

Если эта операция выполнена успешно, ppv указывает на интерфейс, заданный


параметром Base . В противном случае ppv имеет значение nullptr .

Возвращаемое значение
true Значение , если операция выполнена успешно и ptr приводится к указателю

на Base ; в противном случае — значение false .

Комментарии
Указывает, можно ли привести указанный указатель к указателю на Base .

Дополнительные сведения о Base см. в разделе Public Typedefs .

InterfaceTraits::CastToBase
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

template<typename T>

static __forceinline Base* CastToBase(

_In_ T* ptr

);

Параметры
T

Тип параметра ptr.

Ptr

Указатель на тип T.

Возвращаемое значение
Указатель на объект Base .

Комментарии
Приводит определенный указатель к указателю на Base .

Дополнительные сведения о Base см. в разделе Public Typedefs .

InterfaceTraits::CastToUnknown
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

template<typename T>

static __forceinline IUnknown* CastToUnknown(

_In_ T* ptr

);

Параметры
T

Тип параметра ptr.

Ptr

Указатель на тип T.

Возвращаемое значение
Указатель на объект IUnknown, производный от которого Base .

Комментарии
Приводит определенный указатель к указателю на IUnknown .

Дополнительные сведения о Base см. в разделе Public Typedefs .

InterfaceTraits::FillArrayWithIid
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

__forceinline static void FillArrayWithIid(

_Inout_ unsigned long &index,

_In_ IID* iids

);

Параметры
index

Указатель на поле, содержащее отсчитываемое от нуля значение индекса.

iids

Массив идентификаторов интерфейсов.

Комментарии
Назначает идентификатор Base интерфейса элементу массива, указанному
аргументом индекса.

В отличие от имени этого API, изменяется только один элемент массива; не весь
массив.

Дополнительные сведения о Base см. в разделе Public Typedefs .

InterfaceTraits::IidCount
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

static const unsigned long IidCount = 1;

Комментарии
Содержит количество идентификаторов интерфейсов, связанных с текущим
InterfaceTraits объектом.

InterfaceTraits::Verify
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

__forceinline static void Verify();

Комментарии
Проверяет правильное Base производное.

Дополнительные сведения о Base см. в разделе Public Typedefs .


InvokeHelper - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template<typename TDelegateInterface, typename TCallback, unsigned int


argCount>

struct InvokeHelper;

template<typename TDelegateInterface, typename TCallback>

struct InvokeHelper<TDelegateInterface, TCallback, 0> :

public Microsoft::WRL::RuntimeClass<

RuntimeClassFlags<Delegate>,

TDelegateInterface

>;

template<typename TDelegateInterface, typename TCallback>

struct InvokeHelper<TDelegateInterface, TCallback, 1> :

public Microsoft::WRL::RuntimeClass<

RuntimeClassFlags<Delegate>,

TDelegateInterface

>;

template<typename TDelegateInterface, typename TCallback>

struct InvokeHelper<TDelegateInterface, TCallback, 2> :

public Microsoft::WRL::RuntimeClass<

RuntimeClassFlags<Delegate>,

TDelegateInterface

>;

template<typename TDelegateInterface, typename TCallback>

struct InvokeHelper<TDelegateInterface, TCallback, 3> :

public Microsoft::WRL::RuntimeClass<

RuntimeClassFlags<Delegate>,

TDelegateInterface

>;

template<typename TDelegateInterface, typename TCallback>

struct InvokeHelper<TDelegateInterface, TCallback, 4> :

Microsoft::WRL::RuntimeClass<
RuntimeClassFlags<Delegate>,

TDelegateInterface

>;

template<typename TDelegateInterface, typename TCallback>

struct InvokeHelper<TDelegateInterface, TCallback, 5> :

Microsoft::WRL::RuntimeClass<
RuntimeClassFlags<Delegate>,

TDelegateInterface

>;

template<typename TDelegateInterface, typename TCallback>

struct InvokeHelper<TDelegateInterface, TCallback, 6> :

Microsoft::WRL::RuntimeClass<
RuntimeClassFlags<Delegate>,

TDelegateInterface

>;

template<typename TDelegateInterface, typename TCallback>

struct InvokeHelper<TDelegateInterface, TCallback, 7> :

Microsoft::WRL::RuntimeClass<
RuntimeClassFlags<Delegate>,

TDelegateInterface

>;

template<typename TDelegateInterface, typename TCallback>

struct InvokeHelper<TDelegateInterface, TCallback, 8> :

Microsoft::WRL::RuntimeClass<
RuntimeClassFlags<Delegate>,

TDelegateInterface

>;

template<typename TDelegateInterface, typename TCallback>

struct InvokeHelper<TDelegateInterface, TCallback, 9> :

Microsoft::WRL::RuntimeClass<
RuntimeClassFlags<Delegate>,

TDelegateInterface

>;

Параметры
TDelegateInterface

Тип интерфейса делегата.

TCallback

Тип функции обработчика событий.

argCount

Количество аргументов в специализации InvokeHelper .

Комментарии
Предоставляет реализацию метода на Invoke() основе указанного числа и типа
аргументов.

Элементы

Общедоступные определения типов

Имя Описание

Traits Синоним класса , который определяет тип каждого аргумента обработчика


событий.

Открытые конструкторы

name Описание

InvokeHelper::InvokeHelper Инициализирует новый экземпляр класса InvokeHelper .

Открытые методы

name Описание

InvokeHelper::Invoke Вызывает обработчик событий, сигнатура которого содержит


указанное количество аргументов.

Открытые члены данных

Имя Описание

InvokeHelper::callback_ Представляет обработчик событий, вызываемого при


возникновении события.

Иерархия наследования
InvokeHelper

Требования
Заголовок: event.h
Пространства имен: Microsoft::WRL::D etails

InvokeHelper::callback_
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

TCallback callback_;

Комментарии
Представляет обработчик событий, вызываемого при возникновении события.

Параметр TCallback шаблона указывает тип обработчика событий.

InvokeHelper::Invoke
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

STDMETHOD(

Invoke

)();

STDMETHOD(

Invoke

)(typename Traits;

STDMETHOD(

Invoke

)( typename Traits;

STDMETHOD(

Invoke

)( typename Traits;

STDMETHOD(

Invoke

)( typename Traits;

STDMETHOD(

Invoke

)( typename Traits;

STDMETHOD(

Invoke

)( typename Traits;

STDMETHOD(

Invoke

)( typename Traits;

STDMETHOD(

Invoke

)( typename Traits;

STDMETHOD(

Invoke

)( typename Traits;

Параметры
arg1

Аргумент 1.

arg2

Аргумент 2.

arg3

Аргумент 3.

arg4

Аргумент 4.

arg5

Аргумент 5.

arg6

Аргумент 6.

arg7

Аргумент 7.

arg8

Аргумент 8.

arg9

Аргумент 9.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — HRESULT,
описывающий ошибку.

Комментарии
Вызывает обработчик событий, сигнатура которого содержит указанное
количество аргументов.

InvokeHelper::InvokeHelper
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

explicit InvokeHelper(

TCallback callback

);

Параметры
Обратного вызова

Обработчик событий.

Комментарии
Инициализирует новый экземпляр класса InvokeHelper .

Параметр TCallback шаблона указывает тип обработчика событий.


IsBaseOfStrict - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename Base, typename Derived>

struct IsBaseOfStrict;

template <typename Base>

struct IsBaseOfStrict<Base, Base>;

Параметры
Базы

Базовый тип.

Производный

Производный тип.

Комментарии
Проверяет, является ли один тип базовым для другого.

Первый шаблон проверяет, является ли тип производным от базового типа,


который может дать true или false . Второй шаблон проверяет, является ли тип
производным от самого себя, который всегда возвращает false .

Элементы

Открытые константы

Имя Описание

IsBaseOfStrict::value Указывает, является ли один тип базовым для другого.


Иерархия наследования
IsBaseOfStrict

Требования
Заголовок: internal.h

Пространства имен: Microsoft::WRL::D etails

IsBaseOfStrict::value
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

static const bool value = __is_base_of(Base, Derived);

Комментарии
Указывает, является ли один тип базовым для другого.

value Имеет значение , true если тип Base является базовым классом типа
Derived , в противном случае — false .
IsSame - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename T1, typename T2>

struct IsSame;

template <typename T1>

struct IsSame<T1, T1>;

Параметры
T1

Тип.

T2

Другой тип.

Комментарии
Определяет, совпадают ли указанные типы друг с другом.

Элементы

Открытые константы

Имя Описание

IsSame::value Указывает, совпадают ли заданные типы друг с другом.

Иерархия наследования
IsSame
Требования
Заголовок: internal.h

Пространства имен: Microsoft::WRL::D etails

IsSame::value
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

template <typename T1, typename T2>

struct IsSame

static const bool value = false;

};

template <typename T1>

struct IsSame<T1, T1>

static const bool value = true;

};

Комментарии
Указывает, совпадают ли заданные типы друг с другом.

value Значение , true если параметры шаблона совпадают, а false параметры


шаблона отличаются.
MakeAllocator - класс
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template<

typename T,

bool hasWeakReferenceSupport =

!__is_base_of(RuntimeClassFlags<InhibitWeakReference>,

T)

>

class MakeAllocator;

template<typename T>

class MakeAllocator<T, false>;

template<typename T>

class MakeAllocator<T, true>;

Параметры
T

Имя типа.

hasWeakReferenceSupport

true выделение памяти для объекта, поддерживающего слабые ссылки; false для
выделения памяти для объекта, который не поддерживает слабые ссылки.

Комментарии
Выделяет память для активируемых классов с слабой поддержкой ссылок или без
нее.

Переопределите класс , MakeAllocator чтобы реализовать определяемую


пользователем модель выделения памяти.
MakeAllocator обычно используется для предотвращения утечки памяти, если

объект создает во время строительства.

Члены

Открытые конструкторы

name Описание

MakeAllocator::MakeAllocator Инициализирует новый экземпляр класса MakeAllocator .

MakeAllocator::~MakeAllocator Деинициализирует текущий MakeAllocator экземпляр класса


.

Открытые методы

name Описание

MakeAllocator::Allocate Выделяет память и связывает ее с текущим MakeAllocator объектом


.

MakeAllocator::D etach Отменяет связь памяти, выделенной методом Allocate , с текущим


MakeAllocator объектом.

Иерархия наследования
MakeAllocator

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

MakeAllocator::Allocate
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++
__forceinline void* Allocate();

Возвращаемое значение
Если операция завершилась успешно, представляет указатель на выделенную
память; в противном случае — значение nullptr .

Комментарии
Выделяет память и связывает ее с текущим MakeAllocator объектом .

Размер выделенной памяти — это размер типа, заданного текущим MakeAllocator


параметром шаблона.

Разработчик должен переопределить только метод для Allocate() реализации


другой модели выделения памяти.

MakeAllocator::D etach
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

__forceinline void Detach();

Комментарии
Отменяет связь памяти, выделенной методом Allocate , с текущим MakeAllocator
объектом.

При вызове Detach() вы несете ответственность за удаление памяти,


предоставляемой методом Allocate .

MakeAllocator::MakeAllocator
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.
C++

MakeAllocator();

Комментарии
Инициализирует новый экземпляр класса MakeAllocator .

MakeAllocator::~MakeAllocator
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

~MakeAllocator();

Комментарии
Деинициализирует текущий MakeAllocator экземпляр класса .

Этот деструктор также удаляет базовую выделенную память при необходимости.


Функция MakeAndInitialize
Статья • 03.04.2023

Инициализирует указанный класс среда выполнения Windows. Используйте эту


функцию, чтобы создать экземпляр компонента, который определен в том же
модуле.

Синтаксис
C++

template <

typename T,

typename I,

typename TArg1,

typename TArg2,

typename TArg3,

typename TArg4,

typename TArg5,

typename TArg6,

typename TArg7,

typename TArg8,

typename TArg9>

HRESULT MakeAndInitialize(

_Outptr_result_nullonfailure_ I** ppvObject,

TArg1 &&arg1,

TArg2 &&arg2,

TArg3 &&arg3,

TArg4 &&arg4,

TArg5 &&arg5,

TArg6 &&arg6,

TArg7 &&arg7,

TArg8 &&arg8,

TArg9 &&arg9) throw()

Параметры
T

Определяемый пользователем класс, наследуемый от WRL::RuntimeClass .

TArg1

Тип аргумента 1, который передается указанному классу среды выполнения.

TArg2

Тип аргумента 2, передаваемого указанному классу среды выполнения.


TArg3

Тип аргумента 3, передаваемого указанному классу среды выполнения.

TArg4

Тип аргумента 4, который передается указанному классу среды выполнения.

TArg5

Тип аргумента 5, передаваемого в указанный класс среды выполнения.

TArg6

Тип аргумента 6, который передается указанному классу среды выполнения.

TArg7

Тип аргумента 7, который передается указанному классу среды выполнения.

TArg8

Тип аргумента 8, который передается указанному классу среды выполнения.

TArg9

Тип аргумента 9, который передается в указанный класс среды выполнения.

arg1

Аргумент 1, передаваемый указанному классу среды выполнения.

arg2

Аргумент 2, передаваемый указанному классу среды выполнения.

arg3

Аргумент 3, передаваемый указанному классу среды выполнения.

arg4

Аргумент 4, передаваемый указанному классу среды выполнения.

arg5

Аргумент 5, передаваемый указанному классу среды выполнения.

arg6

Аргумент 6, передаваемый указанному классу среды выполнения.

arg7

Аргумент 7, передаваемый указанному классу среды выполнения.

arg8

Аргумент 8, передаваемый указанному классу среды выполнения.


arg9

Аргумент 9, передаваемый указанному классу среды выполнения.

Возвращаемое значение
Значение HRESULT.

Комментарии
Дополнительные сведения о различиях между этой функцией и
Microsoft::WRL::Make см. в статье How to: Instantiate WRL Components Directly
(Непосредственное создание экземпляров компонентов WRL), чтобы узнать о
различиях между этой функцией и Microsoft::WRL::Make и примером.

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
Класс ModuleBase
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

class ModuleBase;

Remarks
Представляет базовый класс классов Module .

Члены

Открытые конструкторы

name Описание

ModuleBase::ModuleBase Инициализирует экземпляр класса Module .

ModuleBase::~ModuleBase Деинициализирует текущий Module экземпляр класса .

Открытые методы

name Описание

ModuleBase::D При реализации уменьшает число объектов,


ecrementObjectCount отслеживаемых модулем.

ModuleBase::IncrementObjectCount При реализации увеличивает число объектов,


отслеживаемых модулем.

Иерархия наследования
ModuleBase

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

ModuleBase::~ModuleBase
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

virtual ~ModuleBase();

Комментарии
Деинициализирует текущий ModuleBase экземпляр класса .

ModuleBase::D ecrementObjectCount
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

virtual long DecrementObjectCount() = 0;

Возвращаемое значение
Счетчик перед операцией уменьшения.

Комментарии
При реализации уменьшает число объектов, отслеживаемых модулем.

ModuleBase::IncrementObjectCount
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

virtual long IncrementObjectCount() = 0;

Возвращаемое значение
Счетчик перед операцией приращения.

Комментарии
При реализации увеличивает число объектов, отслеживаемых модулем.

ModuleBase::ModuleBase
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

ModuleBase();

Комментарии
Инициализирует экземпляр класса Module .
Move - функция
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template<class T>

inline typename RemoveReference<T>::Type&& Move(

_Inout_ T&& arg

);

Параметры
T

Тип аргумента.

Arg

Аргумент для перемещения.

Возвращаемое значение
Аргумент параметра после ссылки или rvalue-reference признаки, если таковые
имеются, были удалены.

Комментарии
Перемещает указанный аргумент из одного расположения в другое.

Дополнительные сведения см. в разделе Семантика перемещениядекларатора


ссылок Rvalue: &&.

Требования
Заголовок: internal.h

Пространства имен: Microsoft::WRL::D etails


См. также раздел
Пространство имен Microsoft::WRL::D etails
Структура Nil
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

struct Nil;

Remarks
Используется для указания неопределенного необязательного параметра шаблона.

Nil — это пустая структура.

Иерархия наследования
Nil

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
RaiseException - функция
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

inline void __declspec(noreturn) RaiseException(

HRESULT hr,

DWORD dwExceptionFlags = EXCEPTION_NONCONTINUABLE);

Параметры
ч

Код исключения вызываемого исключения; то есть HRESULT неудачной операции.

dwExceptionFlags

Флаг, указывающий на непрерывное исключение (значение флага равно нулю) или


непреобразуемое исключение (значение флага не равно нулю). По умолчанию
исключение неконституируется.

Комментарии
Вызывает исключение в вызывающем потоке.

Дополнительные сведения см. в статье о функции Windows RaiseException .

Требования
Заголовок: internal.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
Класс RemoveIUnknown
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename T>

struct RemoveIUnknown;

template <typename T>

class RemoveIUnknown : public T;

Параметры
T

Класс .

Комментарии
Создает тип, эквивалентный IUnknown типу на основе , но имеющий невиртуальные
QueryInterface функции-члены , AddRef и Release .

По умолчанию com-методы предоставляют виртуальные QueryInterface методы ,


AddRef и Release . Однако для ComPtr не требуется нагрузка, связанная с
виртуальными методами. Интерфейс RemoveIUnknown исключает эту нагрузку,
предоставляя закрытые невиртуальные методы QueryInterface , AddRef и Release .

Элементы

Общедоступные определения типов

Имя Описание

ReturnType Синоним типа, эквивалентного параметру шаблона T , но имеет невиртуальные


IUnknown члены.
Иерархия наследования
T

RemoveIUnknown

Требования
Заголовок: client.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
RemoveReference - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template<class T>

struct RemoveReference;

template<class T>

struct RemoveReference<T&>;

template<class T>

struct RemoveReference<T&&>;

Параметры
T

Класс .

Комментарии
Удаляет свойство reference или rvalue-reference из указанного параметра шаблона
класса.

Элементы

Общедоступные определения типов

Имя Описание

Type Синоним для параметра шаблона класса.

Иерархия наследования
RemoveReference

Требования
Заголовок: internal.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
Структура RuntimeClassBase
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

struct RuntimeClassBase;

Remarks
Используется для обнаружения RuntimeClass в функции Make .

RuntimeClassBase — это пустая структура.

Иерархия наследования
RuntimeClassBase

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
Структура RuntimeClassBaseT
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <unsigned int RuntimeClassTypeT>

friend struct Details::RuntimeClassBaseT;

Параметры
RuntimeClassTypeT

Поле флагов, указывающее один или несколько перечислителей RuntimeClassType .

Комментарии
Предоставляет вспомогательные методы для операций QueryInterface и получения
идентификаторов интерфейсов.

Элементы

Защищенные методы

Имя Описание

RuntimeClassBaseT::AsIID Извлекает указатель на указанный идентификатор


интерфейса.

RuntimeClassBaseT::GetImplementedIIDS Извлекает массив идентификаторов интерфейсов,


реализованных указанным типом.

Иерархия наследования
RuntimeClassBaseT
Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

RuntimeClassBaseT::AsIID
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

template<typename T>

__forceinline static HRESULT AsIID(

_In_ T* implements,

REFIID riid,

_Deref_out_ void **ppvObject

);

Параметры
T

Тип, реализующий идентификатор интерфейса, заданный параметром riid.

Реализует

Переменная типа, заданного параметром шаблона T.

riid

Извлекаемый идентификатор интерфейса.

ppvObject

Если эта операция выполнена успешно, указатель на интерфейс, заданный


параметром riid.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — HRESULT,
описывающий ошибку.

Комментарии
Извлекает указатель на указанный идентификатор интерфейса.
RuntimeClassBaseT::GetImplementedIIDS
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

template<typename T>

__forceinline static HRESULT GetImplementedIIDS(

_In_ T* implements,

_Out_ ULONG *iidCount,

_Deref_out_ _Deref_post_cap_(*iidCount) IID **iids

);

Параметры
T

Тип реализующего параметра.

Реализует

Указатель на тип, заданный параметром T.

iidCount

Максимальное число идентификаторов интерфейсов для извлечения.

iids

Если эта операция завершается успешно, массив идентификаторов интерфейсов,


реализованных с типом T.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — HRESULT,
описывающий ошибку.

Комментарии
Извлекает массив идентификаторов интерфейсов, реализованных указанным
типом.
Функция Swap (WRL)
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

WRL_NOTHROW inline void Swap(

_Inout_ T& left,

_Inout_ T& right

);

Параметры
left

Первый аргумент.

right

Второй аргумент.

Возвращаемое значение

Комментарии
Обмен значениями двух указанных аргументов.

Требования
Заголовок: internal.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
Функция TerminateMap
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

inline bool TerminateMap(

_In_ ModuleBase *module,

_In_opt_z_ const wchar_t *serverName,

bool forceTerminate) throw()

Параметры
Модуль

Модуль.

serverName

Имя подмножества фабрик классов в модуле, заданном модулем параметров.

forceTerminate

true для завершения работы фабрик классов независимо от того, являются ли они

активными; false значение , чтобы не завершать работу фабрик классов, если


какая-либо фабрика активна.

Возвращаемое значение
true значение , если все фабрики классов были прерваны; в противном случае —

false .

Комментарии
Завершает работу фабрик классов в указанном модуле.

Требования
Заголовок: module.h

Пространства имен: Microsoft::WRL::D etails

См. также раздел


Пространство имен Microsoft::WRL::D etails
VerifyInheritanceHelper - структура
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename I, typename Base>

struct VerifyInheritanceHelper;

template <typename I>

struct VerifyInheritanceHelper<I, Nil>;

Параметры
I

Тип.

Базы

Другой тип.

Комментарии
Проверяет, является ли один интерфейс производным от другого интерфейса.

Элементы

Открытые методы

name Описание

VerifyInheritanceHelper::Verify Проверяет два интерфейса, заданных текущими параметрами


шаблона, и определяет, является ли один интерфейс
производным от другого.

Иерархия наследования
VerifyInheritanceHelper

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

VerifyInheritanceHelper::Verify
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

static void Verify();

Комментарии
Проверяет два интерфейса, заданных текущими параметрами шаблона, и
определяет, является ли один интерфейс производным от другого.

Если это условие не выполняется, выдается ошибка.


VerifyInterfaceHelper - структура
Статья • 03.04.2023

Поддерживает среда выполнения Windows инфраструктуру библиотеки шаблонов


C++ и не предназначен для использования непосредственно из кода.

Синтаксис
C++

template <bool isWinRTInterface, typename I>

struct VerifyInterfaceHelper;

template <typename I>

struct VerifyInterfaceHelper<false, I>;

Параметры
I

Интерфейс для проверки.

isWinRTInterface

Комментарии
Проверяет, соответствует ли интерфейс, указанный параметром шаблона,
определенным требованиям.

Элементы

Открытые методы

name Описание

Метод Проверяет, отвечает ли определенным требованиям интерфейс,


VerifyInterfaceHelper::Verify заданный текущим параметром шаблона.

Иерархия наследования
VerifyInterfaceHelper

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

VerifyInterfaceHelper::Verify
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

static void Verify();

Комментарии
Проверяет, отвечает ли определенным требованиям интерфейс, заданный текущим
параметром шаблона.
Класс WeakReference
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

class WeakReference;

Remarks
Представляет слабую ссылку, которую можно использовать с среда выполнения
Windows или классической моделью COM. Слабая ссылка представляет собой
объект, который может быть доступен или недоступен.

Объект WeakReference поддерживает строгой ссылку, которая является указателем


на объект, и число строгих ссылок, которое представляет собой количество копий
строгой ссылки, которые были распределены методом Resolve() . Хотя число
строгих ссылок не равно нулю, строгой ссылка допустима, а объект доступен. Когда
число строгих ссылок становится нулевым, строгой ссылка становится
недопустимой, а объект становится недоступным.

Объект WeakReference обычно используется для представления объекта,


существование которого контролируется внешним потоком или приложением.
Например, создайте WeakReference объект из ссылки на файловый объект. Пока
открыт файл, строгая ссылка является действительной. Но если закрыть файл,
строгая ссылка станет недействительной.

Методы WeakReference являются потокобезопасными.

Члены

Открытые конструкторы

name Описание
name Описание

WeakReference::WeakReference Инициализирует новый экземпляр класса WeakReference .

WeakReference::~WeakReference Деинициализирует (уничтожает) текущий WeakReference


экземпляр класса .

Открытые методы

name Описание

WeakReference::D Уменьшает число строгих ссылок текущего


ecrementStrongReference WeakReference объекта.

WeakReference::IncrementStrongReference Увеличивает число строгих ссылок текущего


WeakReference объекта.

WeakReference::Resolve Задает указанный указатель на текущее значение


строгой ссылки, если счетчик строгих ссылок не
равен нулю.

WeakReference::SetUnknown Задает строгой ссылку текущего WeakReference


объекта на указанный указатель интерфейса.

Иерархия наследования
WeakReference

Требования
Заголовок: implements.h

Пространства имен: Microsoft::WRL::D etails

WeakReference::~WeakReference
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

virtual ~WeakReference();

Возвращаемое значение

Комментарии
Деинициализирует текущий WeakReference экземпляр класса .

WeakReference::D ecrementStrongReference
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

ULONG DecrementStrongReference();

Комментарии
Уменьшает число строгих ссылок текущего WeakReference объекта.

Когда число строгих ссылок становится нулевым, строгой ссылке присваивается


значение nullptr .

Возвращаемое значение
Уменьшенное число строгих ссылок.

WeakReference::IncrementStrongReference
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

ULONG IncrementStrongReference();

Возвращаемое значение
Увеличенное число строгих ссылок.
Комментарии
Увеличивает число строгих ссылок текущего WeakReference объекта.

WeakReference::Resolve
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

STDMETHOD(Resolve)

(REFIID riid,

_Deref_out_opt_ IInspectable **ppvObject

);

Параметры
riid

Идентификатор интерфейса.

ppvObject

После завершения этой операции копия текущей строгой ссылки, если число
надежных ссылок не равно нулю.

Возвращаемое значение
S_OK, если эта операция выполнена успешно, а число надежных ссылок равно
нулю. Параметр ppvObject имеет значение nullptr .

S_OK, если эта операция выполнена успешно, а число надежных ссылок не


равно нулю. Параметру ppvObject присваивается строжная ссылка.

В противном случае — HRESULT, указывающее причину сбоя операции.

Комментарии
Задает указанный указатель на текущее значение строгой ссылки, если счетчик
строгих ссылок не равен нулю.

WeakReference::SetUnknown
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

void SetUnknown(

_In_ IUnknown* unk

);

Параметры
Unk

Указатель на IUnknown интерфейс объекта .

Комментарии
Задает строгой ссылку текущего WeakReference объекта на указанный указатель
интерфейса.

WeakReference::WeakReference
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

WeakReference();

Комментарии
Инициализирует новый экземпляр класса WeakReference .

Надежный указатель ссылки для объекта инициализируется WeakReference


значением nullptr , а счетчик строгих ссылок инициализируется значением 1.
Пространство имен
Microsoft::WRL::Wrappers
Статья • 03.04.2023

Определяет оболочки типа "Получение ресурса есть инициализация" (RAII),


которые упрощают управление временем существования объектов, строк и
дескрипторов.

Синтаксис
C++

namespace Microsoft::WRL::Wrappers;

Члены

Определения типов

Имя Описание

FileHandle HandleT<HandleTraits::FileHandleTraits>

Классы

name Описание

Класс Представляет объект критического раздела.


CriticalSection

Класс событий Представляет событие.


(WRL)

Класс HandleT Представляет дескриптор объекта.

Класс HString Обеспечивает поддержку управления дескрипторами HSTRING.

Класс Представляет объект HSTRING, созданный из существующей строки.


HStringReference
name Описание

Класс мьютекса Представляет объект синхронизации, который исключительно


управляет общим ресурсом.

Класс Инициализирует среда выполнения Windows.


RoInitializeWrapper

Класс семафора Представляет объект синхронизации, который управляет общим


ресурсом и поддерживает ограниченное число пользователей.

Класс SRWLock Представляет тонкую блокировку чтения и записи.

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers

См. также раздел


Пространство имен Microsoft::WRL
CriticalSection - класс
Статья • 03.04.2023

Представляет объект критического раздела.

Синтаксис
C++

class CriticalSection;

Члены

Конструктор

Имя Описание

CriticalSection::CriticalSection Инициализирует объект синхронизации, который похож на


объект мьютекса, но может использоваться только потоками
одного процесса.

CriticalSection::~CriticalSection Деинициализирует и уничтожает текущий CriticalSection


объект.

Открытые методы

name Описание

CriticalSection::IsValid Указывает, является ли текущий критический раздел допустимым.

CriticalSection::Lock Ожидает владельца указанного объекта критического раздела.


Функция возвращает, когда вызывающему потоку предоставлено
право собственности.

CriticalSection::TryLock Пытается войти в критически важный раздел без блокировки. Если


вызов выполнен успешно, вызывающий поток берет на себя
ответственность за критически важный раздел.

Защищенные члены данных


Имя Описание

CriticalSection::cs_ Объявляет элемент данных критического раздела.

Иерархия наследования
CriticalSection

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers

CriticalSection::~CriticalSection
Деинициализирует и уничтожает текущий CriticalSection объект.

C++

WRL_NOTHROW ~CriticalSection();

CriticalSection::CriticalSection
Инициализирует объект синхронизации, который похож на объект мьютекса, но
может использоваться только потоками одного процесса.

C++

explicit CriticalSection(

ULONG spincount = 0

);

Параметры
spincount

Счетчик прокруток для объекта критической секции. Значение по умолчанию — 0.

Комментарии
Дополнительные сведения о критических разделах и спин-счетчиках см
InitializeCriticalSectionAndSpinCount . в функции в Synchronization разделе
Documenation API Windows.

CriticalSection::cs_
Объявляет элемент данных критического раздела.

C++

CRITICAL_SECTION cs_;

Комментарии
Эти данные-член защищены.

CriticalSection::IsValid
Указывает, является ли текущий критический раздел допустимым.

C++

bool IsValid() const;

Возвращаемое значение
По умолчанию всегда возвращает . true

CriticalSection::Lock
Ожидает владельца указанного объекта критического раздела. Функция
возвращает, когда вызывающему потоку предоставлено право собственности.

C++

SyncLock Lock();

static SyncLock Lock(

_In_ CRITICAL_SECTION* cs

);

Параметры
Cs

Определенный пользователем объект критической секции.

Возвращаемое значение
Объект блокировки, который можно использовать, чтобы разблокировать текущую
критическую секцию.

Комментарии
Первая функция Lock влияет на текущий объект критической секции. Вторая
функция Lock влияет на указанную пользователем критическую секцию.

CriticalSection::TryLock
Пытается войти в критически важный раздел без блокировки. Если вызов
выполнен успешно, вызывающий поток берет на себя ответственность за
критически важный раздел.

C++

SyncLock TryLock();

static SyncLock TryLock(

_In_ CRITICAL_SECTION* cs

);

Параметры
Cs

Определенный пользователем объект критической секции.

Возвращаемое значение
Ненулевое значение, если критический раздел успешно введен или текущий поток
уже владеет критическим разделом. Ноль, если критический раздел уже
принадлежит другому потоку.
Комментарии
Первая функция TryLock влияет на текущий объект критической секции. Вторая
функция TryLock влияет на указанную пользователем критическую секцию.
Класс событий (WRL)
Статья • 03.04.2023

Представляет событие.

Синтаксис
C++

class Event : public HandleT<HandleTraits::EventTraits>;

Члены

Открытые конструкторы

name Описание

Event::Event Инициализирует новый экземпляр класса Event .

Открытые операторы

Имя Описание

Event::operator= Назначает указанную Event ссылку текущему Event экземпляру.

Иерархия наследования
HandleT

Event

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers


Event::Event
Инициализирует новый экземпляр класса Event .

C++

explicit Event(

HANDLE h = HandleT::Traits::GetInvalidValue()

);

WRL_NOTHROW Event(

_Inout_ Event&& h

);

Параметры
h

Дескриптор события. По умолчанию h инициализируется значением nullptr .

Event::operator=
Назначает указанную Event ссылку текущему Event экземпляру.

C++

WRL_NOTHROW Event& operator=(

_Inout_ Event&& h

);

Параметры
h

Ссылка rvalue на Event экземпляр.

Возвращаемое значение
Указатель на текущий Event экземпляр.
HandleT - класс
Статья • 03.04.2023

Представляет дескриптор объекта.

Синтаксис
C++

template <typename HandleTraits>

class HandleT;

Параметры
Признаки дескриптора

Экземпляр структуры HandleTraits , который определяет общие характеристики


дескриптора.

Элементы

Общедоступные определения типов

Имя Описание

Traits Синоним для HandleTraits .

Открытые конструкторы

name Описание

HandleT::HandleT Инициализирует новый экземпляр класса HandleT .

HandleT::~HandleT Деинициализирует экземпляр HandleT класса .

Открытые методы

name Описание
name Описание

HandleT::Attach Связывает указанный дескриптор с текущим HandleT объектом .

HandleT::Close Закрывает текущий объект HandleT .

HandleT::D etach Отменяет связь текущего HandleT объекта с его базовым дескриптором.

HandleT::Get Возвращает значение базового дескриптора.

HandleT::IsValid Указывает, представляет ли текущий HandleT объект дескриптор.

Защищенные методы

Имя Описание

HandleT::InternalClose Закрывает текущий объект HandleT .

Открытые операторы

Имя Описание

HandleT::operator= Перемещает значение указанного HandleT объекта в текущий HandleT


объект .

Защищенные члены данных

Имя Описание

HandleT::handle_ Содержит дескриптор, представленный HandleT объектом .

Иерархия наследования
HandleT

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers


HandleT::~HandleT
Деинициализирует экземпляр HandleT класса .

C++

~HandleT();

HandleT::Attach
Связывает указанный дескриптор с текущим HandleT объектом .

C++

void Attach(

typename HandleTraits::Type h

);

Параметры
h

Дескриптор.

HandleT::Close
Закрывает текущий объект HandleT .

C++

void Close();

Комментарии
Дескриптор, лежащий в основе текущего HandleT , закрывается, а HandleT для
присваивается недопустимое состояние.

Если дескриптор не закрывается правильно, возникает исключение в вызывающем


потоке.
HandleT::D etach
Отменяет связь текущего HandleT объекта с его базовым дескриптором.

C++

typename HandleTraits::Type Detach();

Возвращаемое значение
Базовый дескриптор.

Комментарии
После завершения этой операции текущий HandleT объект устанавливается в
недопустимое состояние.

HandleT::Get
Возвращает значение базового дескриптора.

C++

typename HandleTraits::Type Get() const;

Возвращаемое значение
Дескриптор.

HandleT::handle_
Содержит дескриптор, представленный HandleT объектом .

C++

typename HandleTraits::Type handle_;

HandleT::HandleT
Инициализирует новый экземпляр класса HandleT .

C++

explicit HandleT(

typename HandleTraits::Type h =

HandleTraits::GetInvalidValue()

);

HandleT(

_Inout_ HandleT&& h

);

Параметры
h

Дескриптор.

Комментарии
Первый конструктор инициализирует HandleT объект, который не является
допустимым дескриптором для объекта . Второй конструктор создает новый
HandleT объект из параметра h.

HandleT::InternalClose
Закрывает текущий объект HandleT .

C++

virtual bool InternalClose();

Возвращаемое значение
true Значение , если текущий HandleT объект успешно закрыт; в противном случае

— значение false .

Комментарии
InternalClose() имеет значение protected .
HandleT::IsValid
Указывает, представляет ли текущий HandleT объект дескриптор.

C++

bool IsValid() const;

Возвращаемое значение
true Значение , HandleT если представляет дескриптор; в противном случае —

значение false .

HandleT::operator=
Перемещает значение указанного HandleT объекта в текущий HandleT объект .

C++

HandleT& operator=(

_Inout_ HandleT&& h

);

Параметры
h

Ссылка rvalue на дескриптор.

Возвращаемое значение
Ссылка на текущий HandleT объект .

Комментарии
Эта операция делает недействительным объект, заданный HandleT параметром h.
Класс HString
Статья • 03.04.2023

Вспомогательный класс для управления временем существования HSTRING с


помощью шаблона RAII.

Синтаксис
C++

class HString;

Remarks
Среда выполнения Windows предоставляет доступ к строкам через дескрипторы
HSTRING. Класс предоставляет удобные HString функции и операторы для
упрощения с помощью дескрипторов HSTRING. Этот класс может обрабатывать
время существования объекта HSTRING, принадлежащего ему, с помощью
шаблона RAII.

Члены

Открытые конструкторы

name Описание

HString::HString Инициализирует новый экземпляр класса HString .

HString::~HString Уничтожает текущий HString экземпляр класса .

Открытые методы

name Описание

HString::Attach Связывает указанный HString объект с текущим HString объектом .

HString::CopyTo Копирует текущий HString объект в объект HSTRING.


name Описание

HString::D etach Отменяет связь указанного HString объекта с его базовым


значением.

HString::Get Извлекает значение базового дескриптора HSTRING.

HString::GetAddressOf Извлекает указатель на базовый дескриптор HSTRING.

HString::GetRawBuffer Извлекает указатель на базовые строковые данные.

HString::IsValid Указывает, является ли текущий HString объект допустимым.

HString::MakeReference Создает HStringReference объект из указанного строкового


параметра.

HString::Release Удаляет базовое строковое значение и инициализирует текущий


HString объект пустым значением.

HString::Set Задает для текущего HString объекта значение указанной строки


или HString параметра с расширенными символами.

Открытые операторы

Имя Описание

HString::operator= Перемещает значение другого HString объекта в текущий HString


объект .

HString::operator== Указывает, равны ли два параметра.

HString::operator!= Указывает, равны ли два параметра.

HString::operator< Указывает, меньше ли первый параметр, чем второй.

Иерархия наследования
HString

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers


HString::~HString
Уничтожает текущий HString экземпляр класса .

C++

~HString() throw()

HString::Attach
Связывает указанный HString объект с текущим HString объектом .

C++

void Attach(

HSTRING hstr

) throw()

Параметры
hstr

Существующий объект HString .

HString::CopyTo
Копирует текущий HString объект в объект HSTRING.

C++

HRESULT CopyTo(

_Out_ HSTRING *str

) const throw();

Параметры
str

Объект HSTRING, получающий копию.

Комментарии
Этот метод вызывает функцию WindowsDuplicateString .

HString::D etach
Отменяет связь указанного HString объекта с его базовым значением.

C++

HSTRING Detach() throw()

Возвращаемое значение
Базовое HString значение перед началом операции отсоединения.

HString::Get
Извлекает значение базового дескриптора HSTRING.

C++

HSTRING Get() const throw()

Возвращаемое значение
Значение базового дескриптора HSTRING.

HString::GetAddressOf
Извлекает указатель на базовый дескриптор HSTRING.

C++

HSTRING* GetAddressOf() throw()

Возвращаемое значение
Указатель на базовый дескриптор HSTRING.

Комментарии
После этой операции строковое значение базового дескриптора HSTRING будет
уничтожено.

HString::GetRawBuffer
Извлекает указатель на базовые строковые данные.

C++

const wchar_t* GetRawBuffer(unsigned int* length) const;

Параметры
Длина Указатель на переменную int , которая получает длину данных.

Возвращаемое значение
Указатель const на базовые строковые данные.

HString::HString
Инициализирует новый экземпляр класса HString .

C++

HString() throw();

HString(HString&& other) throw();

Параметры
hstr

Дескриптор HSTRING.

Других

Существующий объект HString .

Комментарии
Первый конструктор инициализирует пустой HString объект.
Второй конструктор инициализирует новый HString объект значением
существующего другого параметра, а затем удаляет другой параметр.

HString::IsValid
Указывает, является ли текущий HString объект пустым.

C++

bool IsValid() const throw()

Параметры
true Значение , если текущий HString объект не пуст; в противном случае —

значение false .

HString::MakeReference
Создает HStringReference объект из указанного строкового параметра.

C++

template<unsigned int sizeDest>

static HStringReference MakeReference(

wchar_t const (&str)[ sizeDest]);

template<unsigned int sizeDest>

static HStringReference MakeReference(

wchar_t const (&str)[sizeDest],

unsigned int len);

Параметры
sizeDest

Параметр шаблона, указывающий размер буфера назначения HStringReference .

str

Ссылка на строку расширенных символов.

len

Максимальная длина буфера параметров str для использования в этой операции.


Если параметр len не указан, используется весь параметр str .
Возвращаемое значение
Объект HStringReference , значение которого совпадает со значением указанного
параметра str .

Оператор HString::operator=
Перемещает значение другого HString объекта в текущий HString объект .

C++

HString& operator=(HString&& other) throw()

Параметры
Других

Существующий объект HString .

Комментарии
Значение существующего другого объекта копируется в текущий HString объект, а
затем другой объект уничтожается.

Оператор HString::operator==
Указывает, равны ли два параметра.

C++

inline bool operator==(

const HString& lhs,

const HString& rhs) throw()

inline bool operator==(

const HString& lhs,

const HStringReference& rhs) throw()

inline bool operator==(

const HStringReference& lhs,

const HString& rhs) throw()

inline bool operator==(

const HSTRING& lhs,

const HString& rhs) throw()

inline bool operator==(

const HString& lhs,

const HSTRING& rhs) throw()

Параметры
Lhs

Первый сравниваемый параметр. lhs может быть HString объектом или


HStringReference дескриптором HSTRING.

Rhs

Второй сравниваемый параметр. rhs может быть HString объектом или


HStringReference или дескриптором HSTRING.

Возвращаемое значение
true Значение , если параметры lhs и rhs равны; в противном случае — false .

Оператор HString::operator!=
Указывает, равны ли два параметра.

C++

inline bool operator!=( const HString& lhs,

const HString& rhs) throw()

inline bool operator!=( const HStringReference& lhs,

const HString& rhs) throw()

inline bool operator!=( const HString& lhs,

const HStringReference& rhs) throw()

inline bool operator!=( const HSTRING& lhs,

const HString& rhs) throw()

inline bool operator!=( const HString& lhs,

const HSTRING& rhs) throw()

Параметры
Lhs

Первый сравниваемый параметр. lhs может быть HString объектом или


HStringReference дескриптором HSTRING.

Rhs

Второй сравниваемый параметр. rhs может быть HString объектом или


HStringReference или дескриптором HSTRING.

Возвращаемое значение
true Значение , если параметры lhs и rhs не равны; в противном случае — false .

Оператор HString::operator<
Указывает, меньше ли первый параметр, чем второй.

C++

inline bool operator<(

const HString& lhs,

const HString& rhs) throw()

Параметры
Lhs

Первый сравниваемый параметр. lhs может быть ссылкой на HString .

Rhs

Второй сравниваемый параметр. rhs может быть ссылкой на HString .

Возвращаемое значение
true Значение , если параметр lhs меньше параметра rhs ; в противном случае —

false .

HString::Release
Удаляет базовое строковое значение и инициализирует текущий HString объект
пустым значением.

C++

void Release() throw()

HString::Set
Задает для текущего HString объекта значение указанной строки или HString
параметра с расширенными символами.

C++

HRESULT Set(

const wchar_t* str) throw();

HRESULT Set(

const wchar_t* str,

unsigned int len

) throw();

HRESULT Set(

const HSTRING& hstr

) throw();

Параметры
str

Строка расширенных символов.

len

Максимальная длина параметра str , назначенного текущему HString объекту.

hstr

Существующий объект HString .


Класс HStringReference
Статья • 03.04.2023

Представляет объект HSTRING, созданный из существующей строки.

Синтаксис
C++

class HStringReference;

Remarks
Время существования резервного буфера в новом HSTRING не управляется среда
выполнения Windows. Вызывающий объект выделяет исходную строку в кадре
стека, чтобы избежать выделения кучи и исключить риск утечки памяти. Кроме
того, вызывающий объект должен убедиться, что исходная строка остается
неизменной в течение всего времени существования присоединенного объекта
HSTRING. Дополнительные сведения см. в статье Функция
WindowsCreateStringReference.

Члены

Открытые конструкторы

name Описание

HStringReference::HStringReference Инициализирует новый экземпляр класса


HStringReference .

Открытые методы

Член Описание

HStringReference::CopyTo Копирует текущий HStringReference объект в объект


HSTRING.

HStringReference::Get Извлекает значение базового дескриптора HSTRING.


Член Описание

HStringReference::GetRawBuffer Извлекает указатель на базовые строковые данные.

Открытые операторы

Имя Описание

HStringReference::operator= Перемещает значение другого HStringReference объекта в


текущий HStringReference объект .

HStringReference::operator== Указывает, равны ли два параметра.

HStringReference::operator!= Указывает, равны ли два параметра.

HStringReference::operator< Указывает, меньше ли первый параметр, чем второй.

Иерархия наследования
HStringReference

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers

HStringReference::CopyTo
Копирует текущий HStringReference объект в объект HSTRING.

C++

HRESULT CopyTo(

_Out_ HSTRING *str

) const throw();

Параметры
str

Объект HSTRING, получающий копию.


Комментарии
Этот метод вызывает функцию WindowsDuplicateString .

HStringReference::Get
Извлекает значение базового дескриптора HSTRING.

C++

HSTRING Get() const throw()

Возвращаемое значение
Значение базового дескриптора HSTRING.

HStringReference::GetRawBuffer
Извлекает указатель на базовые строковые данные.

C++

const wchar_t* GetRawBuffer(unsigned int* length) const;

Параметры
Длина Указатель на переменную int , которая получает длину данных.

Возвращаемое значение
Указатель const на базовые строковые данные.

HStringReference::HStringReference
Инициализирует новый экземпляр класса HStringReference .

C++

template<unsigned int sizeDest>

HStringReference(wchar_t const (&str)[ sizeDest]) throw();

template<unsigned int sizeDest>

HStringReference(wchar_t const (&str)[ sizeDest],

unsigned int len) throw();

HStringReference(HStringReference&& other) throw();

Параметры
sizeDest

Параметр шаблона, указывающий размер буфера назначения HStringReference .

str

Ссылка на строку расширенных символов.

len

Максимальная длина буфера параметров str для использования в этой операции.


Если параметр len не указан, используется весь параметр str . Если значение len
больше , чем sizeDest, len имеет значение sizeDest-1.

Других

Другой HStringReference объект.

Комментарии
Первый конструктор инициализирует новый HStringReference объект того же
размера, что и параметр str.

Второй конструктор инициализирует новый HStringReference объект, размер


который определяется параметром len.

Третий конструктор инициализирует новый HStringReference объект значением


другого параметра, а затем уничтожает другой параметр.

HStringReference::operator=
Перемещает значение другого HStringReference объекта в текущий
HStringReference объект .

C++

HStringReference& operator=(HStringReference&& other) throw()

Параметры
Других

Существующий объект HStringReference .

Комментарии
Значение существующего другого объекта копируется в текущий HStringReference
объект, а затем другой объект уничтожается.

HStringReference::operator==
Указывает, равны ли два параметра.

C++

inline bool operator==(

const HStringReference& lhs,

const HStringReference& rhs) throw()

inline bool operator==(

const HSTRING& lhs,

const HStringReference& rhs) throw()

inline bool operator==(

const HStringReference& lhs,

const HSTRING& rhs) throw()

Параметры
Lhs

Первый сравниваемый параметр. lhs может быть HStringReference объектом или


дескриптором HSTRING.

Rhs

Второй сравниваемый параметр. rhs может быть HStringReference объектом или


дескриптором HSTRING.

Возвращаемое значение
true Значение , если параметры lhs и rhs равны; в противном случае — false .
HStringReference::operator!=
Указывает, равны ли два параметра.

C++

inline bool operator!=(

const HStringReference& lhs,

const HStringReference& rhs) throw()

inline bool operator!=(

const HSTRING& lhs,

const HStringReference& rhs) throw()

inline bool operator!=(

const HStringReference& lhs,

const HSTRING& rhs) throw()

Параметры
Lhs

Первый сравниваемый параметр. lhs может быть HStringReference объектом или


дескриптором HSTRING.

Rhs

Второй сравниваемый параметр. rhs может быть HStringReference объектом или


дескриптором HSTRING.

Возвращаемое значение
true Значение , если параметры lhs и rhs не равны; в противном случае — false .

HStringReference::operator<
Указывает, меньше ли первый параметр, чем второй.

C++

inline bool operator<(

const HStringReference& lhs,

const HStringReference& rhs) throw()

Параметры
Lhs

Первый сравниваемый параметр. lhs может быть ссылкой на HStringReference .

Rhs

Второй сравниваемый параметр. rhs может быть ссылкой на HStringReference .

Возвращаемое значение
true Значение , если параметр lhs меньше параметра rhs ; в противном случае —

false .
Класс Mutex
Статья • 03.04.2023

Представляет объект синхронизации, который исключительно управляет общим


ресурсом.

Синтаксис
C++

class Mutex : public HandleT<HandleTraits::MutexTraits>;

Члены

Общедоступные определения типов

Имя Описание

SyncLock Синоним класса, поддерживающего синхронные блокировки.

Открытый конструктор

Имя Описание

Mutex::Mutex Инициализирует новый экземпляр класса Mutex .

Открытые члены

Имя Описание

Mutex::Lock Ожидает, пока текущий объект или объект, связанный Mutex с указанным
дескриптором, не освобождает мьютекс или истерегает указанный интервал
времени ожидания.

Общедоступный оператор

Имя Описание
Имя Описание

Mutex::operator= Назначает (перемещает) указанный Mutex объект текущему Mutex


объекту.

Иерархия наследования
Mutex

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers

Mutex::Lock
Ожидает, пока текущий объект или объект, связанный Mutex с указанным
дескриптором, не освобождает мьютекс или истерегает указанный интервал
времени ожидания.

C++

SyncLock Lock(

DWORD milliseconds = INFINITE

);

static SyncLock Lock(

HANDLE h,

DWORD milliseconds = INFINITE

);

Параметры
milliseconds

Интервал времени ожидания в миллисекундах. Значение по умолчанию равно


INFINITE, что означает неограниченное время ожидания.

Дескриптор Mutex объекта .


Возвращаемое значение

Mutex::Mutex
Инициализирует новый экземпляр класса Mutex .

C++

explicit Mutex(

HANDLE h

);

Mutex(

_Inout_ Mutex&& h

);

Параметры
h

Дескриптор или rvalue-ссылка на дескриптор объекта Mutex .

Комментарии
Первый конструктор инициализирует Mutex объект из указанного дескриптора.
Второй конструктор инициализирует Mutex объект из указанного дескриптора, а
затем перемещает владение мьютексом в текущий Mutex объект .

Mutex::operator=
Назначает (перемещает) указанный Mutex объект текущему Mutex объекту.

C++

Mutex& operator=(

_Inout_ Mutex&& h

);

Параметры
h

Ссылка rvalue на Mutex объект .


Возвращаемое значение
Ссылка на текущий Mutex объект.

Комментарии
Дополнительные сведения см. в разделе Move Semantics статьи Rvalue Reference
Declarator: &&.
Класс RoInitializeWrapper
Статья • 03.04.2023

Инициализирует среда выполнения Windows.

Синтаксис
C++

class RoInitializeWrapper;

Remarks
RoInitializeWrapper — это удобство, которое инициализирует среда выполнения

Windows и возвращает HRESULT, указывающее, была ли операция успешной.


Поскольку деструктор класса вызывает ::Windows::Foundation::Uninitialize ,
экземпляры должны быть объявлены в области глобального RoInitializeWrapper
или верхнего уровня.

Члены

Открытые конструкторы

name Описание

RoInitializeWrapper::RoInitializeWrapper Инициализирует новый экземпляр класса


RoInitializeWrapper .

RoInitializeWrapper::~RoInitializeWrapper Уничтожает текущий RoInitializeWrapper


экземпляр класса .

Открытые операторы

Имя Описание

RoInitializeWrapper::HRESULT() Извлекает объект HRESULT, созданный конструктором


RoInitializeWrapper .
Иерархия наследования
RoInitializeWrapper

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers

RoInitializeWrapper::HRESULT()
Извлекает значение HRESULT, созданное последним RoInitializeWrapper
конструктором.

C++

operator HRESULT()

RoInitializeWrapper::RoInitializeWrapper
Инициализирует новый экземпляр класса RoInitializeWrapper .

C++

RoInitializeWrapper(RO_INIT_TYPE flags)

Параметры
flags

Одно из перечислений RO_INIT_TYPE, указывающее поддержку, предоставляемую


среда выполнения Windows.

Комментарии
Класс RoInitializeWrapper вызывает Windows::Foundation::Initialize(flags) .

RoInitializeWrapper::~RoInitializeWrapper
Неинициализирует среда выполнения Windows.

C++

~RoInitializeWrapper()

Комментарии
Класс RoInitializeWrapper вызывает Windows::Foundation::Uninitialize() .
Класс Semaphore
Статья • 03.04.2023

Представляет объект синхронизации, который управляет общим ресурсом и


поддерживает ограниченное число пользователей.

Синтаксис
C++

class Semaphore : public HandleT<HandleTraits::SemaphoreTraits>;

Члены

Общедоступные определения типов

Имя Описание

SyncLock Синоним класса, поддерживающего синхронные блокировки.

Открытые конструкторы

name Описание

Семафор::Семафор Инициализирует новый экземпляр класса Semaphore .

Открытые методы

name Описание

Семафор::Lock Ожидает, пока текущий объект или объект, связанный с указанным


дескриптором, не перейдет в состояние сигнала или не истедет указанный
интервал времени ожидания.

Открытые операторы

Имя Описание
Имя Описание

Semaphore::operator= Перемещает указанный дескриптор из Semaphore объекта в текущий


Semaphore объект .

Иерархия наследования
Semaphore

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers

Семафор::Lock
Ожидает, пока текущий объект или объект, связанный Semaphore с указанным
дескриптором, не перейдет в состояние сигнала или не истедет указанный
интервал времени ожидания.

C++

SyncLock Lock(

DWORD milliseconds = INFINITE

);

static SyncLock Lock(

HANDLE h,

DWORD milliseconds = INFINITE

);

Параметры
milliseconds

Интервал времени ожидания в миллисекундах. Значение по умолчанию равно


INFINITE, что означает неограниченное время ожидания.

Дескриптор Semaphore объекта.


Возвращаемое значение
Details::SyncLockWithStatusT<HandleTraits::SemaphoreTraits>

Semaphore::operator=
Перемещает указанный дескриптор из Semaphore объекта в текущий Semaphore
объект .

C++

Semaphore& operator=(

_Inout_ Semaphore&& h

);

Параметры
h

Ссылка Rvalue на Semaphore объект.

Возвращаемое значение
Ссылка на текущий Semaphore объект .

Семафор::Семафор
Инициализирует новый экземпляр класса Semaphore .

C++

explicit Semaphore(

HANDLE h

);

WRL_NOTHROW Semaphore(

_Inout_ Semaphore&& h

);

Параметры
h

Дескриптор или rvalue-ссылка на Semaphore объект.


SRWLock - класс
Статья • 03.04.2023

Представляет тонкую блокировку чтения и записи.

Синтаксис
C++

class SRWLock;

Remarks
Для синхронизации доступа между потоками к объекту или ресурсу используется
тонкая блокировка чтения или записи. Дополнительные сведения см. в разделе
Функции синхронизации.

Элементы

Общедоступные определения типов

Имя Описание

SyncLockExclusive Синоним объекта SRWLock , который получается в монопольном


режиме.

SyncLockShared Синоним объекта, полученного SRWLock в общем режиме.

Открытые конструкторы

name Описание

SRWLock::SRWLock Инициализирует новый экземпляр класса SRWLock .

SRWLock::~SRWLock Деинициализирует экземпляр SRWLock класса .

Открытые методы
name Описание

SRWLock::LockExclusive SRWLock Получает объект в монопольном режиме.

SRWLock::LockShared SRWLock Получает объект в общем режиме.

SRWLock::TryLockExclusive Пытается получить объект в монопольном SRWLock режиме для


текущего или указанного SRWLock объекта.

SRWLock::TryLockShared Пытается получить SRWLock объект в общем режиме для


текущего или указанного SRWLock объекта.

Элемент защищенных данных

Имя Описание

SRWLock::SRWLock_ Содержит базовую переменную блокировки для текущего SRWLock


объекта .

Иерархия наследования
SRWLock

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers

SRWLock::~SRWLock
Деинициализирует экземпляр SRWLock класса .

C++

~SRWLock();

SRWLock::LockExclusive
SRWLock Получает объект в монопольном режиме.
C++

SyncLockExclusive LockExclusive();

static SyncLockExclusive LockExclusive(

_In_ SRWLOCK* lock

);

Параметры
lock

Указатель на SRWLock объект .

Возвращаемое значение
Объект SRWLock в монопольном режиме.

SRWLock::LockShared
SRWLock Получает объект в общем режиме.

C++

SyncLockShared LockShared();

static SyncLockShared LockShared(

_In_ SRWLOCK* lock

);

Параметры
lock

Указатель на SRWLock объект .

Возвращаемое значение
Объект SRWLock в общем режиме.

SRWLock::SRWLock
Инициализирует новый экземпляр класса SRWLock .
C++

SRWLock();

SRWLock::SRWLock_
Содержит базовую переменную блокировки для текущего SRWLock объекта .

C++

SRWLOCK SRWLock_;

SRWLock::TryLockExclusive
Пытается получить объект в монопольном SRWLock режиме для текущего или
указанного SRWLock объекта. Если вызов выполнен успешно, вызывающий поток
берет на себя ответственность за блокировку.

C++

SyncLockExclusive TryLockExclusive();

static SyncLockExclusive TryLockExclusive(

_In_ SRWLOCK* lock

);

Параметры
lock

Указатель на SRWLock объект .

Возвращаемое значение
В случае успеха объект в монопольном SRWLock режиме и вызывающий поток
овладеют блокировкой. В противном случае — SRWLock объект, состояние которого
недопустимо.

SRWLock::TryLockShared
Пытается получить SRWLock объект в общем режиме для текущего или указанного
SRWLock объекта.

C++

WRL_NOTHROW SyncLockShared TryLockShared();

WRL_NOTHROW static SyncLockShared TryLockShared(

_In_ SRWLOCK* lock

);

Параметры
lock

Указатель на SRWLock объект .

Возвращаемое значение
В случае успеха SRWLock объект в режиме общего доступа и вызывающий поток
овладеют блокировкой. В противном случае — SRWLock объект, состояние которого
недопустимо.
Пространство имен
Microsoft::WRL::Wrappers::Details
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

namespace Microsoft::WRL::Wrappers::Details;

Члены

Классы

name Описание

Класс SyncLockT Представляет тип, который может принимать монопольное или


совместное владение ресурсом.

Класс Представляет тип, который может принимать монопольное или


SyncLockWithStatusT совместное владение ресурсом.

Методы

Имя Описание

Метод Сравнивает два указанных HSTRING объекта и возвращает целое


CompareStringOrdinal число, указывающее их относительное положение в порядке
сортировки.

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::D etails


См. также раздел
Пространство имен Microsoft::WRL::Wrappers
Метод CompareStringOrdinal
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

inline INT32 CompareStringOrdinal(

HSTRING lhs,

HSTRING rhs)

Параметры
Lhs

Первый объект HSTRING для сравнения.

Rhs

Второй объект HSTRING для сравнения.

Возвращаемое значение
Значение Условие

-1 Значение lhs меньше rhs.

0 lhs равно rhs.

1 lhs больше rhs.

Комментарии
Сравнивает два указанных объекта HSTRING и возвращает целое число,
указывающее их относительное положение в порядке сортировки.

Требования
Заголовок: corewrappers.h
Пространства имен: Microsoft::WRL::Wrappers::D etails

См. также раздел


Пространство имен Microsoft::WRL::Wrappers::D etails
SyncLockT - класс
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename SyncTraits>

class SyncLockT;

Параметры
Признаки синхронизации

Тип, который может стать владельцем ресурса.

Комментарии
Представляет тип, который может занимать монопольное или совместное
владение ресурсом.

Класс SyncLockT используется, например, для реализации класса SRWLock .

Члены

Открытые конструкторы

name Описание

SyncLockT::SyncLockT Инициализирует новый экземпляр класса SyncLockT .

SyncLockT::~SyncLockT Деинициализирует экземпляр SyncLockT класса .

Защищенные конструкторы

Имя Описание
Имя Описание

SyncLockT::SyncLockT Инициализирует новый экземпляр класса SyncLockT .

Открытые методы

name Описание

SyncLockt::IsLocked Указывает, принадлежит ли текущему SyncLockT объекту ресурс,


SyncLockT то есть объект заблокирован.

SyncLockT::Unlock Освобождает управление ресурсом, удерживаемым текущим SyncLockT


объектом , если таковой есть.

Защищенные члены данных

Имя Описание

SyncLockT::sync_ Содержит базовый ресурс, представленный классом SyncLockT .

Иерархия наследования
SyncLockT

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::D etails

SyncLockT::~SyncLockT
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

~SyncLockT();

Комментарии
Деинициализирует экземпляр SyncLockT класса .

Этот деструктор также разблокирует текущий SyncLockT экземпляр.

SyncLockt::IsLocked
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

bool IsLocked() const;

Возвращаемое значение
true , если SyncLockT , объект заблокирован, в противном случае — false .

Комментарии
Указывает, принадлежит ли текущему SyncLockT объекту ресурс, SyncLockT то есть
объект заблокирован.

SyncLockT::sync_
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

typename SyncTraits::Type sync_;

Комментарии
Содержит базовый ресурс, представленный классом SyncLockT .

SyncLockT::SyncLockT
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.
C++

SyncLockT(

_Inout_ SyncLockT&& other

);

explicit SyncLockT(

typename SyncTraits::Type sync = SyncTraits::GetInvalidValue()

);

Параметры
Других

Ссылка rvalue на другой SyncLockT объект.

Синхронизации

Ссылка на другой SyncLockWithStatusT объект.

Комментарии
Инициализирует новый экземпляр класса SyncLockT .

Первый конструктор инициализирует текущий SyncLockT объект из другого


SyncLockT объекта, указанного параметром other, а затем делает его SyncLockT

недействительным. Второй конструктор — инициализирует protected текущий


SyncLockT объект в недопустимом состоянии.

SyncLockT::Unlock
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

void Unlock();

Комментарии
Освобождает управление ресурсом, удерживаемым текущим SyncLockT объектом ,
если таковой есть.
Класс SyncLockWithStatusT
Статья • 03.04.2023

Поддерживает инфраструктуру WRL и не предназначена для использования


непосредственно из кода.

Синтаксис
C++

template <typename SyncTraits>

class SyncLockWithStatusT : public SyncLockT<SyncTraits>;

Параметры
Признаки синхронизации

Тип, который может принимать монопольное или совместное владение ресурсом.

Комментарии
Представляет тип, который может принимать монопольное или совместное
владение ресурсом.

Класс SyncLockWithStatusT используется для реализации классов Mutex и


Semaphore .

Члены

Открытые конструкторы

name Описание

SyncLockWithStatusT::SyncLockWithStatusT Инициализирует новый экземпляр класса


SyncLockWithStatusT .

Защищенные конструкторы

Имя Описание
Имя Описание

SyncLockWithStatusT::SyncLockWithStatusT Инициализирует новый экземпляр класса


SyncLockWithStatusT .

Открытые методы

name Описание

SyncLockWithStatusT::GetStatus Извлекает состояние ожидания текущего


SyncLockWithStatusT объекта.

SyncLockWithStatusT::IsLocked Указывает, принадлежит ли текущий SyncLockWithStatusT


объект ресурсу, SyncLockWithStatusT то есть объект
заблокирован.

Защищенные члены данных

Имя Описание

SyncLockWithStatusT::status_ Содержит результат базовой операции ожидания после


операции блокировки объекта на основе текущего
SyncLockWithStatusT объекта.

Иерархия наследования
SyncLockT

SyncLockWithStatusT

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::D etails

SyncLockWithStatusT::GetStatus
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++
DWORD GetStatus() const;

Возвращаемое значение
Результат операции ожидания для объекта, основанного SyncLockWithStatusT на
классе , например Mutex или Semaphore. Ноль (0) означает, что операция
ожидания вернула состояние сигнала; в противном случае произошло другое
состояние, например истекло время ожидания.

Комментарии
Извлекает состояние ожидания текущего SyncLockWithStatusT объекта.

Функция GetStatus() извлекает значение базового элемента данных status_ . Когда


объект, основанный SyncLockWithStatusT на классе , выполняет операцию
блокировки, объект сначала ожидает, пока объект станет доступным. Результат
этой операции ожидания хранится в элементе status_ данных. Возможные
значения status_ элемента данных являются возвращаемыми значениями
операции ожидания. Дополнительные сведения см. в разделе Возвращаемые
WaitForSingleObjectEx значения функции.

SyncLockWithStatusT::IsLocked
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

bool IsLocked() const;

Комментарии
Указывает, принадлежит ли текущий SyncLockWithStatusT объект ресурсу,
SyncLockWithStatusT то есть объект заблокирован.

Возвращаемое значение
true , если SyncLockWithStatusT , объект заблокирован, в противном случае — false .
SyncLockWithStatusT::status_
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

DWORD status_;

Комментарии
Содержит результат базовой операции ожидания после операции блокировки
объекта на основе текущего SyncLockWithStatusT объекта.

SyncLockWithStatusT::SyncLockWithStatusT
Поддерживает инфраструктуру WRL и не предназначена для использования
непосредственно из кода.

C++

SyncLockWithStatusT(

_Inout_ SyncLockWithStatusT&& other

);

explicit SyncLockWithStatusT(

typename SyncTraits::Type sync,

DWORD status

);

Параметры
Других

Ссылка rvalue на другой SyncLockWithStatusT объект.

Синхронизации

Ссылка на другой SyncLockWithStatusT объект.

status

Значение status_ элемент данных другого параметра или параметра sync .

Комментарии
Инициализирует новый экземпляр класса SyncLockWithStatusT .

Первый конструктор инициализирует текущий SyncLockWithStatusT объект из


другого SyncLockWithStatusT объекта, указанного параметром other, а затем делает
его SyncLockWithStatusT недействительным. Второй конструктор — , protected и
инициализирует текущий SyncLockWithStatusT объект в недопустимом состоянии.
Пространство имен
Microsoft::WRL::Wrappers::HandleTraits
Статья • 03.04.2023

Описывает характеристики общих типов ресурсов на основе дескрипторов.

Синтаксис
C++

namespace Microsoft::WRL::Wrappers::HandleTraits;

Члены

Структуры

Имя Описание

CriticalSectionTraits - Специализируется на объекте CriticalSection для поддержки


структура недопустимого критического раздела или функции для
освобождения критического раздела.

EventTraits - структура Определяет характеристики дескриптора Event класса.

FileHandleTraits - Определяет характеристики дескриптора файла.


структура

HANDLENullTraits - Определяет общие характеристики неинициализированного


структура дескриптора.

HANDLETraits - Определяет общие характеристики дескриптора.


структура

MutexTraits - Определяет общие характеристики класса Mutex .


структура

SemaphoreTraits - Определяет общие характеристики объекта семафора.


структура

SRWLockExclusiveTraits Описание общих характеристик класса в режиме SRWLock


- структура монопольной блокировки.
Имя Описание

SRWLockSharedTraits - Описание общих характеристик класса в режиме SRWLock общей


структура блокировки.

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers

См. также раздел


Пространство имен Microsoft::WRL::Wrappers
CriticalSectionTraits - структура
Статья • 03.04.2023

Специализируется на объекте CriticalSection для поддержки недопустимого


критического раздела или функции для освобождения критического раздела.

Синтаксис

struct CriticalSectionTraits;

Члены

Общедоступные определения типов

Имя Описание

Type Объект , typedef определяющий указатель на критически важный раздел. Type


определяется как typedef CRITICAL_SECTION* Type; .

Открытые методы

name Описание

CriticalSectionTraits::GetInvalidValue Специализируется на шаблоне CriticalSection , чтобы


он всегда был недопустимым.

CriticalSectionTraits::Unlock Специализируется на шаблоне CriticalSection таким


образом, чтобы он поддерживал освобождение прав
владения указанным объектом критического раздела.

Иерархия наследования
CriticalSectionTraits

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::HandleTraits

CriticalSectionTraits::GetInvalidValue
Специализируется на шаблоне CriticalSection , чтобы он всегда был
недопустимым.

C++

inline static Type GetInvalidValue();

Возвращаемое значение
Всегда возвращает указатель на недопустимую критическую секцию.

Комментарии
Модификатор Type определен как typedef CRITICAL_SECTION* Type; .

CriticalSectionTraits::Unlock
Специализируется на шаблоне CriticalSection таким образом, чтобы он
поддерживал освобождение прав владения указанным объектом критического
раздела.

C++

inline static void Unlock(

_In_ Type cs

);

Параметры
Cs

Указатель на объект критического раздела.

Комментарии
Модификатор Type определен как typedef CRITICAL_SECTION* Type; .

Дополнительные сведения см. в разделе Функция LeaveCriticalSection раздела


Функции синхронизации документации по API Windows.
EventTraits - структура
Статья • 03.04.2023

Определяет характеристики дескриптора Event класса.

Синтаксис
C++

struct EventTraits : HANDLENullTraits;

Члены

Иерархия наследования
HANDLENullTraits

EventTraits

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::HandleTraits

См. также раздел


Пространство имен Microsoft::WRL::Wrappers::HandleTraits
FileHandleTraits - структура
Статья • 03.04.2023

Определяет характеристики дескриптора файла.

Синтаксис
C++

struct FileHandleTraits : HANDLETraits;

Члены

Иерархия наследования
HANDLETraits

FileHandleTraits

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::HandleTraits

См. также раздел


Пространство имен Microsoft::WRL::Wrappers::HandleTraits
HANDLENullTraits - структура
Статья • 03.04.2023

Определяет общие характеристики неинициализированного дескриптора.

Синтаксис
C++

struct HANDLENullTraits;

Члены

Общедоступные определения типов

Имя Описание

Type Синоним для HANDLE.

Открытые методы

name Описание

HANDLENullTraits::Close Закрывает указанный дескриптор.

HANDLENullTraits::GetInvalidValue Представляет недопустимый дескриптор.

Иерархия наследования
HANDLENullTraits

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::HandleTraits


HANDLENullTraits::Close
Закрывает указанный дескриптор.

C++

inline static bool Close(

_In_ Type h

);

Параметры
h

Закрываемая дескриптор.

Возвращаемое значение
true если дескриптор h успешно закрыт; в противном случае — false .

HANDLENullTraits::GetInvalidValue
Представляет недопустимый дескриптор.

C++

inline static Type GetInvalidValue();

Возвращаемое значение
Всегда возвращает значение nullptr .
HANDLETraits - структура
Статья • 03.04.2023

Определяет общие характеристики дескриптора.

Синтаксис
C++

struct HANDLETraits;

Члены

Общедоступные определения типов

Имя Описание

Type Синоним для HANDLE.

Открытые методы

name Описание

HANDLETraits::Close Закрывает указанный дескриптор.

HANDLETraits::GetInvalidValue Представляет недопустимый дескриптор.

Иерархия наследования
HANDLETraits

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::HandleTraits


HANDLETraits::Close
Закрывает указанный дескриптор.

C++

inline static bool Close(

_In_ Type h

);

Параметры
h

Закрываемая дескриптор.

Возвращаемое значение
true если дескриптор h успешно закрыт; в противном случае — false .

HANDLETraits::GetInvalidValue
Представляет недопустимый дескриптор.

C++

inline static HANDLE GetInvalidValue();

Возвращаемое значение
Всегда возвращает значение INVALID_HANDLE_VALUE (INVALID_HANDLE_VALUE
определяется Windows).
MutexTraits - структура
Статья • 03.04.2023

Определяет общие характеристики класса Mutex .

Синтаксис
C++

struct MutexTraits : HANDLENullTraits;

Элементы

Открытые методы

name Описание

MutexTraits::Unlock Освобождает монопольное управление общим ресурсом.

Иерархия наследования
HANDLENullTraits

MutexTraits

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::HandleTraits

Метод MutexTraits::Unlock
Освобождает монопольное управление общим ресурсом.

C++

inline static void Unlock(

_In_ Type h

);

Параметры
h

Обработка объекта мьютекса.


SemaphoreTraits - структура
Статья • 03.04.2023

Определяет общие характеристики Semaphore объекта.

Синтаксис
C++

struct SemaphoreTraits : HANDLENullTraits;

Элементы

Открытые методы

name Описание

SemaphoreTraits::Unlock Освобождает управление общим ресурсом.

Иерархия наследования
HANDLENullTraits

SemaphoreTraits

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::HandleTraits

SemaphoreTraits::Unlock
Освобождает управление общим ресурсом.

C++
inline static void Unlock(

_In_ Type h

);

Параметры
h

Дескриптор Semaphore объекта.

Комментарии
Если операция разблокировки завершилась неудачно, Unlock() выдает ошибку,
указывающую причину сбоя.
SRWLockExclusiveTraits - структура
Статья • 03.04.2023

Описание общих характеристик класса в режиме SRWLock монопольной


блокировки.

Синтаксис
C++

struct SRWLockExclusiveTraits;

Члены

Общедоступные определения типов

Имя Описание

Type Синоним для указателя на класс SRWLOCK .

Открытые методы

name Описание

SRWLockExclusiveTraits::GetInvalidValue Извлекает SRWLockExclusiveTraits объект, который


всегда является недопустимым.

SRWLockExclusiveTraits::Unlock Освобождает монопольный контроль над


указанным SRWLock объектом.

Иерархия наследования
SRWLockExclusiveTraits

Требования
Заголовок: corewrappers.h
Пространства имен: Microsoft::WRL::Wrappers::HandleTraits

SRWLockExclusiveTraits::GetInvalidValue
Извлекает SRWLockExclusiveTraits объект, который всегда является недопустимым.

C++

inline static Type GetInvalidValue();

Возвращаемое значение
Пустой объект SRWLockExclusiveTraits .

SRWLockExclusiveTraits::Unlock
Освобождает монопольный контроль над указанным SRWLock объектом.

C++

inline static void Unlock(

_In_ Type srwlock

);

Параметры
Srwlock

Дескриптор SRWLock объекта.


SRWLockSharedTraits - структура
Статья • 03.04.2023

Описание общих характеристик класса в режиме SRWLock общей блокировки.

Синтаксис
C++

struct SRWLockSharedTraits;

Члены

Общедоступные определения типов

Имя Описание

Type Синоним для указателя на класс SRWLOCK .

Открытые методы

name Описание

SRWLockSharedTraits::GetInvalidValue Извлекает SRWLockSharedTraits объект, который всегда


является недопустимым.

SRWLockSharedTraits::Unlock Освобождает монопольный контроль над указанным


SRWLock объектом.

Иерархия наследования
SRWLockSharedTraits

Требования
Заголовок: corewrappers.h

Пространства имен: Microsoft::WRL::Wrappers::HandleTraits


SRWLockSharedTraits::GetInvalidValue
Извлекает SRWLockSharedTraits объект, который всегда является недопустимым.

C++

inline static Type GetInvalidValue();

Возвращаемое значение
Дескриптор SRWLockSharedTraits объекта.

SRWLockSharedTraits::Unlock
Освобождает монопольный контроль над указанным SRWLock объектом.

C++

inline static void Unlock(

_In_ Type srwlock

);

Параметры
Srwlock

Дескриптор SRWLock объекта.


Пространство имен
Windows::Foundation
Статья • 03.04.2023

Включает основные функции среда выполнения Windows, такие как создание


объектов и фабрики.

Синтаксис
C++

namespace Windows::Foundation;

Члены

Функции

Имя Описание

Функция Регистрирует и извлекает экземпляр указанного типа, определенного


ActivateInstance в указанном идентификаторе класса.

Функция Извлекает фабрику активации для типа, указанного в параметре


GetActivationFactory шаблона.

Требования
Заголовок: client.h

Пространства имен: Windows

См. также раздел


Пространства имен Windows UWP
ActivateInstance - функция
Статья • 03.04.2023

Регистрирует и извлекает экземпляр указанного типа, определенного в указанном


идентификаторе класса.

Синтаксис
C++

template<typename T>

inline HRESULT ActivateInstance(

_In_ HSTRING activatableClassId,

_Out_ Microsoft::WRL::Details::ComPtrRef<T> instance

);

Параметры
T

Тип для активации.

activatableClassId

Имя идентификатора класса, определяющего параметр T.

Экземпляр

После завершения этой операции — ссылка на экземпляр T.

Возвращаемое значение
S_OK в случае успешного выполнения; в противном случае — ошибка HRESULT,
указывающая причину ошибки.

Требования
Заголовок: client.h

Пространства имен: Windows::Foundation

См. также раздел


Пространство имен Windows::Foundation
GetActivationFactory - функция
Статья • 03.04.2023

Извлекает фабрику активации для типа, указанного в параметре шаблона.

Синтаксис
C++

template<typename T>

inline HRESULT GetActivationFactory(

_In_ HSTRING activatableClassId,

_Out_ Microsoft::WRL::Details::ComPtrRef<T> factory

);

Параметры
T

Параметр шаблона, который определяет тип фабрики активации.

activatableClassId

Имя класса, который может создать фабрика активации.

фабрика

После завершения этой операции — ссылка на фабрику активации для типа T.

Возвращаемое значение
Значение S_OK, если операция завершилась успешно; в противном случае —
значение HRESULT, указывающее причину неудачного завершения операции.

Требования
Заголовок: client.h

Пространства имен: Windows::Foundation

См. также раздел


Пространство имен Windows::Foundation
IID_PPV_ARGS_Helper - функция
Статья • 03.04.2023

Проверяет, что тип заданного аргумента является производным от интерфейса


IUnknown .

) Важно!

Данная специализация шаблона поддерживает инфраструктуру WRL и не


предназначена для использования непосредственно из кода. Вместо этого
используйте IID_PPV_ARGS .

Синтаксис
C++

template<typename T>

void** IID_PPV_ARGS_Helper(

_Inout_ Microsoft::WRL::Details::ComPtrRef<T> pp

);

Параметры
T

Тип аргумента pp.

Pp

Двойной косвенный указатель.

Возвращаемое значение
Аргумент pp приводится к указателю void на указатель на .

Комментарии
Ошибка времени компиляции возникает, если параметр шаблона T не является
производным от IUnknown .
Требования
Заголовок: client.h

Вам также может понравиться