선적 서류 비치
공식 커뮤니케이션 채널 : Rust Community Discord의 #Windows-Dev
이 상자는 모든 Windows API에 원시 FFI 바인딩을 제공합니다. 그들은 Microsoft의 Windows 10 SDK를 사용하여 손으로 수집합니다. 나는 기존의 모든 Windows FFI를 다른 상자의 모든 Windows FFI를 "포용, 확장 및 소멸"기술을 통해이 상자로 교체하는 것을 목표로합니다.
이 상자가 필요한 것을 놓치면 문제를 만들거나 풀 요청을 열거나 다른 수단을 통해 저에게 연락하십시오.
이 상자는 Rust 1.6 또는 Windows의 최신에 달려 있습니다. 다른 플랫폼 에서이 상자는 No-OP이며 Rust 1.2 또는 새롭게 컴파일해야합니다.
std::mem::zeroed() 사용하여 Union의 인스턴스를 작성한 다음 변형 메소드 중 하나를 사용하여 원하는 값을 할당하십시오.
각 모듈은 기능 플래그에 게이트되므로 해당 항목에 액세스 할 수있는 적절한 기능을 활성화해야합니다. 예를 들어 winapi::um::winuser 에서 무언가를 사용하려면 winuser 기능을 활성화해야합니다.
문서에서 검색 기능을 사용하여 항목이 정의되는 위치를 찾을 수 있습니다.
이 상자는 Windows API에 대한 원시 바인딩에 지나지 않습니다. Windows API에서 다양한 기능을 사용하는 방법을 알고 싶다면 자세한 문서로 가득 찬 MSDN의 다양한 항목을 찾을 수 있습니다.
no_std 프로젝트 에서이 라이브러리를 사용할 수 있습니까? 예, 물론! 기본적으로 winapi 의 std 기능이 비활성화되어 core 및 winapi 외에는 Windows 응용 프로그램을 작성할 수 있습니다.
winapi 의 HANDLE std 의 HANDLE 와 호환되지 않는 이유는 무엇입니까? winapi 기본적으로 std 에 의존하지 않기 때문에 std::os::raw::c_void 사용하는 대신 c_void 자체를 정의해야합니다. 그러나 winapi 의 std 기능을 활성화하면 std 에서 c_void 다시 기대하고 winapi 의 HANDLE std 의 HANDLE 와 동일한 유형이됩니다.
kernel32-sys 와 같은 -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를보고 있습니다).