如何在Windows运行时中使用Win32结构?

The Old New Thing (Raymond Chen) 工具

摘要

本文解释了如何通过声明具有相同布局的影子结构在Windows运行时中使用Win32结构,包括具体示例和常见结构的替代方案。

<p>Windows 运行时旨在为 Windows API 提供一种语言无关的接口:ABI 在整个 Windows 运行时中保持一致,API 本身通过元数据描述,允许每种语言将 Windows 运行时的概念映射到更自然于该目标语言的概念上。例如,Windows 运行时的 <code>DateTime</code> 映射到每种目标语言对应的日期时间类型,如 C++ 的 <code>std::<wbr />chrono::<wbr />time_point</code> 或 JavaScript 的 <code>Date</code>。这一目标的代价是,Windows 运行时的表达能力受限于希望所有功能对所有语言都可用的愿望。例如,Windows 运行时中没有原始指针。</p> <p>在经典 C/C++ 头文件中定义的 Win32 结构不属于 Windows 运行时。因此,从字面上讲,你无法从 Windows 运行时中使用它们。</p> <p>但你可以模拟一下。</p> <p>你可以在 Windows 运行时中声明一个与你想使用的经典 Win32 结构具有相同布局的影子结构。例如,你可以声明自己的 Win32Point 结构:</p> <pre>struct Win32Point { Int32 X; Int32 Y; }; </pre> <p>请注意,对于 Win32 中由结构表示的某些内容,Windows 运行时有其自己的约定。例如,<code>PROPERTYKEY</code> 结构在 Windows 运行时中通常以其字符串形式表示。你可以使用 <code>PSPropertyKeyFromString</code> 和 <code>PSStringFromPropertyKey</code> 等函数在两者之间进行转换。</p> <p>本文《<a href="https://devblogs.microsoft.com/oldnewthing/20260521-00/?p=112345">如何在Windows运行时中使用Win32结构?</a>》首发于 <a href="https://devblogs.microsoft.com/oldnewthing">The Old New Thing</a>。</p>
查看原文
查看缓存全文

缓存时间: 2026/05/22 08:46

# 如何从 Windows Runtime 使用 Win32 结构? - 老生常谈 来源:https://devblogs.microsoft.com/oldnewthing/20260521-00?p=112345 2026年5月21日 0 条回应 Windows Runtime 试图为 Windows API 提供一种语言无关的接口:其 ABI 在整个 Windows Runtime 中保持一致,API 本身通过元数据描述,使每种语言都能将 Windows Runtime 概念映射到更适合该语言的概念。例如,Windows Runtime 中的 `DateTime` 会映射到每种目标语言对应的日期时间类型,比如 C++ 中的 `std::chrono::time_point` 或 JavaScript 中的 `Date`。这一目标的代价是,Windows Runtime 的表达力受限于让所有语言都能使用所有功能的愿望。例如,Windows Runtime 中没有原始指针。 经典 C/C++ 头文件中定义的 Win32 结构不属于 Windows Runtime。因此,从字面意义上讲,你无法从 Windows Runtime 中使用它们。 但你可以模拟它。 你可以在 Windows Runtime 中声明一个影子结构,其布局与你想要使用的经典 Win32 结构相同。例如,你可以声明自己的 `Win32Point` 结构: ``` struct Win32Point { Int32 X; Int32 Y; }; ``` 请注意,Windows Runtime 对某些在 Win32 中用结构表示的事物有自己的约定。例如,`PROPERTYKEY` 结构在 Windows Runtime 中通常以字符串形式表示。你可以使用 `PSPropertyKeyFromString` 和 `PSStringFromPropertyKey` 等函数在它们之间进行转换。 ### 分类 ### 主题 ## 作者 Raymond Chen Raymond 参与 Windows 的发展已超过 30 年。2003 年,他创办了一个名为“The Old New Thing”的网站,其受欢迎程度远超他最疯狂的想象,这一发展至今仍让他感到不安。该网站后来催生了一本书,巧合的是,书名也是《The Old New Thing》(Addison Wesley, 2007)。他偶尔会在 Windows Dev Docs Twitter 账号上讲故事,这些故事不传达任何有用信息。 ## 下一篇 ## 保持关注 新文章发布时获得通知。 关注此博客 - https://twitter.com/ChenCravat - youtube (https://www.youtube.com/playlist?list=PLlrxD0HtieHge3_8Dm48C0Ns61I6bHThc) - https://github.com/oldnewthing - https://devblogs.microsoft.com/oldnewthing/feed/

相似文章

如何告知Windows我正在写入二进制文件?

The Old New Thing (Raymond Chen)

本文解释了Windows在操作系统层面并没有内置二进制与文本模式的概念;这种区别是由运行时库(如C运行时)处理的。它澄清了Windows将所有文件视为字节,内容转换必须手动执行或通过库来完成。

Theseus: 将 win32 翻译为 wasm

Lobsters Hottest

将 Windows 可执行文件 (win32/x86) 翻译为 WebAssembly 以在浏览器中运行,讨论诸如阻塞与异步设计等挑战。