C++/WinRTC++/WinRT

C++/WinRT — это полностью стандартная проекция языка C++17 для API среды выполнения Windows (WinRT), реализованная как библиотека на основе файлов заголовков и предназначенная для предоставления вам первоклассного доступа к современным интерфейсам API Windows.C++/WinRT is an entirely standard modern C++17 language projection for Windows Runtime (WinRT) APIs, implemented as a header-file-based library, and designed to provide you with first-class access to the modern Windows API. С помощью C++/WinRT можно создавать и использовать интерфейсы API среды выполнения Windows, используя любой совместимый со стандартами компилятор C++17.With C++/WinRT, you can author and consume Windows Runtime APIs using any standards-compliant C++17 compiler. В пакет Windows SDK входит среда C++/WinRT, которая впервые появилась в версии 10.0.17134.0 (Windows 10, версия 1803).The Windows SDK includes C++/WinRT; it was introduced in version 10.0.17134.0 (Windows 10, version 1803).

C++/ WinRT предназначается для любых разработчиков, которые заинтересованы в написании превосходного и быстрого кода для Windows.C++/WinRT is for any developer interested in writing beautiful and fast code for Windows. Для этого есть следующие причины.Here's why.

Преимущества C++/WinRTThe case for C++/WinRT

 

Язык C++ используется как в корпоративном сегменте, так и независимыми поставщиками программного обеспечения для приложений, для которых необходимы высокие уровни надежности, качества и производительности.The C++ programming language is used both in the enterprise and independent software vendor (ISV) segments for applications where high levels of correctness, quality, and performance are valued. Вот некоторые из применений: системное программирование; ограниченные в ресурсах встроенные и мобильные системы; игры и графика; драйверы устройств; а также промышленные, научные и медицинские приложения.For example: systems programming; resource-constrained embedded and mobile systems; games and graphics; device drivers; and industrial, scientific, and medical applications, to name but some.

Как язык C++ всегда применялся при разработке и использовании абстракций, одновременно облегченных и обладающих большим количеством типов.From a language point of view, C++ has always been about authoring and consuming abstractions that are both type-rich and lightweight. Но со времен необработанных указателей, необработанных циклов, сложного выделения памяти и выпуска C++98 язык сильно изменился.But the language has changed radically since the raw pointers, raw loops, and painstaking memory allocation and releasing of C++98. Современный C++ (начиная с версии C++11 и выше) позволяет четко выражать идеи, обеспечивает простоту, удобочитаемость и снижает вероятность появления ошибок.Modern C++ (from C++11 onward) is about clear expression of ideas, simplicity, readability, and a much lower likelihood of introducing bugs.

Для создания и использования интерфейсов API среды выполнения Windows с помощью C++ используется C++/WinRT.For authoring and consuming Windows Runtime APIs using C++, there is C++/WinRT. Это рекомендуемая корпорацией Майкрософт замена для проекции языка C++/CX и библиотеки шаблонов C++ для среды выполнения Windows (WRL).This is Microsoft's recommended replacement for the C++/CX language projection, and the Windows Runtime C++ Template Library (WRL).

При использовании C++/WinRT применяются стандартные типы данных, алгоритмы и ключевые слова C++.You use standard C++ data types, algorithms, and keywords when you use C++/WinRT. Эта проекция имеет собственные типы данных, но в большинстве случаев вам не нужно их изучать, так как они обеспечивают соответствующие преобразования из стандартных типов и обратно.The projection does have its own custom data types, but in most cases you don't need to learn them because they provide appropriate conversions to and from standard types. Таким образом, можно продолжать использовать стандартные возможности языка C++, к которым вы привыкли, а также исходный код, который у вас уже есть.That way, you can continue to use the standard C++ language features that you're accustomed to using, and the source code that you already have. C++/WinRT радикально упрощает вызов интерфейсов API среды выполнения Windows в любом приложении C++ — от Win32 до UWP.C++/WinRT makes it extremely easy to call Windows Runtime APIs in any C++ application, from Win32 to UWP.

C++/WinRT работает лучше и создает двоичные файлы меньшего размера, чем любой другой вариант языка для среды выполнения Windows.C++/WinRT performs better and produces smaller binaries than any other language option for the Windows Runtime. Его производительность даже выше рукописного кода, использующего двоичные интерфейсы ABI напрямую.It even outperforms handwritten code using the ABI interfaces directly. Это связано с тем, что абстракции используют современные идиомы C++, которые способен оптимизировать компилятор Visual C++.That's because the abstractions use modern C++ idioms that the Visual C++ compiler is designed to optimize. Это включает в себя волшебные статические методы, пустые базовые классы, элизию strlen, а также множество новых оптимизаций в последней версии Visual C++, специально предназначенных для повышения производительности C++/WinRT.This includes magic statics, empty base classes, strlen elision, as well as many newer optimizations in the latest version of Visual C++ targeted specifically at improving the performance of C++/WinRT.

