Documentação
Canal de comunicação oficial: #Windows-Dev na Comunidade Rust Discord
Esta caixa fornece ligações brutas de FFI a toda a API do Windows. Eles são reunidos à mão usando o Windows 10 SDK da Microsoft. Pretendo substituir todo o FFI do Windows existente em outras caixas por essa caixa através da técnica "abraçar, estender e extinguir".
Se essa caixa estiver faltando algo que você precisa, sinta -se à vontade para criar um problema, abrir uma solicitação de tração ou entre em contato comigo por outros meios.
Esta caixa depende da ferrugem 1.6 ou mais recente nas janelas. Em outras plataformas, essa caixa é um NO-OP e deve compilar com a Rust 1.2 ou mais recente.
Use std::mem::zeroed() para criar uma instância do sindicato e atribua o valor que deseja usar um dos métodos variantes.
Cada módulo é fechado em um sinalizador de recurso, portanto, você deve permitir que o recurso apropriado obtenha acesso a esses itens. Por exemplo, se você deseja usar algo do winapi::um::winuser , deve ativar o recurso winuser .
Você pode usar a funcionalidade de pesquisa na documentação para descobrir onde os itens são definidos.
Esta caixa nada mais é do que ligações brutas à API do Windows. Se você deseja saber como usar as várias funcionalidades na API do Windows, pode procurar os vários itens no MSDN, que estão cheios de documentação detalhada.
no_std ? Sim, absolutamente! Por padrão, o recurso std do winapi está desativado, permitindo que você escreva aplicativos do Windows usando nada além de core e winapi .
HANDLE de winapi é incompatível com HANDLE de std ? Como winapi não depende do std por padrão, ele deve definir o próprio c_void em vez de usar std::os::raw::c_void . No entanto, se você ativar o recurso std do winapi , ele reexportará c_void da std e fará com que HANDLE de winapi seja o mesmo tipo que HANDLE da std .
-sys como kernel32-sys ? Não. Essas caixas são um legado de como winapi 0.2 foi organizado. Começando com winapi 0.3 Todas as definições estão diretamente no próprio winapi e, portanto, não há mais necessidade de usar essas caixas -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 ( ) ;
} Você usa winapi em seus projetos? Nesse caso, você pode estar interessado em me apoiar financeiramente no Patreon. As empresas em particular são especialmente incentivadas a doar (estou olhando para você Microsoft).