📗

RustでのWinAPI叩きの勘所

に公開

こんにちは。Povoです。
今回はrustでwinAPIを叩く方法について話します。
Windows-rs自体の特徴以外も書いていたりしますが目をつぶっていてください。
(rust初心者なので当たり前のことを威張り腐って説明してるかもしれないです)

使用するクレート

  • windows-rs
    winAPIを叩くためのMicrosoft公式が出しているクレートです。
    winAPIというクレートもあるらしいですが、直で触りすぎてコードが乱雑になりやすいのと、アップデートも最近減ってるらしいのでwindows-rsのほうがおすすめです。
    ↓GitHub
    https://github.com/microsoft/windows-rs

ドキュメント

https://microsoft.github.io/windows-docs-rs/doc/windows/

多分公式が出してるdocsです。
モジュール名などで検索をかけると引数や、型がわかります。(←Docsなんだから当たり前)
探すときはChatGPTにでも投げて当てをつけてから名前で検索したら早いので使ってみてください。

使い方

cargo.toml

クレート自体が巨大なので、機能ごとに読み込むそうです。

cargo.toml(例)
windows = { version = "0.61.3", features = [
    "Win32_Foundation",
    "Win32_UI_Input"
    ...
]}

書き方を例にするとこうです

cargo.toml
windows = { version = "バージョン", features = [
    "(useの :: を _ にする)",
    ...
]}

使うクレートはやりたいことをAIに読ませて選んでもらうのがおすすめです。

use

使いたいフォルダー内でuseをします。

main.rs内(例)
use windows::core::PCSTR;

そのモジュール内すべてを対象にするなら、

main.rs内(例)
use windows::Win32::System::LibraryLoader::*;

と、モジュールの最期にアスタリスクを入れてください。

モジュール内のものをいくつか一度に使うならば、

main.rs内(例)
use std::sync::mpsc::{Sender, Receiver, channel};

と、{}鍵括弧で囲んでください。

コード自体

ちょっと全部を把握できてるわけではないので書けないので、エラー時の勘所だけ。

0でエラーが出るならnull_mut()と書け

いろんなコードが0を書けと言ってきますが、コンパイラがエラーを吐くときはnull_mut()にしてみましょう。
null_mut()はC言語のnullptrに当たり、今はnullだけど変更できる値であるということを示すらしいです。windows-rsはwinAPI(内部は多分C言語だったはず)を叩くのでnullptrを渡すつもりで書きましょう。

とりあえず定数や引数が多い

クソ多いです。AIにコード書かせてバグが出てきたら、渡す予定の値と渡してる値の型を確認してみましょう。独自型も多い(多分)ので、合わなかったりしたら調べなおしてみてください。

おわりに

当たり前と思うことが多いと思いますが、目を通していただけたら幸いです。
裏でC言語が動いている(はずなの)でCを書いてるつもりだと思って書くとスムーズに書けると思います。

※情報の正確性は保証しておりません。私の独断と偏見であることをご承知ください。何かあればコメ欄で。

Discussion