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

sys no-std winapi-ui-automation

所有 Windows API 的原始 FFI 绑定。直到 UI Automation 定义合并前的临时包

2 个版本

使用旧 Rust 2015

0.3.10 2020 年 12 月 28 日
0.3.9 2020 年 12 月 23 日

#105 in Windows APIs

MIT/Apache

7MB
182K SLoC

winapi-rs

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

文档

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

该包提供了所有 Windows API 的原始 FFI 绑定。它们是通过手动使用微软的 Windows 10 SDK 收集的。我旨在通过 "拥抱、扩展和淘汰" 技术用此包替换其他包中所有现有的 Windows FFI。

如果这个包缺少您需要的某些功能,请随时创建问题、提交拉取请求或通过 其他方式 联系我。

该包在 Windows 上依赖于 Rust 1.6 或更高版本。在其他平台上,此包为无操作,应与 Rust 1.2 或更高版本兼容。

常见问题解答

如何创建一个联合体的实例?

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

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

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

如何知道一个项目定义在哪个模块中?

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

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

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

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

是的,绝对可以!默认情况下,winapistd特性是禁用的,这使得您可以使用corewinapi来编写Windows应用程序。

为什么winapiHANDLEstdHANDLE不兼容?

因为默认情况下winapi不依赖于std,所以它必须自己定义c_void,而不是使用std::os::raw::c_void。但是,如果您启用了winapistd特性,那么它将重新导出从std导出的c_void,导致winapiHANDLEstdHANDLE具有相同的类型。

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

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

示例

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)。

依赖关系