C++/WinRT 简介

C++/WinRT 是 Windows 运行时 (WinRT) API 的完全标准新式 C++17 语言投影,以基于标头文件的库的形式实现,旨在为你提供对新式 Windows API 的一流访问。 利用 C++/WinRT,你可以采用任何符合标准的 C++17 编译器创作和使用 Windows 运行时 API。 Windows SDK 包含 C++/WinRT;它已在版本 10.0.17134.0(Windows 10,版本 1803)中引用。

C++/WinRT 是 Microsoft 推荐的用于替代 C++/CX 语言投影和 Windows 运行时 C++ 模板库 (WRL) 的替代品。

语言投影

Windows 运行时基于组件对象模型 (COM) API,根据设计,可通过语言投影 访问它。 投影将隐藏 COM 详细信息,并为给定语言提供更自然的编程体验。

Windows 运行时 API 引用内容中的 C++/WinRT 语言投影

浏览 Windows 运行时 API 时,请单击右上角的“语言” 组合框,然后选择“C++/WinRT” 以查看 API 语法块(当它们在 C++/WinRT 语言投影中出现时)。

针对 C++/WinRT、XAML、VSIX 扩展和 NuGet 包的 Visual Studio 支持

若要获取 Visual Studio 支持,需要 Visual Studio 2022、Visual Studio 2019 或 Visual Studio 2017(至少需要版本 15.6;建议至少使用 15.7)。 从 Visual Studio 安装程序中,安装“通用 Windows 平台开发”工作负荷。 在“安装详细信息”>“通用 Windows 平台开发”中,选中“C++ (v14x) 通用 Windows 平台工具”选项(如果尚未这样做)。

虽然我们建议使用最新版 Visual Studio 和 Windows SDK 进行开发,但如果你使用的 C++/WinRT 版本是 10.0.17763.0(Windows 10 版本 1809)之前的 Windows SDK 随附的,则至少需要在项目中使用 Windows SDK 目标版本 10.0.17134.0(Windows 10 版本 1803)才能使用上述 Windows 命名空间标头。

Visual Studio 2022 内置了 C++/WinRT 项目和项模板,让你可以立刻开始进行 C++/WinRT 开发。 它还带有 C++/WinRT 投影类型的 Visual Studio 本机调试可视化效果 (natvis),提供与 C# 调试类似的体验。 Natvis 对于调试版本是自动的。 有关详细信息,请参阅适用于 C++/WinRT 的 Visual Studio 本机调试可视化。

在 Visual Studio 2019 中,MSBuild 支持不再内置于 C++/WinRT VSIX 中,而是由独立的 Microsoft.Windows.CppWinRT NuGet 包提供。

对于早期版本的 Visual Studio,需要从 Visual Studio Marketplace 下载并安装最新版 C++/WinRT Visual Studio 扩展 (VSIX)。

  • VSIX 扩展提供 Visual Studio 中的 C++/WinRT 项目和项模板。
  • 另外,它还提供 C++/WinRT 投影类型的 Visual Studio 本机调试可视化效果 (natvis)。

安装后就可以创建项目了

使用已安装的最新版 VSIX 扩展创建新的 C++/WinRT 项目时,新的 C++/WinRT 项目会自动安装 Microsoft.Windows.CppWinRT NuGet 包。 Microsoft.Windows.CppWinRT NuGet 包提供 C++/WinRT 生成支持(MSBuild 属性和目标),使项目可以在开发计算机和生成代理(在其上仅安装了 NuGet 包,未安装 VSIX 扩展)之间移植。

也可通过手动安装 Microsoft.Windows.CppWinRT NuGet 包来转换现有项目。 在安装(或更新到)最新版 VSIX 扩展以后,请在 Visual Studio 中打开现有项目,然后单击“项目”>“管理 NuGet 包...”>“浏览”,在搜索框中键入或粘贴“Microsoft.Windows.CppWinRT”,在搜索结果中选择该项,然后单击“安装”以安装该项目的包。 添加该包后,你将获得对该项目的 C++/WinRT MSBuild 支持,包括调用 cppwinrt.exe 工具。

 

 重要

