1 个不稳定版本
使用旧的 Rust 2015
0.3.7 | 2019年12月14日 |
---|
#142 在 Windows API
671 每月下载次数
在 5 个 crate 中使用 (通过 winping)
6.5MB
169K SLoC
winapi-rs
官方 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
项目中使用这个库吗?
当然可以!默认情况下,winapi
的std
功能是禁用的,这样您就可以仅使用core
和winapi
来编写Windows应用程序。
为什么winapi
的HANDLE
与std
的HANDLE
不兼容?
因为winapi
默认不依赖于std
,它必须自己定义c_void
而不是使用std::os::raw::c_void
。但是,如果您启用winapi
的std
功能,则它将从std
重新导出c_void
,从而使winapi
的HANDLE
与std
的HANDLE
相同类型。
我是否还需要使用那些-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)。