C++/WinRT教程(第一篇)

时间:2025-04-15 07:58:57

目录

前言

介绍

快速入门

修改 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