C++/WinRT简介

Sat 10 August 2019 / In categories Platform

WinRT, cppwinrt

如何使用较为标准的C++语言来编写WinRT应用。

为什么这么说?因为之前用来编写WinRT应用的语言叫做C++/CX,在语言层面参杂了一些微软自身的语法扩展,不是标准的C++。而C++/WinRT试图用标准化的C++来编写WinRT(虽然使用到了一些还没有被标准化的语言特性,但是总体上还算比较C++)。它采用的方式是解析WinRT的winmd元文件,生成一堆C++头文件库,来帮助用户编写WinRT程序。

另一个被C++/WinRT替换的工具是Windows Runtime C++ Template Library (WRL)

根据C++/WinRT初始作者的这篇博文The State of C++ on Windows,C++/WinRT主要用来

  1. Using or calling Windows APIs (otherwise known as consuming WinRT types)
  2. Authoring Windows APIs (otherwise known as producing WinRT types)
  3. Authoring Xaml apps and controls

前两个条目的意思是消费和生成Windows API,这是C++/WinRT比较擅长的;第三个条目是XAML应用相关的,作者提到,目前C++尚不支持反射,所以操作体验来不是非常好。

一些开发工具相关的信息:

  • C++/WinRT正式被包含在Windows SDK 10.0.17134.0 (Windows 10, version 1803)中,可以通过命令行cppwirnt来体验。Introduction to C++/WinRT介绍了如何安装WinRT以及相应的扩展。
  • C++/WinRT在调试模式下默认开启natvis(native debug visualization),如果需要在发布模式下开启此功能,则需要定义WINRT_NATVIS宏。
  • 使用C++/WinRT创建的项目默认启用 Microsoft.Windows.CppWinRT(readme)这个NuGet包。这使得在没有安装C++/WinRT扩展的机器上也能编译相应的项目。此NuGet包里面带有最新的cppwinrt(比SDK中的新)
  • C++/WinRT开启了一些必要的编译器选项,比如:/std:C++17, /bigobj, /await等等
  • 虽然Windows SDK带有C++/WinRT相关的头文件(%WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt),但是cppwinrt会在项目目录$(GeneratedFilesDir)生成WinRT相关的头文件,会占据非常大的空间。相关类型的文档可以在winrt namespace (C++/WinRT)查阅。

C++/WinRT支持一下项目模板:

  • Blank App (C++/WinRT),提供对XAML的支持
  • Core App (C++/WinRT),和上一个选项类似,不过默认不提供XAML支持,都是基于CoreApplicatoin模型
  • Windows Console Application (C++/WinRT),控制台程序
  • Windows Desktop Application (C++/WinRT),桌面程序
  • Windows Runtime Component (C++/WinRT),制作WinRT接口

Get started with C++/WinRT相关:

  • winrt::init_apartment();在WinRT里面初始化了程序的线程,默认情况下是多线程的apartment。同时,COM也会被初始化。
  • C++/WinRT会把错误结果HRESULTs 转化成异常winrt::hresult-error
  • C++/WinRT需要连接到WindowsApp.lib这个非WinRT库

其他参考

API reference for Universal Windows Platform (UWP) apps

(完)

Load Disqus Comments