C++/WinRT 入门

本主题将会根据新的 Windows 控制台应用程序 (C++/WinRT) 项目演练一个简单的代码示例。


C++/WinRT 快速入门

创建一个新的 Windows 控制台应用程序(C++/WinRT) 项目。

 根据实际选择平台

 

如果出现如下错误,需要安装正确的SDK。

找不到 Windows SDK 版本 10.0.17134.0 (or later)。请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更改 SDK 版本。

按如下所示编辑 pch.h 和 main.cpp

// pch.h
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Web.Syndication.h>
#include <iostream>
// main.cpp
#include "pch.h"using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;int main()
{winrt::init_apartment();std::wcout << "start:" << std::endl;Uri rssFeedUri{ L"https://blogs.windows.com/feed" };SyndicationClient syndicationClient;//接口以异步方式从 URI 检索源syndicationClient.SetRequestHeader(L"User-Agent", L"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");//设置请求的 HTTP 标头。SyndicationFeed syndicationFeed = syndicationClient.RetrieveFeedAsync(rssFeedUri).get();//包含有关源的信息。for (const SyndicationItem syndicationItem : syndicationFeed.Items())//SyndicationItem ,表示源中的项。{winrt::hstring titleAsHstring = syndicationItem.Title().Text();//获取或设置项标题。// A workaround to remove the trademark symbol from the title string, because it causes issues in this case.std::wstring titleAsStdWstring{ titleAsHstring.c_str() }; //c_str(),将字符串的内容转换为以 null 结尾的 C 样式字符串//erase:从字符串中的指定位置删除一个或一系列元素。//begin:返回发现字符串中第一个元素的位置的迭代器。//end:返回发现字符串中最后一个元素之后的位置的迭代器。titleAsStdWstring.erase(remove(titleAsStdWstring.begin(), titleAsStdWstring.end(), L'™'), titleAsStdWstring.end());titleAsHstring = titleAsStdWstring;std::wcout << titleAsHstring.c_str() << std::endl;std::wcout << "end:" << std::endl;}
}


#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Web.Syndication.h>

包含的标头采用默认项目设置,来自 Windows SDK 的

 %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt 文件夹。 Visual Studio 将该路径包含在其 IncludePath 宏中。 但这些标头并不严格依赖于 Windows SDK,因为项目会(通过 cppwinrt.exe 工具)在项目的 $(GeneratedFilesDir) 文件夹中生成与此相同的标头。 如果在其他位置找不到这些标头,或者你更改了项目设置,则会从该文件夹中加载这些标头。

这些标头包含投影到 C++/WinRT 的 Windows API。 换言之,对于每个 Windows 类型,C++/WinRT 都会定义 C++ 友好等效项(称为“投影类型”)。 投影类型具有与 Windows 类型相同的完全限定名称,但放置于 C++ winrt 命名空间中。 将这些内容放置在预编译标头中将减少增量生成时间。

重要

如果希望使用来自 Windows 命名空间的类型,必须 #include 对应的 C++/WinRT Windows 命名空间标头文件,如上所示。 对应的标头是与该类型的命名空间具有相同名称的标头。 例如,要为 Windows::Foundation::Collections::PropertySet 运行时类使用 C++/WinRT 投影,则应包含 winrt/Windows.Foundation.Collections.h 标头。

C++/WinRT 投影标头通常自动包含其父命名空间头文件。 例如,winrt/Windows.Foundation.Collections.h 包含 winrt/Windows.Foundation.h。 但你不应依赖此行为,因为它是一个随时间推移而变化的实现细节。 必须显式包含所需的任何标头。

winrt::init_apartment();

调用 winrt::init_apartment 会初始化 Windows 运行时中(默认在多线程单元中)的线程。 该调用还会初始化 COM。

Uri rssFeedUri{ L"https://blogs.windows.com/feed" };
SyndicationClient syndicationClient;

堆栈分配两个对象:它们表示 Windows 博客的 URI 和联合客户端。 我们将使用具有简单的宽字符串参数的 uri(请参阅 C++/WinRT 中的字符串处理了解使用字符串的更多方法)。

SyndicationFeed syndicationFeed = syndicationClient.RetrieveFeedAsync(rssFeedUri).get();

SyndicationClient::RetrieveFeedAsync 是异步 Windows 运行时函数的示例。 该代码示例将接收来自 RetrieveFeedAsync 的异步操作对象,然后对该对象调用 get 以阻止调用线程并等待结果(在此例中为联合源)。 要获得有关并发的详细信息和了解非阻止性技术,请参阅 C++/WinRT 的并发和异步操作。

