特に何もなければ、winapi-rsのバージョンは0.3.6
を前提としています。
基本
C++等ではWindows.h
をインクルードするだけでWinUser.h
などが使えるようになりますが、winapi-rsでは使いたい関数や構造体などが書かれたヘッダの名前をfeatures
に書く必要があります1。
以下の例は、WinUser.h
の関数等をRustで使えるようにするものです。
[dependencies]
winapi = { version = "0.3.6", features = [
"winuser",
] }
クレートの名前はwinapi
です。
extern crate winapi;
モジュール
winapi-rsのモジュールはWindows KitsのIncludeフォルダと同じようにshared
やum
で分けられています。いちいちフルパスで書くのは面倒なので例えばHWND
をuse
でモジュール名を省略したい場合は以下のようになります。
use winapi::shared::windef::HWND;
GetModuleHandle関数の例
例えばGetModuleHandle
関数はWinUser.h
やwingdi.h
ではなくlibloaderapi.h
にあるので上記の指定だけでは使えません。以下の例のようにfeatures
にlibloaderapi
を追加GetModuleHandle
関数が使えるようになります。
[dependencies]
winapi = { version = "0.3.6", features = [
"winuser",
"wingdi",
"libloaderapi",
] }
構造体にDefaultを
winapi-rsのfeatures
にimpl-default
を指定すると、すべてのメンバが0で初期化された構造体を返すDefault
トレイトが使えるようになります。
例
[dependencies]
winapi = { version = "0.3.6", features = [
"impl-default",
] }
use winapi::winuser::MSG;
// msgはすべて0で初期化されています
let mut msg = MSG::default();
ジェネリックなCOMインターフェイス
winapi-rsにはwinapi::Interface
トレイトがあり、winapi-rsにあるCOMインターフェイスはこのトレイトを実装しています。トレイト境界をwinapi::Interface
トレイトにすればジェネリックにCOMインターフェイスを扱うことができます。
例
以下の例は、CreateDXGIFactory1
関数をジェネリクスでIDXGIFactory1
だけでなくIDXGIFactory2
等を指定できるようにしています。
use winapi::shared::dxgi::*;
use winapi::Interface;
fn create_dxgi_factory<T: Interface>() -> Result<*mut T, HRESULT> {
let mut obj = null_mut();
let res = unsafe { CreateDXGIFactory1(&T::uuidof(), &mut obj) };
if res < 0 {
Err(res)
} else {
Ok(obj)
}
}
use winapi::shared::dxgi1_2::*;
let dxgi_factory = create_dxgi_factory::<IDXGIFactory2>();
crates.ioの代わりにGitHubのリポジトリに
以下の例のようにgit
キーでwinapi-rsのリポジトリとブランチを指定すると、最新コミットのwinapi-rsが使えます。もちろん開発中のもので安定版ではないので注意してください。
例
[dependencies]
winapi = { git = "https://github.com/retep998/winapi-rs", branch = "0.3", features = [
"winuser",
"wingdi",
] }
リンク
https://github.com/retep998/winapi-rs
https://crates.io/crates/winapi
-
windef
のようにwinapi-rs/build.rs
にないものは書く必要はないみたいです。 ↩