【问题标题】:C++ language projectionC++语言投影
【发布时间】:2023-01-25 19:34:59
【问题描述】:

你能用自己的话解释一下它的意思吗:Standard C++17 language projection for Windows Runtime API (WinRT)(欢迎举例)?

在microsovt网站上,一切都描述得太复杂了,我无法理解这个术语

【问题讨论】:

  • 此处引用:learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis。这是一个奇怪的术语,快速浏览一下我不知道它应该是什么意思。更多信息:en.wikipedia.org/wiki/C%2B%2B/WinRT
  • 同意这是一个尴尬的术语,但我相信他们只是指制作一个包装器,将 COM 功能(接口、线程、接收器)映射到感觉自然的 C++17 语法。将其与 _com_ptr_t<> 等其他 MS COM 包装器进行对比,虽然在 90 年代很方便,但按照 C++17 标准感觉很笨重。

标签: c++ windows c++-winrt


【解决方案1】:

这种混淆一直追溯到微软在解释时发生的巨大通信灾难什么Windows 运行时是。从广义上讲,它是 the foundational technology that underpins the "future" of the Windows API(“未来”早在十多年前就已经到来)。

Windows 运行时1个基于 COM 的演变,继承了其基本属性之一:严格的 ABI 合同,支持语言不可知论。 ABI 的任何一侧都可以用几乎任何编程语言编写。

Windows 运行时中的功能通过Windows Runtime Components 部署。 WinRT组件一般由两部分组成:

  • 一个WinMD文件,以机器可读的方式描述提供的接口
  • 实现功能的二进制文件

虽然可以直接在 ABI 与 WinRT 组件通信(使用 WRL 或直接 C),但这很快就会变得笨拙且容易出错。这就是“语言投影”发挥作用的地方:通常基于工具和库,它们将原始 ABI“投影”为给定编程语言的更易于管理、更安全的抽象(例如 C++C# 或 @987654329 @).

C++/WinRT 语言投影提供了大量的翻译,包括

  • 自动引用计数,由 com_ptr 类模板提供
  • C++ 异常和 ABI 兼容 HRESULT 错误代码之间的转换
  • 将异步操作公开为 C++20 协程
  • delegates 映射到提供函数调用运算符的任何对象(例如函数、成员函数、lambda 表达式等)
  • WinRT 日期和时间基元与 std::chrono 类型之间的无缝转换
  • static 实例方法公开为 static 类成员(即使它们在技术上是在类型的 activation factory 上实现的)
  • ...

简而言之,语言投影使 WinRT 类型对于任何给定语言看起来尽可能自然,隐藏 ABI 的所有方面,目​​的是让不(关心)了解该技术内部结构的程序员可以访问 Windows 运行时.

时至今日,该计划只真正适用于 C# 开发人员(具有讽刺意味的是,他们主要假设 Windows 运行时由 CLR 提供支持)。


1个用词不当,抱歉。它不包含任何传统意义上的运行时组件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2017-05-24
    • 1970-01-01
    相关资源
    最近更新 更多