Documentación
Canal de comunicación oficial: #Windows-Dev en la comunidad de Rust Community
Esta caja proporciona enlaces FFI sin procesar a todas las API de Windows. Se recopilan a mano usando el SDK de Windows 10 de Microsoft. Mi objetivo es reemplazar todas las ventanas existentes FFI en otras cajas con esta caja a través de la técnica de "abrazar, extender y extinguir".
Si a esta caja le falta algo que necesita, no dude en crear un problema, abrir una solicitud de extracción o contactarme a través de otros medios.
Esta caja depende de Rust 1.6 o más nueva en las ventanas. En otras plataformas, esta caja es no-op y debe compilar con Rust 1.2 o más nuevo.
Use std::mem::zeroed() para crear una instancia de la unión y luego asigne el valor que desea usar uno de los métodos variantes.
Cada módulo está cerrado en un indicador de características, por lo que debe habilitar la función apropiada para obtener acceso a esos elementos. Por ejemplo, si desea usar algo de winapi::um::winuser debe habilitar la función winuser .
Puede usar la funcionalidad de búsqueda en la documentación para encontrar dónde se definen los elementos.
Esta caja no es más que ataduras en bruto a la API de Windows. Si desea saber cómo usar las diversas funcionalidades en la API de Windows, puede buscar los diversos elementos en MSDN que está lleno de documentación detallada.
no_std ? ¡Sí, absolutamente! Por defecto, la función std de winapi está deshabilitada, lo que le permite escribir aplicaciones de Windows usando nada más que core y winapi .
HANDLE de winapi con HANDLE de std ? Debido a que winapi no depende de std por defecto, tiene que definir c_void en lugar de usar std::os::raw::c_void . Sin embargo, si habilita la función std de winapi , reexportará c_void desde std y hará que HANDLE de winapi sea del mismo tipo que HANDLE de std .
-sys como kernel32-sys ? No. Esas cajas son un legado de cómo se organizó winapi 0.2. Comenzando con winapi 0.3 Todas las definiciones están directamente en winapi , por lo que ya no hay necesidad de usar esas cajas -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 ( ) ;
} ¿Usas winapi en tus proyectos? Si es así, puede estar interesado en apoyarme financieramente en Patreon. Se recomienda especialmente a las empresas en particular a donar (te estoy mirando Microsoft).