#winapi #com #directx #windows #ffi

sys no-std winapi_forked_icmpapi

Windows API 所有原始 FFI 绑定

1 个不稳定版本

使用旧的 Rust 2015

0.3.7 2019年12月14日

#142Windows API

Download history 232/week @ 2024-03-13 222/week @ 2024-03-20 118/week @ 2024-03-27 175/week @ 2024-04-03 228/week @ 2024-04-10 186/week @ 2024-04-17 159/week @ 2024-04-24 166/week @ 2024-05-01 242/week @ 2024-05-08 204/week @ 2024-05-15 119/week @ 2024-05-22 245/week @ 2024-05-29 174/week @ 2024-06-05 191/week @ 2024-06-12 166/week @ 2024-06-19 127/week @ 2024-06-26

671 每月下载次数
5 个 crate 中使用 (通过 winping)

MIT/Apache

6.5MB
169K SLoC

winapi-rs

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

文档

官方 IRC 频道:Mozilla IRC 上的 #winapi

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

如果此 crate 缺少您需要的功能,请随时创建问题、发起拉取请求或通过 其他方式 联系我。

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

常见问题解答

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

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

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

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

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

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

为什么没有使用说明的文档?

这个包仅仅是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包,如kernel32-sys

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

示例

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

依赖项