windows-rsのアップデート情報
windows-rsのアップデートで気になるところだけピックアップしてます。
最近のアップデートはリクエストあったときに公開されるようです。
-
windows
、windows-core
、windows-implement
、およびwindows-interface
に破壊的変更が入ったために0.51.0に。 -
windows
クレートがwindows-core
クレートに依存するように。
この変更によってs!
やw!
が、s!
を例にするとwindows::s!
からwindows::core::s!
になります。 - WDK APIの拡張セットが使えるようになった。
- `AsImpl::as_impl`が`unsafeになった
- Win32とWDKのメタデータのアップデート
このアップデートで、配列を要求している引数についてポインタになっていた部分が配列の参照を渡せるようになりました。例えばClearRenderTargetView
のvalues
が*const f32
から&[f32; 4]
のようになっています。
0.9.0
今まで
// 0.8.0まで
let surface: IDXGISurface = unsafe {
swapchain
.GetBuffer(0, &IDXGISurface::IID, surface.set_abi())
.and_some(surface)?
};
だったのが、以下のように書けるようになった。
// 0.9.0
let surface: IDXGISurface = unsafe { swapchain.GetBuffer(0)? };
つまり型とIID(あとset_abi()
)を指定しなければならなかったところが型だけでよくなった。
0.9.1
0.10.0
-
metadataのアップデート
win32metadataにおいて名前空間が大幅に変更されました。したがって、windows-rsでもwindows::build!
などで使われるモジュールの名前が変っています。
例えば、Windows::Win32::WindowsAndMessaging::*
やWindows::Win32::Intl::*
が
Windows::Win32::UI::WindowsAndMessaging::*
やWindows::Win32::Globalization::*
のようになります。 -
列挙型の改善
C++でWin32APIの列挙型のメンバを扱う場合と同じように書けるようになりました。
例えば、今までのD3D12_RESOURCE_BARRIER_TYPE::D3D12_RESOURCE_BARRIER_TYPE_TRANSITION
がD3D12_RESOURCE_BARRIER_TYPE_TRANSITION
だけでよくなりました。
0.11.0
-
metadataのアップデート
win32metadataで名前空間の整理が行われているのでwindows-rsでもwindows::build!
などで使われるモジュール名が追加されていたり変わっています。 - 列挙型の定数を
build!
に書かずに使えるようになった - XAMLの初期サポート
BSTR
が使いやすくなるように関数が追加された
0.13.0
リンク先にあるcom_uriの例の引用します。
0.13.0以前は以下のコードだったのが
let mut uri = None;
let uri = CreateUri("http://kennykerr.ca", Default::default(), 0, &mut uri).and_some(uri)?;
let mut domain = BSTR::default();
uri.GetDomain(&mut domain).ok()?;
let mut port = 0;
uri.GetPort(&mut port).ok()?;
0.13.0から以下のコードになります。
let uri = CreateUri("http://kennykerr.ca", Default::default(), 0)?;
let domain = uri.GetDomain()?;
let port = uri.GetPort()?;
0.14.0から0.17.1
0.18.0
0.21.0
- 元が
Guid*, void**
の引数でインターフェイスのポインタを返すような関数は今まで返り値で返していたが&mut Option<T>
に渡す形式に変更された -
他のクレートからwindowsクレートが使いやすくなった(
windows_reader::workspace_dir
とwindows_macros::generate
を直接windowsクレートから使えるようにした模様)
0.21.1
0.22
-
あらかじめパッケージ化されるようになった
いままで自動生成されていたものがwindows-rsのsrc/Windows
にあらかじめ定義されました。
この変更によりbuild.rsやbindingsクレートを作る必要がなくなり、以下のようにCargo.tomlのfeatures
に書けるようになりました。
[dependencies.windows]
version = "0.22.1"
features = [
"Data_Xml_Dom",
"Win32_Foundation",
"Win32_Security",
"Win32_System_Threading",
"Win32_UI_WindowsAndMessaging",
]
features
には依存するモジュールすべてを書く必要があります。
例えばCreateEventW
の場合Win32_System_Threading
に定義されていますが、以下のようにcfg
に依存しているfeature
が書かれておりWin32_Foundation
とWin32_Security
もfeatures
に書く必要があることがわかります。
#[cfg(all(feature = "Win32_Foundation", feature = "Win32_Security"))]
pub unsafe fn CreateEventW<
0.23
0.30.0
-
windows
クレートで再びハンドルの型が導入された
これは0.29.0でHANDLE
やHWND
のようなハンドルの型がisize
のエイリアスになっていたのですが、再びニュータイプパターンになって厳密になりました。WPARAM
やLPARAM
、LRESULT
なども同様のようです。
// 以下のように値を包まないといけない
LPARAM(0)
// ニュータイプパターンなので中の値にアクセスするには以下のようにする。
// 例えばlet lp = LPARAM(128);のような変数があるとき
lp.0
windows
クレートでDebug
が実装された-
ビットフラグの列挙体のビット演算が実装された
新しいジェネレータにはまだ実装されていませんでした。 - UWPターゲットのサポート
windows
クレートからstd
のfeatureが削除された
0.32.0
- 定数でパターンマッチできるようにスコープ付きの列挙体が
ParitalEq
とEq
を継承するようになった - 列挙体のコード生成の改善
- デリゲートが
Send
を要求するようになった Error
がWIN32_ERROR
をよりシンプルに扱えるようになったPWSTR
のような文字列ハンドルのフィールドが*const
になった- メタデータで
Const
属性になっているポインタは*const
になるようになった - メタデータが17.0.9にアップデート
AgileReference
が追加された-
トレイトベースの
implement
マクロが実装された
(implement
は現在unstableな機能を使っているのでnightly限定です。)
WinRTやCOMのインターフェイスをimplement
マクロと定義されたトレイトを使って実装できるようになりました。
以下のように書けるようになります。(windows-rsのissueのコメントから引用しています。)
use windows::core::*;
use windows::Foundation::*;
#[implement(IStringable, IClosable)]
struct Sample(pub i32);
impl IClosable_Impl for Sample {
fn Close(&self) -> Result<()> {
println!("Close {}", self.0);
Ok(())
}
}
impl IStringable_Impl for Sample {
fn ToString(&self) -> Result<HSTRING> {
println!("ToString {}", self.0);
Ok("hello".into())
}
}
fn main() -> Result<()> {
let c: IClosable = Sample(123).into();
c.Close()?;
let o: IInspectable = c.into();
assert!(o.GetRuntimeClassName()? == "Windows.Foundation.IClosable");
let s: IStringable = Sample(456).into();
assert!(s.ToString()? == "hello");
let o: IInspectable = s.into();
assert!(o.GetRuntimeClassName()? == "Windows.Foundation.IStringable");
Ok(())
}
0.34.0
-
配列を受け取る引数がRustの配列の借用になった
配列のポインタとサイズを受け取る引数を持つ関数でポインタとサイズがまとめられて1つの引数として&[T]
のようになりました。また、そこにis_empty()
がtrue
になるような空の配列を渡すとNULLポインタとして関数に渡されます。 HRESULT
やWIN32_ERROR
、NTSTATUS
のようなエラーコードの変換周りが簡潔になったHRESULT
とNTSTATUS
のDebug
におけるコードの表示が16進数になったHREUSLT
を返さないCOMインターフェイスの関数に対応した
0.35.0
DataProtection
サンプルが追加された- windows-rsのRustのエディションが2021になった
-
Rustの配列にする引数を要素数の共有をする引数がない場合に制限
IDXGISwapChain3::ResizeBuffers1
で引数のBufferCount
が隠れてしまう問題の修正されています(Issue)。 -
メタデータに基づくハンドルの有効性チェック
メタデータに無効なハンドルの情報が含まれるようになったため、CreateEventW
のような関数がハンドルをResult
に包んで返すようになりました。
0.37.0
このアップデートは多くの小さい改善や修正が加えられたもので、特にimplement
マクロやinterface
マクロの改善でWinRTやCOMをより安定して使えるようになったようです。
0.38.0
大きな変更はなく、多数の小さい改善や修正が加えられたようです。
- WinSockの変換ユーティリティ
- 技術的負債の返済
-
COMインターフェイスのポインタを取得するような関数で典型ではない引数の並びを持つ場合のサポート
(ここで典型とは最後尾でポインタのポインタを指定するような関数) windows::core::Error
からstd::io::Error
に変換する時にエラーコードが切り捨てられないように修正
0.39.0
alloc
の削除
alloc
featureが削除されました。これにより&str
などが自動的に変換されなくなりました。
例えば、引数がInto<PCWSTR>
になっている場合は代替として、
-
&HSTIRING::from
を使って渡す。 -
&str
等をencoding_utf16()
を使って終端文字を追加しつつ変換して、そのポインタをPCWSTR
で包んで渡す。
等が考えられます。
また、s!
マクロとw!
マクロが追加されており、文字列リテラルをそれぞれUTF-8、UTF-16で終端文字をつけてコンパイル時に変換してくれるらしいです。
文字列型の改善について
PCWSTR
等の文字列型に実装されていたDefault
が削除されました。代わりにNone
やそれぞれの文字列型に実装されているnull()
があります。
ピックアップ
0.40.0
windows-sys
からサポートしていないWinRTを削除してWin32のみに絞った- 32bit向けの
SetWindowLongPtrA
とGetWindowLongPtrA
を提供 -
配列の引数の扱いが
*const
から&T
になった
さらに可変のポインタは*mut
から&mut
になり、オプションの(例えばMicrosoft DocsでWin32の関数の引数が[in, optional]
のようになっている)引数はOption
でラップされるようになりました。 -
固定長の配列の引数をサポート
これもオプションの引数の場合はOption
でラップされます。あと、まだメタデータ側にバグがあるそうです。 - ターゲットに
aarch64-pc-windows-gnullvm
とx86_64-pc-windows-gnullvm
を追加 - msvc libの生成を修正
AgileReference
にDebug
を実装windows-sys
の最小のRustバージョンが1.49になった- 呼び出し規約のサポート
MAKEINTRESOURCE
スタイルの定数のワークアラウンドとテストを追加- Xaml名前空間の削除
BSTR
がwindows::core
入り-
IUnknown
の生ポインタをRust側のIUnknown
に変換するunsafe
なヘルパーが追加
Interface
トレイトにinto_raw
、from_raw
、from_raw_borrowed
が追加されました。 - メタデータが32.0.17にアップデート
0.41.0
このアップデートでは、0.40.0でAPIの引数がポインタから参照になったことで起きた問題を修正するものが多いです。
- 競合するメタデータを回避するためにwin32配列のサポートの強化
-
ポインタから参照にする変換を一部取り止め
0.40.0で入った#1939によって問題が生じたので参照からポインタに戻したようです。
ポインタから参照にする変換を一部取り止めの一例
例えば、ID3D12GraphicsCommandList::ClearRenderTargetView
にある引数colorrgba
は&f32
から*const f32
に戻りました。colorrgba
には配列のポインタを渡す必要があるので、&f32
では配列でないf32
の参照となりRustで扱う上で問題が出てしまいました。
0.44.0
3か月ぶりの更新
- getting started guideができた
- 多数のサンプルの追加
- メタデータの更新
D3DMATRIX
をMatrix4x4
にraw-dylib
のサポート- LLVM(MinGW)ツールチェインのアップデート
windows-sys
から主要なCOM APIを除外verbatim
のstable化- より簡潔にパラメータを生成するようになった
VARIANT_BOOL
に変換関数を追加- ポインタを使って
const
パラメータを変換 - スライス内の型が
Option
で包まれないようになった - Win32構造体の暗黙の所有権セマンティクスを削除
- より簡潔なコード生成
- unsafeな
PCWSTR
変換の削除 implement
にinterface
を組み合わせた- オプションのパラメータを避けながら戻り値をより正確に検出
- 失敗しない戻り値とより効率的な出力パラメータ
- 失敗できるアロケーションと文字列変換を追加
0.45.0
windows-sysのみのアップデートのようです。
- Linuxでのビルドをサポート
-
スライス内の型を
Option
で包まなくなった修正の取り止め
#2233で一部のDirectX APIで問題が起きたので元に戻したようです。