for (const SyndicationItem syndicationItem : syndicationFeed.Items()) { ... }

SyndicationFeed.Items 是一个范围,由从 begin 和 end 函数(或其常量、反向和常量-反向变体)返回的迭代程序定义。 因此,可以使用基于范围的 for 语句或使用 std::for_each 模板函数枚举。 循环访问此类 Windows 运行时集合时,需要指定 #include <winrt/Windows.Foundation.Collections.h>

winrt::hstring titleAsHstring = syndicationItem.Title().Text();// Omitted: there's a little bit of extra work here to remove the trademark symbol from the title text.std::wcout << titleAsHstring.c_str() << std::endl;

获取源的标题文本以作为 winrt::hstring 对象(有关更多详细信息,请参阅 C++/WinRT 中的字符串处理)。 然后,hstring 通过 c_str 函数输出,这反映使用 C++ 标准库字符串的模式。

可以看到,C++/WinRT 鼓励使用类似于类的新式 C++ 表达式,例如 syndicationItem.Title().Text()。 这是与传统的 COM 编程不同的更简洁的编程风格。 无需直接初始化 COM,也无需处理 COM 指针。

也不需要处理 HRESULT 返回代码。 C++/WinRT 会将错误 HRESULT 转换为异常(如 winrt::hresult-error)以实现自然、现代化的编程风格。 有关错误处理以及代码示例的详细信息,请参阅 C++/WinRT 的错误处理。


修改 Windows 桌面应用程序项目以添加 C++/WinRT 支持

一些桌面项目(例如,Visual Studio 中的 WinUI 3 模板)内置了 C++/WinRT 支持。

但是,本部分介绍了如何将 C++/WinRT 支持添加到你可能具有的任何 Windows 桌面应用程序项目。 如果你没有 Windows 桌面应用程序项目,可以先遵循以下步骤创建一个。 例如,打开 Visual Studio 并选择“Visual C++”>“Windows 桌面”>“Windows 桌面应用程序”来创建一个项目。

可以选择性地安装 C++/WinRT Visual Studio 扩展 (VSIX) 和 NuGet 包。 有关详细信息,请参阅 C++/WinRT 的 Visual Studio 支持。

设置项目属性

转到项目属性“常规”>“Windows SDK 版本”,然后选择“所有配置”和“所有平台”。 确保“Windows SDK 版本”设置为 10.0.17134.0(Windows 10 版本 1803)或更高。

确认你没有遇到为何我的新项目不能编译?的问题。

由于 C++/WinRT 使用 C++17 标准版中的功能,请将项目属性“C/C++”>“语言”>“C++ 语言标准版”设置为“ISO C++17 标准版(/std:c++17)”。

预编译的标头

默认项目模板将为你创建名为 framework.h 或 stdafx.h 的预编译标头。 请将它重命名为 pch.h。 如果已有一个 stdafx.cpp 文件,请将它重命名为 pch.cpp

将项目属性“C/C++”>“预编译标头”>“预编译标头”设置为“创建(/Yc)”,将“预编译标头文件”设置为“pch.h”。

查找所有 #include "framework.h"(或 #include "stdafx.h")并将其替换为 #include "pch.h"

在 pch.h 中包含 winrt/base.h

// pch.h
...
#include <winrt/base.h>

链接

C++/WinRT 语言投影依赖于某些 Windows 运行时自由(非成员)函数和入口点,需要链接到 WindowsApp.lib 伞型库。 本部分介绍满足链接器要求的三种方式。

第一种做法是将所有 C++/WinRT MSBuild 属性和目标添加到 Visual Studio 项目。 为此,请在项目中安装 Microsoft.Windows.CppWinRT NuGet 包。 在 Visual Studio 中打开项目,单击“项目”>“管理 NuGet 包...”>“浏览”,在搜索框中键入或粘贴“Microsoft.Windows.CppWinRT”,在搜索结果中选择该项,然后单击“安装”以安装该项目的包。

也可以使用项目链接设置来显式链接 WindowsApp.lib。 或者,可以在源代码中(例如,在 pch.h 中)按如下所示执行此操作。

#pragma comment(lib, "windowsapp")

 

现在,可以编译、链接 C++/WinRT 代码并将其添加到项目(例如,类似于前面 C++/WinRT 快速入门部分所示的代码)。


C++/WinRT 的三大应用方案

在使用和熟悉 C++/WinRT 的过程中,以及在阅读本文档余下内容的过程中,你可能会注意到有三大应用方案,详见后面部分的介绍。

