windows-rs lets you call Windows APIs — past, present, and future — directly
from Rust. It is not a single crate but a family of them, from low-level API
access to high-level declarative UI. This page helps you find the right crate for
the job; each crate's own documentation then covers how to use it, with examples.
A family of crates
Most of these crates are small and focused — string types, error handling, the
registry, collections, and so on — and you depend only on what you actually use.
For broad, exploratory access to the entire Windows API surface, the
windows and windows-sys crates
project everything past, present, and future, gated behind per-namespace features.
For most projects, prefer the focused crates below, and generate a minimal,
project-specific binding with windows-bindgen for
any additional APIs you need.
Choosing your crates
Start with what you are trying to do and add the smallest crate that covers it.
Follow the link for usage and examples.
| If you need… | Use |
|---|
Windows error handling (HRESULT, Error, Result) | windows-result |
Windows string types and macros (HSTRING, PCWSTR, h!, w!, s!) | windows-strings |
COM/WinRT type support (IUnknown, the Interface trait, cast, GUID) | windows-core |
| To declare or implement a COM/WinRT interface | windows-core (#[interface] / #[implement]) |
Stock WinRT collections (IVector, IMap, …) | windows-collections |
WinRT values (IReference<T>, TimeSpan, DateTime) | windows-reference, windows-time |
| Graphics math (vectors, matrices) | windows-numerics |
| WinRT async bridged to Rust futures | windows-future |
| The Win32 thread pool | windows-threading |
| The Windows registry | windows-registry |
| To author a Windows service | windows-services |
| The OS version at runtime | windows-version |
To link C-style functions without import libs (link!, raw-dylib) | windows-link |
| To generate your own focused bindings | windows-bindgen |
| A declarative WinUI 3 UI, 2D graphics, a WebView, or a window | windows-reactor, windows-canvas, windows-webview, windows-window |
Crates
The full categorized index follows. Each crate has one page under
crates/ covering both usage and internals — how the crate is built and
maintained (the tool_bindings / tool_reactor / tool_package codegen pipeline,
generated files, and conventions). Each crate's own readme.md is the user-facing
introduction with a quick example, and the per-crate page links to it. Item-level
API reference is the generated rustdoc on docs.rs, linked from
every page.
Core & error handling
| Crate | Description |
|---|
| windows-core | Fundamental COM and Windows type support, including the #[interface] / #[implement] authoring macros. |
| windows-result | Windows error handling and propagation. |
| windows-strings | Windows string interop types and macros. |
The #[interface] and #[implement] macros are part of windows-core, split
into the windows-interface and
windows-implement crates only because Rust requires
procedural macros to live in a dedicated proc-macro crate.
Values & collections
Async & threading
System services
COM authoring macros & linking
These crates package functionality that is part of other crates but must ship
separately. windows-interface and windows-implement are part of
windows-core (see above); Rust requires their proc
macros to live in a dedicated proc-macro crate.
UI & graphics
Codegen & metadata tooling
Full Windows API projection
These crates project the entire Windows API surface. For new projects, prefer a focused binding generated with windows-bindgen, or compose the smaller crates above.
| Crate | Description |
|---|
| windows | Safer projection of C-style, COM, and WinRT APIs. |
| windows-sys | Zero-overhead raw bindings for C-style Windows APIs. |