This article explains how to use Win32 structures in the Windows Runtime by declaring shadow structures with the same layout, including specific examples and alternatives for common structures.
<p>The Windows Runtime attempts to provide a language-independent interface for Windows APIs: The ABI is consistent across the Windows Runtime, and the APIs themselves are described via metadata, allowing each language to map the Windows Runtime concepts into concepts that are more natural for each target language. For example, the Windows Runtime <code>DateTime</code> maps to a corresponding date-time type for each target language, like <code>std::<wbr />chrono::<wbr />time_point</code> for C++ or <code>Date</code> for JavaScript. A cost of this goal is that the expressiveness of the Windows Runtime is constrained by the desire to make all the features available to all languages. For example, there are no raw pointers in the Windows Runtime.</p>
<p>Win32 structures defined in classic C/C++ header files are not part of the Windows Runtime. So in a literal sense, you can’t use them from the Windows Runtime.</p>
<p>But you can fake it.</p>
<p>You can declare a shadow structure in the Windows Runtime that has the same layout as the classic Win32 structure you want to use. For example, you could declare your own Win32Point structure:</p>
<pre>struct Win32Point
{
Int32 X;
Int32 Y;
};
</pre>
<p>Note that the Windows Runtime has its own conventions for some things that in Win32 are represented by structures. For example, the <code>PROPERTYKEY</code> structure is represented conventionally in the Windows Runtime in its string form. You can use functions like <code>PSPropertyKeyFromString</code> and <code>PSStringFromPropertyKey</code> to convert between them.</p>
<p>The post <a href="https://devblogs.microsoft.com/oldnewthing/20260521-00/?p=112345">How do I use Win32 structures from the Windows Runtime?</a> appeared first on <a href="https://devblogs.microsoft.com/oldnewthing">The Old New Thing</a>.</p>
# How do I use Win32 structures from the Windows Runtime? - The Old New Thing
Source: [https://devblogs.microsoft.com/oldnewthing/20260521-00?p=112345](https://devblogs.microsoft.com/oldnewthing/20260521-00?p=112345)
May 21st, 2026
0 reactions

The Windows Runtime attempts to provide a language\-independent interface for Windows APIs: The ABI is consistent across the Windows Runtime, and the APIs themselves are described via metadata, allowing each language to map the Windows Runtime concepts into concepts that are more natural for each target language\. For example, the Windows Runtime`DateTime`maps to a corresponding date\-time type for each target language, like`std::chrono::time\_point`for C\+\+ or`Date`for JavaScript\. A cost of this goal is that the expressiveness of the Windows Runtime is constrained by the desire to make all the features available to all languages\. For example, there are no raw pointers in the Windows Runtime\.
Win32 structures defined in classic C/C\+\+ header files are not part of the Windows Runtime\. So in a literal sense, you can’t use them from the Windows Runtime\.
But you can fake it\.
You can declare a shadow structure in the Windows Runtime that has the same layout as the classic Win32 structure you want to use\. For example, you could declare your own Win32Point structure:
```
struct Win32Point
{
Int32 X;
Int32 Y;
};
```
Note that the Windows Runtime has its own conventions for some things that in Win32 are represented by structures\. For example, the`PROPERTYKEY`structure is represented conventionally in the Windows Runtime in its string form\. You can use functions like`PSPropertyKeyFromString`and`PSStringFromPropertyKey`to convert between them\.
### Category
### Topics
## Author

Raymond has been involved in the evolution of Windows for more than 30 years\. In 2003, he began a Web site known as The Old New Thing which has grown in popularity far beyond his wildest imagination, a development which still gives him the heebie\-jeebies\. The Web site spawned a book, coincidentally also titled The Old New Thing \(Addison Wesley 2007\)\. He occasionally appears on the Windows Dev Docs Twitter account to tell stories which convey no useful information\.
## Read next
## Stay informed
Get notified when new posts are published\.
Follow this blog
- [https://twitter.com/ChenCravat](https://twitter.com/ChenCravat)
- [](https://www.youtube.com/playlist?list=PLlrxD0HtieHge3_8Dm48C0Ns61I6bHThc)
- [https://github.com/oldnewthing](https://github.com/oldnewthing)
- [https://devblogs.microsoft.com/oldnewthing/feed/](https://devblogs.microsoft.com/oldnewthing/feed/)
This blog post discusses handling Windows Runtime delegates that implement the INoMarshal interface in C++/WinRT, providing an agile delegate wrapper that checks the calling context to avoid marshaling errors.
Raymond Chen discusses a historical Windows compatibility issue where some 16-bit programs abused window class extra bytes to store private data, and how Microsoft blocked the loophole for 32-bit and 64-bit programs while maintaining backward compatibility.
This article explains that Windows does not have a built-in concept of binary vs. text mode at the OS level; such distinctions are handled by runtime libraries like the C runtime. It clarifies that all files are treated as bytes by Windows and that content transformations must be done manually or via libraries.
The article traces the evolution of window and class extra bytes in Windows from 16-bit to 32-bit to 64-bit, detailing changes in function names and data sizes as handles and pointers expanded.
Raymond Chen explains why C++/WinRT does not allow multiple awaits on asynchronous operations like C#, JavaScript, and Python do, citing the lack of a standard library task type and the principle of not paying for unused functionality.