特に何もなければ、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にないものは書く必要はないみたいです。 ↩