Documentation
Chaire de communication officielle: # Windows-DEV sur la Discord de la communauté Rust
Cette caisse fournit des liaisons FFI brutes à toutes les API de Windows. Ils sont rassemblés à la main à l'aide du SDK Windows 10 de Microsoft. Je vise à remplacer toutes les Windows FFI existantes dans d'autres caisses par cette caisse via la technique "Embrasser, étendre et éteindre".
Si cette caisse manque quelque chose dont vous avez besoin, n'hésitez pas à créer un problème, à ouvrir une demande de traction ou à me contacter par d'autres moyens.
Cette caisse dépend de la rouille 1.6 ou plus récente sur les fenêtres. Sur d'autres plates-formes, cette caisse est un no-opératoire et devrait compiler avec Rust 1.2 ou plus récent.
Utilisez std::mem::zeroed() pour créer une instance de l'Union, puis attribuez la valeur que vous souhaitez utiliser l'une des méthodes de variantes.
Chaque module est fermé sur un indicateur de fonctionnalité, vous devez donc activer la fonction appropriée pour accéder à ces éléments. Par exemple, si vous souhaitez utiliser quelque chose de winapi::um::winuser vous devez activer la fonction winuser .
Vous pouvez utiliser la fonctionnalité de recherche dans la documentation pour trouver où les éléments sont définis.
Cette caisse n'est rien de plus que des liaisons brutes à l'API Windows. Si vous souhaitez savoir comment utiliser les différentes fonctionnalités de l'API Windows, vous pouvez rechercher les différents éléments sur MSDN qui regorge de documents détaillés.
no_std ? Oui, absolument! Par défaut, la fonctionnalité std de winapi est désactivée, vous permettant d'écrire des applications Windows en utilisant rien d'autre que core et winapi .
HANDLE de winapi est-elle incompatible avec HANDLE de std ? Parce que winapi ne dépend pas par défaut std , il doit définir c_void lui-même au lieu d'utiliser std::os::raw::c_void . Cependant, si vous activez la fonction std de winapi , il réexportera c_void à partir de std et fera que HANDLE de winapi soit le même type que HANDLE de std .
-sys telles que kernel32-sys ? Non. Ces caisses sont un héritage de la façon dont winapi 0.2 a été organisé. En commençant par winapi 0.3, toutes les définitions sont directement dans winapi elle-même, et il n'y a donc plus besoin d'utiliser ces caisses -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 ( ) ;
} Utilisez-vous winapi dans vos projets? Si c'est le cas, vous pourriez être intéressé à me soutenir financièrement sur Patreon. Les entreprises en particulier sont particulièrement encouragées à faire un don (je vous regarde Microsoft).