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++编译器的质量要求很高。