如果项目是使用 1.0.190128.4 之前的 VSIX 扩展版本创建的(或者这些项目在升级后兼容该扩展版本),请参阅早期版本的 VSIX 扩展。 该部分包含有关项目配置的重要信息。在升级项目以使用最新版 VSIX 扩展之前,需了解该信息。

  • 由于 C++/WinRT 使用 C++17 标准版中的功能,因此 NuGet 包会在 Visual Studio 中设置项目属性“C/C++”>“语言”>“C++ 语言标准版”>“ISO C++17 标准版(/std:c++17)”。
  • 它还会添加 /bigobj 编译器选项。
  • 它会添加 /await 编译器选项来启用 co_await
  • 它会指导 XAML 编译器发出 C++/WinRT codegen。
  • 你可能还需要设置“合规模式: 是(/permissive-)”,以便进一步约束代码,使之符合标准。
  • 要注意的另一个项目属性是“C/C++” >“常规” > “将警告视为错误”。 请根据喜好将此项设置为“是(/WX)” 或“否(/WX-)” 。 有时候,由 cppwinrt.exe 工具生成的源文件会生成警告,除非向其添加实现。

根据上述说明设置系统以后,即可在 Visual Studio 中创建和生成或者打开 C++/WinRT 项目,然后部署它。

如需 cppwinrt.exe 工具的自定义选项的列表,请通过项目属性进行设置,详见 Microsoft.Windows.CppWinRT NuGet 包自述文件。

可以通过项目中安装的 Microsoft.Windows.CppWinRT NuGet 包来标识使用 C++/WinRT MSBuild 支持的项目。


下面是由 VSIX 扩展提供的 Visual Studio 项目模板。

空白应用 (C++/WinRT)

通用 Windows 平台 (UWP) 应用的项目模板,具有 XAML 用户界面。

Visual Studio 提供了 XAML 编译器支持,用于从每个 XAML 标记文件后面的接口定义语言 (IDL) (.idl) 文件生成实现和标头存根。 在 IDL 文件中,定义需要在应用的 XAML 页面中引用的任何本地运行时类,然后构建项目一次,以便在 Generated Files 中生成实现模板并在 Generated Files\sources 中生成存根类型定义。 然后使用这些存根类型定义作为参考来实现本地运行时类。 请参阅将运行时类重构到 Midl 文件 (.idl) 中。

Visual Studio 中用于 C++/WinRT 的 XAML 设计图面支持与 C# 类似。 在 Visual Studio 中,可以使用“属性”窗口的“事件”选项卡 在 C++/WinRT 项目中添加事件处理程序。 也可将事件处理程序手动添加到代码中,有关详细信息,请参阅在 C++/WinRT 中使用委托处理事件。

核心应用 (C++/WinRT)

通用 Windows 平台 (UWP) 应用的项目模板,不使用 XAML。

相反,它使用 Windows.ApplicationModel.Core 命名空间的 C++/WinRT Windows 命名空间标头。 构建并运行后,单击空白空间以添加彩色方块;然后单击彩色方块以拖动它。

Windows 控制台应用程序 (C++/WinRT)

适用于 Windows 桌面版的 C++/WinRT 客户端应用程序的项目模板,具有控制台用户界面。

Windows 桌面应用程序 (C++/WinRT)

适用于 Windows 桌面版的 C++/WinRT 客户端应用程序的项目模板,可在 Win32 MessageBox 中显示 Windows 运行时 Windows.Foundation.Uri。

Windows 运行时组件 (C++/WinRT)

组件的项目模板;通常可以在通用 Windows 平台 (UWP) 中使用。

此模板演示了 midl.exe>cppwinrt.exe 工具链:首先从 IDL 生成 Windows 运行时元数据 (.winmd),然后从 Windows 运行时元数据生成实现和标头存根。

在 IDL 文件中,在组件、组件的默认接口和组件实现的任何其他接口中定义运行时类。 构建项目一次以生成 module.g.cpp 和 module.h.cpp,同时生成 Generated Files 中的实现模板和 Generated Files\sources 中的存根类型定义。 然后使用这些存根类型定义作为参考,在组件中实现运行时类。 请参阅将运行时类重构到 Midl 文件 (.idl) 中。

将生成的 Windows 运行时组件二进制文件及其 .winmd 与使用它们的 UWP 应用绑定。

早期版本的 VSIX 扩展

