LoginSignup
6
4

More than 5 years have passed since last update.

winapi-rsのあれこれ

Last updated at Posted at 2019-02-11

特に何もなければ、winapi-rsのバージョンは0.3.6を前提としています。

基本

 C++等ではWindows.hをインクルードするだけでWinUser.hなどが使えるようになりますが、winapi-rsでは使いたい関数や構造体などが書かれたヘッダの名前をfeaturesに書く必要があります1

以下の例は、WinUser.hの関数等をRustで使えるようにするものです。

Cargo.toml
[dependencies]
winapi = { version = "0.3.6", features = [
    "winuser",
] }

クレートの名前はwinapiです。

extern crate winapi;

モジュール

 winapi-rsのモジュールはWindows KitsのIncludeフォルダと同じようにsharedumで分けられています。いちいちフルパスで書くのは面倒なので例えばHWNDuseでモジュール名を省略したい場合は以下のようになります。

use winapi::shared::windef::HWND;

GetModuleHandle関数の例

 例えばGetModuleHandle関数はWinUser.hwingdi.hではなくlibloaderapi.hにあるので上記の指定だけでは使えません。以下の例のようにfeatureslibloaderapiを追加GetModuleHandle関数が使えるようになります。

Cargo.toml
[dependencies]
winapi = { version = "0.3.6", features = [
    "winuser",
    "wingdi",
    "libloaderapi",
] }

構造体にDefaultを

 winapi-rsのfeaturesimpl-defaultを指定すると、すべてのメンバが0で初期化された構造体を返すDefaultトレイトが使えるようになります。

Cargo.toml
[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が使えます。もちろん開発中のもので安定版ではないので注意してください。

Cargo.toml
[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


  1. windefのようにwinapi-rs/build.rsにないものは書く必要はないみたいです。 

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4