使用 Windows API 和类型

也就是说,使用或调用 API。 例如,通过 API 调用使用蓝牙进行通信、流式传输和提供视频、与 Windows shell 集成,等等。 C++/WinRT 完全支持此类方案。 有关详细信息,请参阅通过 C++/WinRT 使用 API。

创作 Windows API 和类型

也就是说,生成 API 和类型。 例如,生成上一部分介绍的 API 类型、图形 API、存储和文件系统 API、网络 API 等。 有关详细信息,请参阅使用 C++/WinRT 创作 API。

使用 C++/WinRT 创作 API 涉及的事项要稍多于使用 API 的情况,因为你必须使用 IDL 来定义 API 的形状,然后才能实现它。 XAML 控件;绑定到 C++/WinRT 属性中详述了此方面的操作。

XAML 应用程序

此方案涉及在 XAML UI 框架上构建应用程序和控件。 在 XAML 应用程序中工作相当于既要使用,又要创作。 但是,由于 XAML 是当今的 Windows 主流 UI 框架,其对 Windows 运行时的影响也同样很大,因此有必要专门设置一个它的应用方案类别。

请注意,XAML 最适用于提供反射的编程语言。 在 C++/WinRT 中,有时需要做一些额外的工作才能与 XAML 框架互操作。 所有这些情况均在相应文档中进行了介绍。 可以从 XAML 控件;绑定到 C++/WinRT 属性和 XAML 自定义(模板化)控件与 C++/WinRT 着手。

使用 C++/WinRT 编写的示例应用

请参阅可在哪里找到 C++/WinRT 示例应用?。

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

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

相关文章

支付功能测试用例测试点?

支付功能测试用例测试点是指在测试支付功能时&#xff0c;需要关注和验证的各个方面。根据不同的支付场景和需求&#xff0c;支付功能测试用例测试点可能有所不同&#xff0c;但一般可以分为以下几类&#xff1a; 功能测试&#xff1a;主要检查支付功能是否符合设计和业务需求…

RTTI结构详细分析(VC++)

对于RTTI结构的资料真的屈指可数,类的逆向也一直是一个不好弄的问题.对此我只想贡献我的一份力量。 文中我不会分析类的内存布局,因为有很多资料已经分析的挺好的了(见参考资料)。但是现有我能找到的资料对RTTI结构的表述不完整,或者表述模糊不清,参考Clang的部分源码后&#…

一些前端学习过程的自测练习题

目录 页面设计部分 1 设计一个简单的学院网站首页&#xff1b; 2.按照图示要求完成简单的登录页面 3.完成如下网站设计 4.完成如下网站设计&#xff08;练习页面布局&#xff09; 5 利用下面素材&#xff0c;设计一个满足H5规范的网页&#xff08;移动端页面练习&#xff…

Java中单体应用锁的局限性分布式锁

互联网系统架构的演进 在互联网系统发展之初&#xff0c;系统比较简单&#xff0c;消耗资源小&#xff0c;用户访问量也比较少&#xff0c;我们只部署一个Tomcat应用就可以满足需求。系统架构图如下: 一个Tomcat可以看作是一个JVM进程&#xff0c;当大量的请求并发到达系统时&…

Redis:原理速成+项目实战——Redis企业级项目实战终结篇(HyperLogLog实现UV统计)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战14&#xff08;BitMap实现用户签到功能&#xff09; &#x1f4da;订阅专栏&am…

[易语言]使用易语言部署工业级人脸检测模型

【框架地址】 https://github.com/ShiqiYu/libfacedetection 【算法介绍】 Libfacedetection是一个开源的计算机视觉库&#xff0c;主要用于实时的人脸检测。它利用深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;实现了高精度的脸部定位…

【java八股文】之MYSQL基础篇

1、数据库三大范式是什么 第一范式&#xff1a;每个列都不可以再拆分。 第二范式&#xff1a;在第一范式的基础上&#xff0c;非主键列完全依赖于主键&#xff0c;而不能是依赖于主键的一部分。 第三范式&#xff1a;在第二范式的基础上&#xff0c;非主键列只依赖于主键&#…

AtCoder ABC194

这期比193稍微简单一点 C - Squared Error 手玩一下&#xff1a; N 3 N3 N3时 展开得 a 2 b 2 − 2 a b b 2 − c 2 − 2 b c a 2 c 2 − 2 a c a^2b^2-2abb^2-c^2-2bca^2c^2-2ac a2b2−2abb2−c2−2bca2c2−2ac 每个数平方项都要计算 n − 1 n-1 n−1次 减的那一份可…

