#api-bindings #winapi #com #directx #ffi #windows

sys no-std winapi

对Windows API的所有原始FFI绑定

51次发布

使用旧的Rust 2015

0.3.9 2020年6月26日
0.3.8 2019年8月28日
0.3.7 2019年4月3日
0.3.6 2018年9月21日
0.0.1 2014年11月29日

#10Windows API

Download history 1143711/week @ 2024-04-03 1113160/week @ 2024-04-10 1204065/week @ 2024-04-17 1065065/week @ 2024-04-24 1188860/week @ 2024-05-01 1165767/week @ 2024-05-08 1222724/week @ 2024-05-15 1192300/week @ 2024-05-22 1168142/week @ 2024-05-29 1168611/week @ 2024-06-05 1345470/week @ 2024-06-12 1197400/week @ 2024-06-19 1187277/week @ 2024-06-26 1098605/week @ 2024-07-03 1236579/week @ 2024-07-10 1077029/week @ 2024-07-17

4,833,801 每月下载量
43,003 个crate中使用 (1,319 个直接使用)

MIT/Apache

7MB
177K SLoC

winapi-rs

Build status Build status Build Status Gitter Crates.io Lines of Code 100% unsafe Open issues License

文档

官方沟通渠道:在 Rust社区Discord 上的 #windows-dev

此crate提供对所有Windows API的原始FFI绑定。它们是通过Microsoft的Windows 10 SDK手工收集的。我的目标是通过 "拥抱、扩展和淘汰" 技术用这个crate替换其他crate中现有的所有Windows FFI。

如果这个crate缺少您需要的东西,请随时创建一个问题、打开一个pull request,或通过 其他方式 联系我。

此crate依赖于Windows上的Rust 1.6或更高版本。在其他平台上,此crate是一个空操作,应该使用Rust 1.2或更高版本编译。

常见问题

如何创建联合体实例?

使用 std::mem::zeroed() 创建联合体实例,然后使用其中一种变体方法分配您想要的值。

为什么我收到关于未解析导入的错误?

每个模块都受一个功能标志的控制,因此您必须启用相应的功能才能访问这些项。例如,如果您想使用 winapi::um::winuser 中的内容,您必须启用 winuser 功能。

如何知道某个项是在哪个模块中定义的?

您可以使用 文档 中的搜索功能来查找项的定义位置。

为什么没有关于如何使用任何内容的文档呢?

这个crate只是Windows API的原始绑定。如果您想了解如何使用Windows API中的各种功能,您可以在MSDN上查找各种项目,那里充满了详细的文档。

我能在no_std项目中使用这个库吗?

当然可以!默认情况下,winapistd特性是禁用的,这允许您仅使用corewinapi编写Windows应用程序。

为什么winapiHANDLEstdHANDLE不兼容?

因为winapi默认不依赖于std,它必须自己定义c_void,而不是使用std::os::raw::c_void。但是,如果您启用winapistd特性,它将从std重新导出c_void,从而使winapiHANDLEstdHANDLE相同类型。

我还需要使用那些-syscrate,例如kernel32-sys吗?

不需要。这些crate是winapi 0.2如何组织的遗留问题。从winapi 0.3开始,所有定义都直接在winapi中,因此不再需要使用那些-syscrate。

示例

Cargo.toml

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winuser"] }

main.rs

#[cfg(windows)] extern crate winapi;
use std::io::Error;

#[cfg(windows)]
fn print_message(msg: &str) -> Result<i32, Error> {
    use std::ffi::OsStr;
    use std::iter::once;
    use std::os::windows::ffi::OsStrExt;
    use std::ptr::null_mut;
    use winapi::um::winuser::{MB_OK, MessageBoxW};
    let wide: Vec<u16> = OsStr::new(msg).encode_wide().chain(once(0)).collect();
    let ret = unsafe {
        MessageBoxW(null_mut(), wide.as_ptr(), wide.as_ptr(), MB_OK)
    };
    if ret == 0 { Err(Error::last_os_error()) }
    else { Ok(ret) }
}
#[cfg(not(windows))]
fn print_message(msg: &str) -> Result<(), Error> {
    println!("{}", msg);
    Ok(())
}
fn main() {
    print_message("Hello, world!").unwrap();
}

财务支持

您是否在项目中使用了winapi?如果是,您可能对在Patreon上为我提供财务支持感兴趣。特别是鼓励公司捐赠(我在看Microsoft)。

依赖项