目录
前言
介绍
快速入门
修改 Windows 桌面应用程序项目添加 C++/WinRT 支持
代码示例
前言
关于分篇
本文是根据官方文档去除一部分相对不需要关注的内容,整理的简洁版本教程,为避免博客过长分为几篇。
C++/WinRT教程(第二篇)基础类型的使用-****博客
C++/WinRT教程(第三篇)API的使用-****博客
C++/WinRT教程(第四篇)WinRT 的错误和异常处理-****博客
更新中。。
关于winrt
C++/WinRT 是 Windows 运行时 (WinRT) API 的完全标准新式 C++17 语言投影,以基于标头文件的库的形式实现。 利用 C++/WinRT,你可以采用任何符合标准的 C++17 编译器创作和使用 Windows 运行时 API。 Windows SDK 包含 C++/WinRT;它已在版本 10.0.17134.0(Windows 10,版本 1803)中引用
环境要求:
- 支持 C++17 的编译器
- windows系统版本10.0.17134.0(Windows 10,版本 1803)以上
- Windows SDK 目标版本 10.0.17134.0(Windows 10 版本 1803)
介绍
C++/WinRT 是 Microsoft 推荐的用于替代 C++/CX 语言投影和 Windows 运行时 C++ 模板库 (WRL) 的替代品。 有关 C++/WinRT 的主题的完整列表介绍了如何与 C++/CX 和 WRL 进行互操作,以及如何通过它们进行移植。
Visual Studio 2022 内置了 C++/WinRT 项目和项模板,让你可以立刻开始进行 C++/WinRT 开发。
对于早期版本的 Visual Studio,需要从 Visual Studio Marketplace 下载并安装最新版 C++/WinRT Visual Studio 扩展 (VSIX)。
- VSIX 扩展提供 Visual Studio 中的 C++/WinRT 项目和项模板。
- 另外,它还提供 C++/WinRT 投影类型的 Visual Studio 本机调试可视化效果 (natvis)。
也可通过手动安装 NuGet 包来转换现有项目。 在安装(或更新到)最新版 VSIX 扩展以后,请在 Visual Studio 中打开现有项目,然后单击“项目”>“管理 NuGet 包...”>“浏览”,在搜索框中键入或粘贴“”,在搜索结果中选择该项,然后单击“安装”以安装该项目的包。 添加该包后,你将获得对该项目的 C++/WinRT MSBuild 支持,包括调用 工具。
通过 C++/WinRT,你还可以使用标准 C++ 实现自己的运行时类,而不必求助于 COM 样式的编程。对于运行时类,你只需在 IDL 文件中描述类型, 和
将为你生成实现样板源代码文件。 也可以从 C++/WinRT 基类派生,这样就可以只实现接口。 有关详细信息,请参阅使用 C++/WinRT 创作 API。
如需 工具的自定义选项的列表,请通过项目属性进行设置,详见 NuGet 包自述文件。
快速入门
首先创建一个空项目,然后将下面两段代码拷贝进去
注意:编译代码需要支持C++17,如果使用VS编译请在项目属性内语言标准修改为C++17以上
//
#pragma once
#include <winrt/>
#include <winrt/>
#include <iostream>
//
#include ""
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;
int main() {
// 调用 winrt::init_apartment 会初始化 Windows 运行时中(默认在多线程单元中)的线程。
// 该调用还会初始化 COM。
winrt::init_apartment();
Uri rssFeedUri{L"/feed"};//Windows 博客的 URI
SyndicationClient syndicationClient;
(L"User-Agent",
L"Mozilla/5.0 (compatible; MSIE 10.0; "
L"Windows NT 6.2; WOW64; Trident/6.0)");
// 接收来自 RetrieveFeedAsync 的异步操作对象,
// 然后对该对象调用 get 以阻止调用线程并等待结果(在此例中为联合源)
SyndicationFeed syndicationFeed =
(rssFeedUri).get();
// 是一个范围,由从 begin 和 end 函数(或其常量、反向和常量-反向变体)返回的迭代程序定义。
// 因此,可以使用基于范围的 for 语句或使用 std::for_each 模板函数枚举项。
// 循环访问此类 Windows 运行时集合时,需要指定 #include <winrt/>。
for (const SyndicationItem syndicationItem : ()) {
winrt::hstring titleAsHstring = ().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()};
(
remove((), (), L'™'),
());
// 获取源的标题文本以作为 winrt::hstring 对象,
// 然后,hstring 通过 c_str 函数输出
titleAsHstring = titleAsStdWstring;
std::wcout << titleAsHstring.c_str() << std::endl;
//暂停退出
std::wcin >> titleAsStdWstring;
}
}
关于代码含义请参考代码注释
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)”。
默认项目模板将为你创建名为 或
的预编译标头。 请将它重命名为
。 如果已有一个
文件,请将它重命名为
。 将项目属性“C/C++”>“预编译标头”>“预编译标头”设置为“创建(/Yc)”,将“预编译标头文件”设置为“”。
查找所有 #include ""
(或 #include ""
)并将其替换为 #include ""
。
在 中包含
winrt/
。
//
...
#include <winrt/>
C++/WinRT 语言投影依赖于某些 Windows 运行时*(非成员)函数和入口点,需要链接到 伞型库。 本部分介绍满足链接器要求的三种方式。
第一种做法是将所有 C++/WinRT MSBuild 属性和目标添加到 Visual Studio 项目。 为此,请在项目中安装 NuGet 包。 在 Visual Studio 中打开项目,单击“项目”>“管理 NuGet 包...”>“浏览”,在搜索框中键入或粘贴“”,在搜索结果中选择该项,然后单击“安装”以安装该项目的包。
也可以使用项目链接设置来显式链接 。 或者,可以在源代码中(例如,在
中)按如下所示执行此操作。
#pragma comment(lib, "windowsapp")
代码示例
浏览代码示例 | Microsoft Learn