ドキュメント
公式コミュニケーションチャネル:#Rustコミュニティの不一致に関するWindows-Dev
このクレートは、すべてのWindows APIに生のFFIバインディングを提供します。それらは、MicrosoftのWindows 10 SDKを使用して手作業で集められています。私は、他の箱のすべての既存のWindows FFIを、「抱きしめ、拡張し、消滅させる」テクニックを介してこの木枠に置き換えることを目指しています。
このクレートに必要なものが欠けている場合は、問題を作成したり、プルリクエストを開いたり、他の手段で私に連絡してください。
この木枠は、windowsの錆1.6以下に依存します。他のプラットフォームでは、この木枠はopであり、Rust 1.2以降でコンパイルする必要があります。
std::mem::zeroed()を使用して、組合のインスタンスを作成し、バリアントメソッドのいずれかを使用して必要な値を割り当てます。
各モジュールは機能フラグでゲートされているため、適切な機能を有効にしてそれらのアイテムにアクセスする必要があります。たとえば、 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を使用していますか?もしそうなら、あなたはパトレオンで私を財政的にサポートすることに興味があるかもしれません。特に企業は特に寄付することをお勧めします(私はあなたをMicrosoftを見ています)。