Документация
Официальный канал связи: #Windows-Dev на Rust Community Discord
Этот ящик обеспечивает необработанные привязки FFI для всех API Windows. Они собираются вручную, используя SDK Windows 10 от Microsoft. Я стремлюсь заменить все существующие Windows FFI в других ящиках этим ящиком с помощью техники «Объединить, расширить и погасить».
Если в этом ящике не хватает чего -то, что вам нужно, не стесняйтесь создавать проблему, откройте запрос на тягу или свяжитесь со мной с помощью других средств.
Этот ящик зависит от ржавчины 1.6 или более новой в Windows. На других платформах этот ящик является неоперативным и должен компилировать с Rust 1.2 или более новым.
Используйте std::mem::zeroed() чтобы создать экземпляр объединения, а затем присвоить значение, которое вы хотите, используя один из вариантов.
Каждый модуль находится на флаге функций, поэтому вы должны включить соответствующую функцию, чтобы получить доступ к этим элементам. Например, если вы хотите использовать что -то от winapi::um::winuser вы должны включить функцию winuser .
Вы можете использовать функциональность поиска в документации, чтобы найти, где определены элементы.
Этот ящик - не что иное, как необработанные привязки с Windows API. Если вы хотите узнать, как использовать различные функции в Windows API, вы можете найти различные элементы на MSDN, которая полна подробной документации.
no_std ? Да, абсолютно! По умолчанию функция std winapi отключена, что позволяет вам писать приложения Windows, используя только core и winapi .
HANDLE winapi несовместима с HANDLE std ? Поскольку winapi не зависит от std по умолчанию, он должен определять сам c_void вместо использования std::os::raw::c_void . Однако, если вы включите функцию std winapi , он будет реэкспортировать c_void из std и привести к тому, что HANDLE winapi будет таким же типом, что и HANDLE std .
-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).