如何在Windows运行时中使用Win32结构?
摘要
本文解释了如何通过声明具有相同布局的影子结构在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我正在写入二进制文件?
本文解释了Windows在操作系统层面并没有内置二进制与文本模式的概念;这种区别是由运行时库(如C运行时)处理的。它澄清了Windows将所有文件视为字节,内容转换必须手动执行或通过库来完成。
如果C#和JavaScript允许我多次等待Windows Runtime异步操作,为什么C++/WinRT不行?
Raymond Chen解释了为什么C++/WinRT不像C#、JavaScript和Python那样允许多次等待异步操作,其原因是没有标准库的task类型,以及不为你未使用的功能付费的原则。
Theseus: 将 win32 翻译为 wasm
将 Windows 可执行文件 (win32/x86) 翻译为 WebAssembly 以在浏览器中运行,讨论诸如阻塞与异步设计等挑战。
在多个协程之间共享单个Windows Runtime IAsyncOperation的结果,第3部分
本文讨论了一个C++/WinRT模式,用于缓存Windows Runtime IAsyncOperation的结果,包括处理失败的情况,以便多个协程可以共享缓存的结果或异常。
C语言中在C++中仍然无法工作的构造——以及一些已发生变化的构造
一篇更新经典调查的博文,关于C语言中在C++中无法工作的构造,涵盖了C++20和C23标准中影响兼容性的变化。