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

目录

前言

介绍

快速入门

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

代码示例


前言

关于分篇

本文是根据官方文档去除一部分相对不需要关注的内容,整理的简洁版本教程,为避免博客过长分为几篇。

C++/WinRT教程(第二篇)基础类型的使用-CSDN博客

C++/WinRT教程(第三篇)API的使用-CSDN博客

C++/WinRT教程(第四篇)WinRT 的错误和异常处理-CSDN博客

更新中。。

关于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)。

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

通过 C++/WinRT,你还可以使用标准 C++ 实现自己的运行时类,而不必求助于 COM 样式的编程。对于运行时类,你只需在 IDL 文件中描述类型,midl.exe 和 cppwinrt.exe 将为你生成实现样板源代码文件。 也可以从 C++/WinRT 基类派生,这样就可以只实现接口。 有关详细信息,请参阅使用 C++/WinRT 创作 API。 

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

快速入门

首先创建一个空项目,然后将下面两段代码拷贝进去

注意:编译代码需要支持C++17,如果使用VS编译请在项目属性内语言标准修改为C++17以上

// pch.h
#pragma once

#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 会初始化 Windows 运行时中(默认在多线程单元中)的线程。 
  // 该调用还会初始化 COM。
  winrt::init_apartment();

  Uri rssFeedUri{L"https://blogs.windows.com/feed"};//Windows 博客的 URI
  SyndicationClient syndicationClient;
  syndicationClient.SetRequestHeader(L"User-Agent",
                                     L"Mozilla/5.0 (compatible; MSIE 10.0; "
                                     L"Windows NT 6.2; WOW64; Trident/6.0)");

  // 接收来自 RetrieveFeedAsync 的异步操作对象,
  // 然后对该对象调用 get 以阻止调用线程并等待结果(在此例中为联合源)
  SyndicationFeed syndicationFeed =
      syndicationClient.RetrieveFeedAsync(rssFeedUri).get();

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

    // 获取源的标题文本以作为 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)”。

默认项目模板将为你创建名为 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")

代码示例

浏览代码示例 | Microsoft Learn

  • 40
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Windows 10 中调用系统相机并录像,可以使用 Windows.Media.Capture 命名空间中的 API。以下是一个示例代码,它使用 Windows.Media.Capture 命名空间中的 API 捕获摄像头并将视频保存为 MP4 文件: ```c++ #include <winrt/Windows.Foundation.h> #include <winrt/Windows.Media.Capture.h> #include <winrt/Windows.Storage.Streams.h> #include <iostream> using namespace winrt; using namespace Windows::Foundation; using namespace Windows::Media::Capture; using namespace Windows::Storage::Streams; using namespace std; int main() { // 创建 MediaCapture 对象 MediaCapture capture; capture.InitializeAsync().get(); // 创建 MediaEncodingProfile 对象 auto profile = MediaEncodingProfile::CreateMp4(VideoEncodingQuality::Auto); // 创建 StorageFile 对象并指定保存路径 auto file = co_await Windows::Storage::KnownFolders::VideosLibrary().CreateFileAsync( L"output.mp4", Windows::Storage::CreationCollisionOption::GenerateUniqueName); // 创建 MediaTranscoder 对象并指定输出文件 auto transcoder = MediaTranscoder(); transcoder.SetOutputFileAsync(file).get(); // 开始录像 auto record = capture.PrepareLowLagRecordToStorageFileAsync(profile, file).get(); record.StartAsync().get(); cout << "正在录像,请按 Enter 停止录像..." << endl; cin.get(); // 停止录像 record.StopAsync().get(); return 0; } ``` 这个示例代码会初始化 MediaCapture 对象,并使用 MediaEncodingProfile 来指定输出视频的编码格式和质量。然后,它会创建一个 StorageFile 对象来指定保存视频的路径,接着创建 MediaTranscoder 对象并将输出文件指定为刚才创建的 StorageFile 对象。最后,它会使用 PrepareLowLagRecordToStorageFileAsync 方法开始录像,等待用户按下 Enter 后再使用 StopAsync 方法停止录像。你可以修改输出视频的编码格式和质量,以及视频文件的名称和路径。需要注意的是,这个示例代码使用了 C++/WinRT,你需要将项目设置为使用 C++/WinRT,或手动添加 C++/WinRT 的头文件和库文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值