私はwinapi crateをいじっていますが、Windows API に安全性を追加することはないように思えます。単に型と署名を提供するだけのようで、ほとんど同じ安全でないパラダイムでプログラミングできますが、Rust を使用します。構文。
たとえば、Rust FFI でネイティブ型をさらに細分化して暗黙の有効期間情報をエンコードし、winapi プログラミングが実際により安全になるようにすることは可能ですか? winapi がポインターまたはハンドルに割り当てを行うときに、何らかの呼び出しで割り当てを解除/解放する必要がある場合Drop
、その値に対して正しい動作を適用できますか? Rust は十分に表現力がありますか?
もちろん、winapi 呼び出しを、呼び出し元と winapi の間でマップするより安全なオブジェクトで完全にラップすることもできますが、コピー/マッピング中にランタイム ヒットが発生し、面白くありません。
(おそらくそれは明らかですが、私はRust、WinApi、さらにはネイティブプログラミングも初めてです。)
通常、文字列データは Rust の UTF-8 に変換する必要があることを認識しています。しかし、Rustコードで必要でない限り、文字列がUTF-8に(透過的に)変換されないメモ化構造体でネイティブ文字列を自動的にラップすることが可能かどうか疑問に思います(vs単にWinApiに同じフォーマット)。
ハンドルとポインターは変換する必要はありませんが、適切な有効期間が必要なだけです。しかし、多くの種類のポインターと多くの種類のハンドルがあり、それらの型の違いは Rust で保持する必要があります。しかし、ライブラリ固有の free() をDrop
trait impl でエンコードするには、多くの順列があり、誰が割り当てたかを気にしない他の winapi 関数のオーバーロードが必要になると思います。右?