Open40

windows-rsのアップデート情報

ピン留めされたアイテム
LNSEABLNSEAB

最近のアップデートはリクエストあったときに公開されるようです。

  • windowswindows-corewindows-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のメタデータのアップデート

このアップデートで、配列を要求している引数についてポインタになっていた部分が配列の参照を渡せるようになりました。例えばClearRenderTargetViewvalues*const f32から&[f32; 4]のようになっています。

LNSEABLNSEAB

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

LNSEABLNSEAB

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_TRANSITIOND3D12_RESOURCE_BARRIER_TYPE_TRANSITIONだけでよくなりました。

  • 弱参照の実装

  • HSTRINGSendSync

  • HStringHSTRINGObjectIInspectableになった。

LNSEABLNSEAB

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()?;
LNSEABLNSEAB

0.19.0

・COMインターフェイスの実装のサポート
・実装向けに多くの改善
・バイナリパッキングの削除

LNSEABLNSEAB

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_FoundationWin32_Securityfeaturesに書く必要があることがわかります。

#[cfg(all(feature = "Win32_Foundation", feature = "Win32_Security"))]
pub unsafe fn CreateEventW<
LNSEABLNSEAB

0.30.0

  • windowsクレートで再びハンドルの型が導入された
    これは0.29.0でHANDLEHWNDのようなハンドルの型がisizeのエイリアスになっていたのですが、再びニュータイプパターンになって厳密になりました。WPARAMLPARAMLRESULTなども同様のようです。
// 以下のように値を包まないといけない
LPARAM(0)

// ニュータイプパターンなので中の値にアクセスするには以下のようにする。
// 例えばlet lp = LPARAM(128);のような変数があるとき
lp.0
LNSEABLNSEAB

0.32.0

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(())
}
LNSEABLNSEAB

0.34.0

LNSEABLNSEAB

0.35.0

LNSEABLNSEAB

0.37.0

このアップデートは多くの小さい改善や修正が加えられたもので、特にimplementマクロやinterfaceマクロの改善でWinRTやCOMをより安定して使えるようになったようです。

LNSEABLNSEAB

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()があります。

ピックアップ

LNSEABLNSEAB

0.41.0

このアップデートでは、0.40.0でAPIの引数がポインタから参照になったことで起きた問題を修正するものが多いです。

ポインタから参照にする変換を一部取り止めの一例

例えば、ID3D12GraphicsCommandList::ClearRenderTargetViewにある引数colorrgba&f32から*const f32に戻りました。colorrgbaには配列のポインタを渡す必要があるので、&f32では配列でないf32の参照となりRustで扱う上で問題が出てしまいました。

LNSEABLNSEAB

0.49.0

windows-bindgenクレートとwindows-metadataクレートの更新です。
それ以外のクレートは更新がないようです。

LNSEABLNSEAB

0.50.0

新しくwindows-coreクレートができました。
これはwindowsクレートのcoreモジュールだけ抜き出したクレートです。

今回のアップデートはwindows-coreクレートの追加のみで他のクレートのアップデートはありません。(更新内容は他のクレートの内容のようですがないらしいです)