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日 |
#10 在 Windows API 中
4,833,801 每月下载量
在 43,003 个crate中使用 (1,319 个直接使用)
7MB
177K SLoC
winapi-rs
官方沟通渠道:在 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
项目中使用这个库吗?
当然可以!默认情况下,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
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)。