Существует два способа постепенного внедрения C++/WinRT в проекты:There are ways to gradually introduce C++/WinRT into your projects. с помощью компонентов среды выполнения Windows или путем взаимодействия с C++/CX.You could use Windows Runtime components, or you could interoperate with C++/CX. Дополнительные сведения см. в статье Взаимодействие между C++/WinRT и C++/CX.For more info, see Interop between C++/WinRT and C++/CX.

Сведения о переходе на C++/WinRT см. в следующих ресурсах.For info about porting to C++/WinRT, see these resources.

См. раздел Где можно найти примеры приложений C++/WinRT?Also see Where can I find C++/WinRT sample apps?.

Разделы о C++/WinRTTopics about C++/WinRT

РазделTopic ОписаниеDescription
Введение в C++/WinRTIntroduction to C++/WinRT Введение в C++/WinRT — стандартную проекцию языка C++ для интерфейсов API среды выполнения Windows.An introduction to C++/WinRT—a standard C++ language projection for Windows Runtime APIs.
Начало работы с C++/WinRTGet started with C++/WinRT Чтобы вы могли быстро приступить к работе с C++/WinRT, в этой статье описывается простой пример кода.To get you up to speed with using C++/WinRT, this topic walks through a simple code example.
Что нового в C++/WinRTWhat's new in C++/WinRT Новости и изменения в C++/WinRT.News and changes to C++/WinRT.
Вопросы и ответыFrequently-asked questions Ответы на часто возникающие вопросы о разработке и использовании интерфейсов API среды выполнения Windows с помощью C++/WinRT.Answers to questions that you're likely to have about authoring and consuming Windows Runtime APIs with C++/WinRT.
Устранение неполадокTroubleshooting Таблица симптомов и способов их устранения в этом разделе может быть полезна при создании нового кода и переносе существующего приложения.The table of troubleshooting symptoms and remedies in this topic may be helpful to you whether you're cutting new code or porting an existing app.
Пример приложения C++/WinRT — редактор фотографийPhoto Editor C++/WinRT sample application Редактор фотографий — это пример приложения UWP, демонстрирующего возможности разработки с помощью проекции языка C++/WinRT.Photo Editor is a UWP sample application that showcases development with the C++/WinRT language projection. Пример приложения позволяет извлекать фотографии из библиотеки Pictures, а затем редактировать выбранное изображение, используя разные фотографические эффекты.The sample application allows you to retrieve photos from the Pictures library, and then edit the selected image with assorted photo effects.
Обработка строкString handling С помощью C++/WinRT можно вызывать интерфейсы API среды выполнения Windows, используя стандартные типы широких строк C++ или тип winrt::hstring.With C++/WinRT, you can call Windows Runtime APIs using standard C++ wide string types, or you can use the winrt::hstring type.
Стандартные типы данных C++ и C++/WinRTStandard C++ data types and C++/WinRT С помощью C++/WinRT можно вызывать интерфейсы API среды выполнения Windows с использованием стандартных типов данных C++.With C++/WinRT, you can call Windows Runtime APIs using Standard C++ data types.
Упаковка и распаковка скалярных значений в IInspectableBoxing and unboxing scalar values to IInspectable Скалярное значение необходимо поместить в объект ссылочного класса перед его передачей в функцию, которая ожидает IInspectable.A scalar value needs to be wrapped inside a reference class object before being passed to a function that expects IInspectable. Этот процесс называют упаковкой значения.That wrapping process is known as boxing the value.
Использование интерфейсов API с помощью C++/WinRTConsume APIs with C++/WinRT В этом разделе показано, как использовать интерфейсы API C++/WinRT, если они реализованы Windows, сторонним поставщиком компонентов или вами самостоятельно.This topic shows how to consume C++/WinRT APIs, whether they're implemented by Windows, a third-party component vendor, or by yourself.
Создание интерфейсов API с помощью C++/WinRTAuthor APIs with C++/WinRT В этом разделе показано, как создавать интерфейсы API C++/ WinRT, используя базовую структуру winrt::implements прямо или косвенно.This topic shows how to author C++/WinRT APIs by using the winrt::implements base struct, either directly or indirectly.
Обработка ошибок в C++/WinRTError handling with C++/WinRT В этом разделе обсуждаются стратегии обработки ошибок при программировании на C++/WinRT.This topic discusses strategies for handling errors when programming with C++/WinRT.
Обработка событий с помощью делегатовHandle events by using delegates В этом разделе показано, как регистрировать и отзывать делегаты обработки событий с помощью C++/WinRT.This topic shows how to register and revoke event-handling delegates using C++/WinRT.
Создание событийAuthor events В этом разделе показано, как создать компонент среды выполнения Windows, который содержит класс среды выполнения, порождающий события.This topic demonstrates how to author a Windows Runtime component containing a runtime class that raises events. В нем также показано приложение, которое использует этот компонент и обрабатывает события.It also demonstrates an app that consumes the component and handles the events.
Использование коллекций с помощью C++/WinRTCollections with C++/WinRT C++/WinRT предоставляет функции и базовые классы, которые позволяют сэкономить много времени и усилий, если требуется реализовать и (или) передавать коллекции.C++/WinRT provides functions and base classes that save you a lot of time and effort when you want to implement and/or pass collections.
Параллельная обработка и асинхронные операцииConcurrency and asynchronous operations В этом разделе показаны способы, которыми можно создавать и использовать асинхронные объекты среды выполнения Windows с помощью C++/WinRT.This topic shows the ways in which you can both create and consume Windows Runtime asynchronous objects with C++/WinRT.
Более сложные сценарии параллельной обработки и асинхронностиMore advanced concurrency and asynchrony Более сложные сценарии с параллельной обработкой и асинхронностью в C++/WinRT.More advanced scenarios with concurrency and asynchrony in C++/WinRT.
Элементы управления XAML; привязка к свойству C++/WinRTXAML controls; bind to a C++/WinRT property Свойство, которое может быть эффективно привязано к элементу управления XAML, называется отслеживаемым.A property that can be effectively bound to a XAML control is known as an observable property. В этом разделе показано, как реализовать и использовать отслеживаемое свойство и привязать к нему элемент управления XAML.This topic shows how to implement and consume an observable property, and how to bind a XAML control to it.
Элементы управления XAML; привязка к коллекции C++/WinRTXAML items controls; bind to a C++/WinRT collection Коллекция, которая может быть эффективно привязана к элементам управления XAML, называется отслеживаемой.A collection that can be effectively bound to a XAML items control is known as an observable collection. В этом разделе показано, как реализовать и использовать отслеживаемую коллекцию и привязать к ней элементы управления XAML.This topic shows how to implement and consume an observable collection, and how to bind a XAML items control to it.
Создание пользовательских (на основе шаблона) элементов управления XAML с помощью C++/WinRTXAML custom (templated) controls with C++/WinRT В этом разделе рассматриваются этапы создания простого пользовательского элемента управления с помощью C++/WinRT.This topic walks you through the steps of creating a simple custom control using C++/WinRT. С помощью приведенной информации можно создавать собственные многофункциональные и настраиваемые элементы пользовательского интерфейса.You can build on the info here to create your own feature-rich and customizable UI controls.
Передача параметров в границы интерфейса ABIPassing parameters into the ABI boundary C++/WinRT упрощает передачу параметров в интерфейс ABI, обеспечивая автоматическое преобразование для общих случаев.C++/WinRT simplifies passing parameters into the ABI boundary by providing automatic conversions for common cases.
Использование компонентов COM с помощью C++/WinRTConsume COM components with C++/WinRT В этом разделе приведен полный пример кода Direct2D, чтобы показать, как использовать классы и интерфейсы COM с помощью C++/WinRT.This topic uses a full Direct2D code example to show how to use C++/WinRT to consume COM classes and interfaces.
Создание компонентов COM с помощью C++/WinRTAuthor COM components with C++/WinRT C++/WinRT можно использовать для разработки классических компонентов COM, так как эта проекция языка помогает создавать классы среды выполнения Windows.C++/WinRT can help you to author classic COM components, just as it helps you to author Windows Runtime classes.
Переход на C++/WinRT из C++/CXMove to C++/WinRT from C++/CX В этой статье описаны технические особенности переноса исходного кода из проекта C++/CX в его эквивалент в C++/WinRT.This topic describes the technical details involved in porting the source code in a C++/CX project to its equivalent in C++/WinRT.
Взаимодействие между C++/WinRT и C++/CXInterop between C++/WinRT and C++/CX В этом разделе описаны две вспомогательные функции, которые могут использоваться для преобразования между объектами C++/CX и C++/WinRT.This topic shows two helper functions that can be used to convert between C++/CX and C++/WinRT objects.
Асинхронное выполнение задач и взаимодействие между C++/WinRT и C++/CXAsynchrony, and interop between C++/WinRT and C++/CX Это дополнительная статья, посвященная постепенному переходу с C++/CX на C++/WinRT.This is an advanced topic related to gradually porting from C++/CX to C++/WinRT. В ней показано, как задачи библиотеки параллельных шаблонов (PPL) и сопрограмм могут существовать параллельно в одном проекте.It shows how Parallel Patterns Library (PPL) tasks and coroutines can exist side by side in the same project.
Переход на C++/WinRT с WRLMove to C++/WinRT from WRL В этом разделе показано, как перенести код библиотеки шаблонов C++ для среды выполнения Windows (WRL) в его эквивалент на C++/WinRT.This topic shows how to port Windows Runtime C++ Template Library (WRL) code to its equivalent in C++/WinRT.
Перенос примера буфера обмена в C++/WinRT из C# — пример использованияPorting the Clipboard sample to C++/WinRT from C#—a case study В этой статье рассматривается пример переноса одного примера приложения универсальной платформы Windows (UWP) из C# в C++/WinRT.This topic presents a case study of porting one of the Universal Windows Platform (UWP) app samples from C# to C++/WinRT. Вы можете получить рекомендации и действия по переносу, следуя пошаговому руководству и выполняя перенос образца.You can gain porting practice and experience by following along with the walkthrough and porting the sample for yourself as you go.
Переход на C++/WinRT с C#Move to C++/WinRT from C# В этой статье указаны все технические особенности переноса исходного кода из проекта C# в его эквивалент в C++/WinRT.This topic comprehensively catalogs the technical details involved in porting the source code in a C# project to its equivalent in C++/WinRT.
Взаимодействие между C++/WinRT и интерфейсом ABIInterop between C++/WinRT and the ABI В этом разделе показано, как выполнять преобразование между объектами двоичного интерфейса приложений (ABI) и C++/WinRT.This topic shows how to convert between application binary interface (ABI) and C++/WinRT objects.
Сильные и слабые ссылки в C++/WinRTStrong and weak references in C++/WinRT Среда выполнения Windows — это система с учетом ссылок. В подобной системе очень важно знать о значении сильных и слабых ссылок, а также о различиях между ними.The Windows Runtime is a reference-counted system; and in such a system it's important for you to know about the significance of, and distinction between, strong and weak references.
Гибкие объектыAgile objects Гибкий объект — это объект, доступ к которому может осуществляться из любого потока.An agile object is one that can be accessed from any thread. Типы C++/WinRT являются гибкими по умолчанию, но вы можете это отключить.Your C++/WinRT types are agile by default, but you can opt out.
Диагностика прямых выделенийDiagnosing direct allocations В этом разделе подробно описывается компонент C++/WinRT 2.0. Вы можете использовать его для диагностики неполадок с созданием объекта типа реализации в стеке вместо семейства вспомогательных методов winrt::make.This topic goes in-depth on a C++/WinRT 2.0 feature that helps you diagnose the mistake of creating an object of implementation type on the stack, rather than using the winrt::make family of helpers, as you should.
Точки расширения для типов реализацииExtension points for your implementation types Эти точки расширения в C++/WinRT 2.0 позволяют откладывать уничтожение типов реализации, чтобы безопасно выполнять запросы во время уничтожения, а также обрабатывать вход в проектируемые методы и выход из них.These extension points in C++/WinRT 2.0 allow you to defer destruction of your implementation types, to safely query during destruction, and to hook the entry into and exit from your projected methods.
Простой пример библиотеки пользовательского интерфейса Windows для C++/WinRTA simple C++/WinRT Windows UI Library example Из этого раздела вы узнаете, как добавить простую поддержку WinUI в проект C++/WinRT.This topic walks you through the process of adding simple support for WinUI within a C++/WinRT project.
Создание компонентов среды выполнения Windows с помощью C++/WinRTWindows Runtime components with C++/WinRT В этом разделе описывается, как использовать C++/WinRT для создания и использования компонента среды выполнения Windows— — то есть компонента, который можно вызвать из универсального приложения для Windows, созданного с помощью любого языка среды выполнения Windows.This topic shows how to use C++/WinRT to create and consume a Windows Runtime component—a component that's callable from a Universal Windows app built using any Windows Runtime language.

Разделы о языке C++Topics about the C++ language

РазделTopic ОписаниеDescription
Категории значений и ссылки на нихValue categories, and references to them В этом разделе описываются различные категории значений, которые существуют в C++.This topic describes the various categories of values that exist in C++. Вы наверняка уже слышали о значениях lvalue и rvalue, но существуют и другие типы.You will doubtless have heard of lvalues and rvalues, but there are other kinds, too.

Важные APIImportant APIs