C++/WinRT到底是什么?

30
我一直在网上搜索,我找到了这个C++/WinRT

C++/WinRT是一个标准的C++17头文件库。

但它到底是什么呢?它是一个新的面向对象替代老旧的Win32 API吗?它是Windows上Qt框架的替代品吗?它是一个网络库(大多数示例似乎都是关于网络)?它是一个GUI框架吗?它是编写新Windows应用程序的首选方式吗?它是臭名昭著的MFC库的替代品吗?

2
@user207421,这并没有真正回答我的问题。你能帮我看看我错过了什么吗?也许从标签信息中提取一个完全回答我的问题的小片段? - Aydan Haqverdili
2
进一步阅读,请访问以下链接:https://en.wikipedia.org/wiki/C%2B%2B/WinRT,https://github.com/Microsoft/cppwinrt - M.M
看起来它有免费的COM编写,15年前我会非常喜欢它 :) - M.M
@m.m:不是这样的。虽然MIDL 3.0相比旧版MIDL有了很大的改进,但如果您希望从组件中导出类型,仍需要编写MIDL文件。cppwinrt.exe可以从.winmd文件生成头文件,但这并不是完全新的东西。我们在15年前就已经有了.TLB文件。 - IInspectable
标签信息回答了您提出的所有六个具体问题。 - user207421
显示剩余3条评论
3个回答

29
IInspectable的回答在事实上是正确的,但更多的背景信息可能也会有所帮助...
C++/CX(也称为Visual C++的/ZW开关),Windows Runtime Library(WRL)和C++/WinRT基本上都是做同样的事情:提供一种从C++调用“Windows Runtime”风格的API和类型以及编写“Windows Runtime”风格的API和类型的机制。
OP的问题涉及到一个更基本的问题:Windows Runtime API的意义是什么?
原始的Win32 API是为本地代码世界设计的,大多数程序都是用C或C++编写的。组件对象模型(COM)被创建为一种使用相同基本应用程序二进制接口(ABI)处理运行时版本控制(和许多其他功能)的方式。C++是使用COM的一种更自然的方式,但你仍然可以通过各种宏和其他方式在技术上使用C。
.NET和其他托管语言稍后出现,并使用不同的调用机制。你可以使用本机互操作性来访问Win32或COM API,但它们通常不以非常“C#友好”的方式工作。已经创建了各种“包装程序集”来提供一种更符合C#自然方式的访问基本的C/C++ API和类型的方法。
随着互联网的发展,尤其是全球网络的普及,另一类应用程序开始使用HTML5+JavaScript进行编写。它们没有特定的Win32或COM API访问权限,因此需要编写特殊的模块和库来填补功能空缺。
考虑到这三种主要方法,"Windows Runtime"风格(WinRT)是一种将COM的特性与.NET的反射丰富元数据相结合的方法。其想法是可以编写一次API,然后可以被C++、C#和HTML5+JavaScript使用。
当然,除了能够调用ABI之外,使用API还存在许多问题,而且每种语言范式都非常不同,但从系统编程的角度来看,这就是它的意义所在。
此外,还有一种使用Windows Runtime API的UWP(通用Windows平台),它本身有三种基本的应用模型:XAML、DirectX和XAML+DirectX。如果使用C++编写,这些应用程序可以大量使用C++/WinRT,但也可以从Win32桌面应用程序中使用Windows Runtime API。
WRL真的是“ATL 2.0”,是对C++与Windows Runtime API之间互操作性的第一次尝试。你可以使用它来使用和创建Windows Runtime类型,但是这需要相当多的手动工作,并且没有很好的公开文档。在Win32桌面应用程序中,主要的实用工具是Microsoft::WRL::ComPtr智能指针。
如果你想知道为什么存在C++/CX,请参阅这个博客系列。它旨在成为C++的易于使用的模型,但经常与Managed C++混淆(它使用相同的保留关键字,但与Managed C++或.NET没有任何关系),并且不受其他编译器支持。
如果你想了解更多关于C++/WinRT的一般原因,请参阅MSDN Magazine文章。它旨在提供一种更加友好的C++方式来使用Windows Runtime API,可在其他非Microsoft编译器上使用,并且在Windows Runtime开发的内部和外部越来越多地被使用。它需要C++17语言特性,因此对你的C++编译器的质量要求很高。

1
“WRL 真的是 'ATL 2.0'” 已经说明了一切!此外,C++/WinRT 如何表示 ABI 类型 还提供了易于阅读的摘要。 - Laurie Stearn

