Help us understand the problem. What is going on with this article?

winapi-rsのあれこれ

More than 1 year has passed since last update.

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

LNSEAB
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away