就支持的 Windows SDK 和 Visual Studio 版本以及 Visual Studio 配置来说,上面的针对 C++/WinRT、XAML、VSIX 扩展和 NuGet 包的 Visual Studio 支持部分的信息适用于早期版本的 VSIX 扩展。 下面的内容介绍了在使用早期版本创建项目(或将项目升级,使之兼容早期版本)的情况下,在行为和配置方面存在的重要差异。

在 1.0.181002.2 之前创建

如果项目是使用 1.0.181002.2 之前的 VSIX 扩展版本创建的,则 C++/WinRT 生成支持已内置到该 VSIX 扩展版本中。 项目在 .vcxproj 文件中设置 <CppWinRTEnabled>true</CppWinRTEnabled> 属性。

XML复制

<Project ...><PropertyGroup Label="Globals"><CppWinRTEnabled>true</CppWinRTEnabled>
...

可通过手动安装 Microsoft.Windows.CppWinRT NuGet 包来升级项目。 在安装(或升级到)最新版 VSIX 扩展以后,请在 Visual Studio 中打开项目,然后单击“项目”>“管理 NuGet 包...”>“浏览”,在搜索框中键入或粘贴“Microsoft.Windows.CppWinRT”,在搜索结果中选择该项,然后单击“安装”以安装项目的包。

使用 1.0.181002.2 和 1.0.190128.3 之间的版本创建(或升级到该版本)

如果项目是使用 1.0.181002.2 和 1.0.190128.3 之间的 VSIX 扩展版本(含 1.0.181002.2 和 1.0.190128.3)创建的,则 Microsoft.Windows.CppWinRT NuGet 包已通过项目模板自动安装到项目中。 另外,你可能已经升级了旧项目,因此可以使用此范围中的 VSIX 扩展版本。 如果你这样做了,那么,由于生成支持也存在于此范围的 VSIX 扩展版本中,升级的项目可能安装了 Microsoft.Windows.CppWinRT NuGet 包,也可能没有。

若要升级项目,请按上一部分的说明操作,确保项目安装了 Microsoft.Windows.CppWinRT NuGet 包。

无效的升级配置

使用最新版 VSIX 扩展时,项目在尚未安装 Microsoft.Windows.CppWinRT NuGet 包的情况下不能有 <CppWinRTEnabled>true</CppWinRTEnabled> 属性。 使用此配置的项目会出现一个生成错误消息:“C++/WinRT VSIX 不再提供项目生成支持。 请添加对 Microsoft.Windows.CppWinRT Nuget 包的项目引用。”

如上所述,现在需要在 C++/WinRT 项目中安装 NuGet 包。

由于 <CppWinRTEnabled> 元素现已过时,你可以选择编辑 .vcxproj,删除该元素。 严格说来这不是必需的,只是一种选择。

另外,如果 .vcxproj 包含 <RequiredBundles>$(RequiredBundles);Microsoft.Windows.CppWinRT</RequiredBundles>,则可将其删除,这样就可以在不需安装 C++/WinRT VSIX 扩展的情况下进行构建。

对 C++/WinRT 的 SDK 支持

从版本 10.0.17134.0(Windows 10 版本 1803)起,Windows SDK 包含基于标头文件的标准 C++ 库,因此可以使用第一方 Windows API(Windows 命名空间中的 Windows 运行时 API),但现在其存在只是出于兼容性原因。 这些标头位于文件夹 %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt 中。 从 Windows SDK 版本 10.0.17763.0(Windows 10 版本 1809)开始,将会在项目的 $(GeneratedFilesDir) 文件夹中生成这些标头。

Windows SDK 也附带 cppwinrt.exe 工具,这同样是出于兼容性原因。 但是,建议你改为安装并使用 Microsoft.Windows.CppWinRT NuGet 包随附的最新版 cppwinrt.exe。 该包和 cppwinrt.exe 在上述部分进行了介绍。

C++/WinRT 投影中的自定义类型

在 C++/WinRT 编程中,你可以使用标准 C++ 语言功能以及标准 C++ 数据类型和 C++/WinRT,包括一些 C++ 标准库数据类型。 但你还会在投影中发现一些自定义数据类型,并且可以选择使用它们。 例如,我们使用 C++/WinRT 入门中快速入门代码示例中的 winrt::hstring。