27
C++/WinRT是一个用于Windows Runtime (WinRT) API的语言投影。Windows Runtime1是Windows使用的基础架构,用于公开其API。它旨在成为扁平的、基于C的Win32 API的继任者(尽管您可以同时使用Windows Runtime和Windows API)。
C++/WinRT(像其他语言投影一样)将基于COM的Windows Runtime接口转换为自然的、惯用的语言模式,对于C++/WinRT来说是"C++"。最值得注意的是,它有三个作用:
  • 通过将引用计数绑定到智能指针的对象生命周期,自动化管理COM对象的资源。
  • 它在COM的错误报告(基于HRESULT返回值)和基于C++异常的C++错误报告之间进行翻译。
  • 它将基于IAsyncInfo的Windows Runtime异步模式映射到C++20协程。

使用(当时新的)Windows Runtime 作为传递渠道,发布了几项新技术。其中最明显的是新的 UI 框架。据我所知,它仍然没有名称。它曾经被称为“Metro”、“Modern UI”、“Fluent Design”。我听到的最新术语是“Windows Presentation Platform”。它使用 Direct2D 渲染,并通常使用 XAML 编写。
虽然经常与 Windows Runtime 混淆,但 Windows Presentation Platform 只是技术的客户端。它不是 Windows Runtime 本身的一部分。
另一个重要的点是,Windows Runtime 不强制使用任何特定的 UI 库或框架。它在经典桌面应用程序中(使用 Win32、MFC、WTL、wxWidgets 等直接编写),或者 .NET 应用程序中(Windows Forms、WPF)同样有效,就像在具有 XAML/Windows Presentation Platform UI 的应用程序中一样。

1 Windows Runtime使用现代化的COM版本进行公开。组件可以被各种语言消费和编写。组件使用符合ECMA-335元数据(.winmd文件)对其公共接口进行编码。该技术本身不依赖于.NET或CLR。


3
它是否完全取代了Win32 API?除了你在回答中提供的链接外,我没有看到其他人谈论过C++/WinRT。 - Aydan Haqverdili
7
我不知道它的使用范围有多广泛。我相信在Microsoft内部,它已经取代了以前所有使用的WRL和C++/CX。但是在微软以外,我从来没有看到过任何招聘信息表明要使用C++/WinRT(甚至只是本机Windows Runtime开发)。微软在解释Windows Runtime是什么、语言投影如何适配其中,以及UWP与Windows Runtime不同方面做得非常糟糕。似乎每个人都认为Windows Runtime是托管代码,在C#中最好使用,并需要针对UWP进行定位(这三个都是错误的)。 - IInspectable
5
现在进行Windows开发的主要方式是什么?仍然是Win32吗?还是其他的C++库/API?是否类似于C#和相关的库? - Aydan Haqverdili
5
这真的取决于你需要什么。对于我的个人工具,我经常只是使用一个经典的桌面UI,主要对话框是在.rc文件中编写的,并且使用了大量的C++/WinRT与Windows运行时进行接口交互,并且有相当数量的Win32 API调用,因为在Windows Runtime中没有相应的功能,或者仅仅是因为在Windows API中打开文件更不麻烦。你可以将所有这些混合在单个应用程序中,甚至是命令行应用程序。但是,使用C++/WinRT和XAML仍然很麻烦。当它起作用时很有趣,但它经常无法正常工作。 - IInspectable
2
@user1,基本的东西已经22年没有改变了,你可以在任何地方学习基础知识,并浏览特定函数的在线文档。 - M.M
显示剩余12条评论

-1
我访问了这篇帖子,想知道应该下载/使用哪个带有“WinRT”后缀的Qt安装程序二进制文件,还是不带“WinRT”后缀的。
但是现有的答案真的没有帮助。
而且看起来,因为我需要支持Windows 7,所以我将下载/使用不带“WinRT”后缀的版本。
请注意,带有“ucrt”和“msvcrt”后缀的二进制文件似乎在Windows 7上都可以正常运行,请检查其他后缀。
详细情况如下:
  • Win32:自32位时代开始(但Win32是API名称,与32位与64位无关,甚至被64位二进制文件使用)。
  • Metro:自Windows 8.0开始(但很快就消失了)。
  • WinRT:自Windows 8.1开始。
  • UWP(通用Windows平台):自Windows 10开始,并且无法在Windows 7上运行,但可以使用老旧的Win32Win32不会很快消失)。

为什么选择Windows 7?

在一些国家,存在着被称为“游戏网吧”的商店,基本上只有电脑,全部连接到同一个局域网(LAN)。

Windows 7使用的RAM和CPU较少,而且作为一个额外的好处,许多电脑有免费的Windows 7许可证。

因此,这些电脑是游戏网吧的最佳选择,并且非常希望支持Windows 7。


当问题是关于C++/WinRT是什么的时候,一个不解释C++/WinRT是什么的答案是没有帮助的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接