Dokumentation
Offizieller Kommunikationskanal: #Windows-Dev über die Zwietracht der Rust-Community
Diese Kiste bietet rohe FFI -Bindungen an die gesamte Windows -API. Sie werden mit dem Windows 10 SDK von Microsoft von Hand gesammelt. Ich möchte alle vorhandenen Windows -FFI in anderen Kisten durch diese Kiste durch die Technik "Umarmung, Erweiterung und Löschen" ersetzen.
Wenn in dieser Kiste etwas fehlt, das Sie benötigen, können Sie ein Problem erstellen, eine Pull -Anfrage öffnen oder mich über andere Mittel kontaktieren.
Diese Kiste hängt von Rost 1.6 oder neuer unter Windows ab. Auf anderen Plattformen ist diese Kiste ein No-op und sollte mit Rost 1.2 oder neuer kompilieren.
Verwenden Sie std::mem::zeroed() um eine Instanz der Vereinigung zu erstellen, und weisen Sie dann den Wert zu, den Sie mit einer der Variantenmethoden möchten.
Jedes Modul wird auf einem Feature -Flag geschaltet, sodass Sie die entsprechende Funktion aktivieren müssen, um Zugriff auf diese Elemente zu erhalten. Wenn Sie beispielsweise etwas von winapi::um::winuser verwenden möchten, müssen Sie die winuser -Funktion aktivieren.
Sie können die Suchfunktionen in der Dokumentation verwenden, um zu finden, wo Elemente definiert sind.
Diese Kiste ist nichts anderes als Rohbindungen an Windows -API. Wenn Sie wissen möchten, wie Sie die verschiedenen Funktionen in der Windows -API verwenden, können Sie die verschiedenen Elemente auf MSDN nachschlagen, die voller detaillierter Dokumentation sind.
no_std -Projekten verwenden? Ja, absolut! Standardmäßig ist die std -Funktion von winapi deaktiviert, sodass Sie Windows -Anwendungen mit nichts als core und winapi schreiben können.
winapi HANDLE mit HANDLE von std inkompatibel? Da winapi standardmäßig nicht von std abhängt, muss es c_void selbst definieren, anstatt std::os::raw::c_void zu verwenden. Wenn Sie jedoch die std Funktion von winapi aktivieren, wird c_void von std erneut exportiert und HANDLE von winapi den gleichen Typ wie std HANDLE entspricht.
-sys wie kernel32-sys noch verwenden? Nein. Diese Kisten sind ein Erbe, wie winapi 0,2 organisiert wurde. Beginnend mit winapi 0.3 sind alle Definitionen direkt in winapi selbst enthalten, sodass diese -sys nicht mehr verwendet werden müssen.
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 ( ) ;
} Verwenden Sie winapi in Ihren Projekten? In diesem Fall interessieren Sie mich möglicherweise, mich auf Patreon finanziell zu unterstützen. Insbesondere Unternehmen werden besonders ermutigt, zu spenden (ich sehe Sie an Microsoft an).