winrt::com_array 是你可能在某个时间使用的另一个类型。 但你不太可能直接使用 winrt::array_view 之类的类型。 或者,你可以选择不使用它,这样就可以在等效类型出现在 C++ 标准库中时不用更改任何代码。

 警告

如果仔细研究 C++/WinRT Windows 命名空间标头,你可能也会发现一些类型。 一个示例是 winrt::param::hstring,另外还有一些示例。 这些类型只是为了优化输入参数的绑定,它们实现了显著的性能改进,并使得大多数调用模式“只适用于”相关的标准 C++ 类型和容器。 在增加最大价值的情况下,这些类型只被投影使用过。 它们被高度优化且不用于一般用途;请不要尝试自行使用。 也不应该使用来自 winrt::impl 命名空间的任何内容,因为这些属于实现类型,因此可能更改。 你应该继续使用标准类型,或来自 winrt 命名空间的类型。

另请参阅将参数传递到 ABI 边界。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSG StatsHandler 初步学习

osg为视景器的使用和调试提供了丰富的辅助组件&#xff0c;它们主要是以osg::ViewerBase的成员变量或交互事件处理器(osgGA::GUIEventHandler)的形式出现。osgViewer::StatsHandler、osg::Stats类就是其中的两个经常用到的辅助组件。 #include<osgViewer/Viewer> #inclu…

iOS xcode 15.1 打包报错

真机调试的时候没问题&#xff0c;打包的时候报错了 #报错 解决办法 pods.xcodeproj - build phases - compile sources - compiler flags pods.xcodeproj - Targets-support files pods-xx-frameworks

GitHub Copilot的使用方法和快捷按键

GitHub Copilot是GitHub与OpenAI合作开发的一款人工智能编码助手。它基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&#xff0c;可以为你提供代码补全、建议和生成的功能 使用方法&#xff1a; 安装插件&#xff1a; 首先&#xff0c;确保你的开发环…

[redis] redis的安装,配置与简单操作

一、缓存的相关知识 1.1 缓存的概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度&#xff0c;在中间对速度较慢的一方起到加速作用&#xff0c;比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据&#xff0c;内存是保存CPU经常访问硬盘的数据&#xff0c;而且…

LeetCode讲解篇之39. 组合总和

文章目录 题目描述题解思路题解代码 题目描述 题解思路 首先排序数组&#xff0c;然后开始选择数字&#xff0c;当选择数字num后&#xff0c;在去选择大于等于num的合法数字&#xff0c;计算过程中的数字和&#xff0c;直到选数字和等于target, 加入结果集&#xff0c;若数字和…

关于镜头选型时的一些注意事项

1、问题背景 最近的项目调试过程中&#xff0c;遇到与镜头相关的问题比较多。所以本文主要总结一下镜头选型时需注意的事项&#xff0c;保证在项目前期就能规避掉一些问题&#xff0c;避免项目延期。 2、问题分析 我们拿到手的一般都是摄像头模组&#xff0c;在进行摄像头调试时…

114.QTimer类和QWidget类

目录 一、QTimer类 定时器使用举例&#xff1a; 二、QWidget类 2.1设置父对象 2.2窗口位置 2.3窗口尺寸 2.4窗口标题和图标 2.5信号 2.6槽函数 示例代码&#xff1a; 一、QTimer类 QTimer 是 Qt 中用于实现定时器的类。它可以在一定的时间间隔内发射信号&#xff0c;…

品牌帮助中心:提升企业客户服务水平与效率的实用指南

什么是品牌帮助中心&#xff1f;简单来理解&#xff0c;他就是一种加速问题解决效率的方式&#xff0c;是通过在官网设置文章库或者社区的形式&#xff0c;为客户提供自助服务&#xff0c;自我查找问题答案。是一种既能提升问题解决效率&#xff0c;又能提升品牌形象的方式。接…

8年经验分享:想要成为一名合格的软件测试工程师,你得会些啥?

对于很多新入行或者打算入行&#xff0c;成为软件测试工程师的小伙伴来说&#xff0c;刚开始接触这行&#xff0c;不知道自己究竟该学些什么&#xff0c;或者不知道必须掌握哪些知识&#xff0c;才能成为一名合格的测试工程师。 根据笔者观点&#xff0c;如果你能在学习过程中&…

机器学习第二十五周周报 ConvLSTM