C语言--结构体详解

C语言--结构体详解 1.结构体产生原因2.结构体声明2.1 结构体的声明2.2 结构体的初始化2.3结构体自引用 3.结构体内存对齐3.1 对齐规则3.2 为什么存在内存对齐3.3 修改默认对⻬数 4. 结构体传参 1.结构体产生原因 C语言将数据类型分为了两种&#xff0c;一种是内置类型&#xf…

蓝桥杯单片机组备赛——数码管动态显示

✨文章内容会不断优化&#xff0c;如果你感兴趣的话&#xff0c;欢迎点藏收藏关注我哟 &#x1f9e8;如果文章有哪里看不懂的欢迎评论区或私信留言&#xff0c;我会及时回复的 ⏰如果文章出现错误&#xff0c;欢迎指正&#xff0c;看到后我会马上改正 文章目录 一、动态显示原理…

oracle 19c容器数据库data dump数据泵传输数据(3)---完全传输

目录 查看pdb1 创建pdb2 从pdb1 中导出元数据 在pdb2中导入元数据&#xff08;dmp文件&#xff09; Full Transportable Export/Import: Example 只传输除了system&#xff0c;sysaux&#xff0c;temp&#xff0c;undo以外的用户表空间&#xff0c;這種方式傳輸的是用戶自定…

一文学会服务网格与istio使用

服务网格 现代应用程序通常被设计成微服务的分布式集合&#xff0c;每个服务执行一些离散的业务功能。服务网格是专门的基础设施层&#xff0c;包含了组成这类体系结构的微服务网络。 服务网格不仅描述了这个网络&#xff0c;而且还描述了分布式应用程序组件之间的交互。所有在…

如何生成文本: 通过 Transformers 用不同的解码方法生成文本

如何生成文本: 通过 Transformers 用不同的解码方法生成文本 假设 $p0.92$&#xff0c;Top-p 采样对单词概率进行降序排列并累加&#xff0c;然后选择概率和首次超过 $p92%$ 的单词集作为采样池&#xff0c;定义为 $V_{\text{top-p}}$。在 $t1$ 时 $V_{\text{top-p}}$ 有 9 个…

运用AI搭建中间服务层(五)

其他文件的修改 ValuesControllers.cs 注意Post的参数从[FromBody]变成了[FromForm]&#xff0c;以便接收上传的图片流数据 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using CognitiveMi…

Halcon滤波器sobel_amp算子

Halcon滤波器sobel_amp算子 Halcon 提供了大量的边缘滤波器&#xff0c;最常用的是Sobel滤波器。它是一种经典的边缘检测算子&#xff0c;速度和效率都非常令人满意。其在Halcon中对应的算子为sobel amp算子和sobel_dir算子&#xff0c;二者都是使用Sobel算子进行边缘检测。前…

【LangChain学习之旅】—(8) 输出解析:用OutputParser生成鲜花推荐列表

【LangChain学习之旅】—&#xff08;8&#xff09; 输出解析&#xff1a;用OutputParser生成鲜花推荐列表 LangChain 中的输出解析器Pydantic&#xff08;JSON&#xff09;解析器实战第一步&#xff1a;创建模型实例第二步&#xff1a;定义输出数据的格式第三步&#xff1a;创…

运算电路(1)——加法器

一、引言 微处理器是由一片或少数几片大规模集成电路组成的中央处理器。这些电路执行控制部件和算术逻辑部件的功能。微处理器能完成取指令、执行指令&#xff0c;以及与外界存储器和逻辑部件交换信息等操作&#xff0c;是微型计算机的运算控制部分。它可与存储器和外围电路芯片…

Zabbix监控系统及部署

目录 前言 一个完整的项目 业务架构 运维架构 优秀监控软件的好处 1.zabbix概述 zabbix是什么 zabbix监控原理 Zabbix6.0新特性 1.Zabbix server高可用防止硬件故障或计划维护期的停机 2.Zabbix6.0 LTS新增Kubernetes监控功能&#xff0c;可以在Kubernetes系统从多个…

前端工程化相关

工具方法&#xff1a; 知道软件包名&#xff0c;拿到源码或者路径的方法 在浏览器输入以下内容&#xff0c;就可以找到你想要的。。。 unpkg.com/输入包名 一、模块化 ESM特性清单&#xff1a; 自动采取严格模式&#xff0c;忽略“use strict”每个ESM模块都是单独的私有作用…

网络——华为与华三

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 写在前面 大家好&#xff0c;我是网络豆&#xff0…