文章目录 week 25 ConvLSTM摘要Abstract一、李宏毅机器学习二、文献阅读1. 题目2. abstract3. 网络架构3.1降水预报问题的建模3.2Convolutional LSTM3.3编码-预测结构 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1Moving-MNIST Dataset4.3.2雷达回波数据集 4.4 结论…

【自控实验】4. 数字仿真实验

本科课程实验报告&#xff0c;有太多公式和图片了&#xff0c;干脆直接转成图片了 仅分享和记录&#xff0c;不保证全对 使用matlab中的simulink进行仿真 实验内容 线性连续控制系统的数字仿真 根据开环传递函数G(S)的不同&#xff0c;完成两个线性连续控制系统的仿真。 …

Java-网络爬虫(三)

文章目录 前言一、爬虫的分类二、跳转页面的爬取三、网页去重四、综合案例1. 案例三 上篇&#xff1a;Java-网络爬虫(二) 前言 上篇文章介绍了 webMagic&#xff0c;通过一个简单的入门案例&#xff0c;对 webMagic 的核心对象和四大组件都做了简要的说明&#xff0c;以下内容…

突然又对 Go 感兴趣,GOPATH entry cannot start with shell metacharacter 错误

打发无聊时间&#xff0c;水文一篇&#xff5e; 事情是这样的&#xff0c;因为我们上架的渠道包基本是定制化混淆出包&#xff0c; 混淆出包有一个关键点就是指定映射文件&#xff0c;映射文件的内容有一部分是使用外部工具在打包前按照一定规律随机生成包名、类名&#xff0c…

用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统

传统搜索系统基于关键字匹配&#xff0c;在面向&#xff1a;游戏攻略、技术图谱、知识库等业务场景时&#xff0c;缺少对用户问题理解和答案二次处理能力。 本文探索使用大语言模型&#xff08;Large Language Model, LLM&#xff09;&#xff0c;通过其对自然语言理解和生成的…

Python+Selenium做自动化测试(超详细整理)

一、项目介绍 目的 测试某官方网站登录功能模块可以正常使用【文末有配套视频教程和免费的资料文档领取】 用例 1.输入格式正确的用户名和正确的密码&#xff0c;验证是否登录成功&#xff1b; 2.输入格式正确的用户名和不正确的密码&#xff0c;验证是否登录失败&#xff…

apache、nginx、php 隐藏版本号

apache、nginx、php 隐藏版本号 针对的系统都是CentOS 1、没配置之前 1.1 Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.2.24 mod_wsgi/3.4 Python/2.7.5 1.2 Server: nginx/1.16.0 1.3 X-Powered-By&#xff1a;7.2.24 2、配置信息 不知道具体位置&#xff0c;可…

VirtualBox安装linuxmint-21.2虚拟机并配置网络

VirtualBox安装linuxmint-21.2虚拟机并配置网络 适用于在VirtualBox平台上安装linuxmint-21.2虚拟机。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径Oracle VM VirtualBoxVirtualBox-7.0.12-159484D:\softwareCentOS7CentOS-7.9.2009E:\…

STM32——OLED实验

1.OLED简介 OLED&#xff0c;即有机发光二极管 OLED引脚说明 引脚说明&#xff1a; 1、CS&#xff1a;OLED片选信号&#xff08;低电平有效&#xff09; 2、WR&#xff1a;向OLED写入数据 3、RD&#xff1a;向OLED读取数据 4、D[7:0]&#xff1a;8位双向数据线&#xff0c;有…

kubebuilder+code-generator开发k8s的controller

本文记录用kubebuilder和code-generator开发k8s的crd控制器。 概览 和k8s.io/code-generator类似&#xff0c;是一个码生成工具&#xff0c;用于为你的CRD生成kubernetes-style API实现。区别在于&#xff1a; Kubebuilder不会生成informers、listers、clientsets&#xff0c…

宠物服务新篇章:预约小程序带来的变革

随着科技的进步和互联网的普及&#xff0c;小程序已经成为了一种非常受欢迎的应用形式。对于宠物门店来说&#xff0c;开发一个预约小程序可以大大提高客户体验和管理效率。下面是一份宠物门店预约小程序的开发指南。 浏览器搜索乔拓云&#xff0c;登录乔拓云网后台&#xff0c…