スポンサーリンク

Rust + windows-rs でMessageBoxAを呼び出す

MessageBoxAにs!で文字列を渡すと日本語が文字化けするので、encoding_rsでShiftJISへ変換する。さらに0終端にするためにto_vec()でvecへ変換し0をpushする。

なおencoding_rsを使うための設定をCargo.tomlに加筆する。

※ このやり方が正攻法なのかよくわからない。

main.rs

use windows::Win32::UI::WindowsAndMessaging::{MessageBoxA, MB_OK};
use encoding_rs::*;


fn main( )->windows::core::Result<()>{

  // windows::core::s! マクロ ... 文字列(utf8)をLPCSTR へ変換。
  // MessageBoxWを使う場合はLPCWSTR へ変換するw!を使用。

  unsafe {

    // windows::core::s!() にそのまま日本語を与えると文字化けする。
    // Rustはu8が基本。 MessageBoxA はnull終端のマルチバイト(ShiftJIS)なので、変換が必要
    let msg = SHIFT_JIS.encode("ハローワールド");
    let ttl = SHIFT_JIS.encode("タイトル");

    let mut msg0 = msg.0.to_vec();
    let mut ttl0 = ttl.0.to_vec();

    // null 終端にする
    msg0.push(0);
    ttl0.push(0);

    let smsg0 = windows::core::PCSTR(msg0.as_ptr());
    let sttl0 = windows::core::PCSTR(ttl0.as_ptr());
    MessageBoxA(
      None,
      smsg0, 
      sttl0,
       MB_OK
    );
  }

  Ok(())

}

Cargo.toml

[package]
name = "myproject"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies.windows]

version = "0.44.0"
# 最新版のバージョンは https://github.com/microsoft/windows-rs で確認
# ・バージョンによってfeaturesを変えなければいけないかもしれない
# ・バージョンによって何が使えるか(どこにあるか?)が変わる
#  例えば windows::Win32::Foundation::HINSTANCE やs!は0.32.0にはない
features = [
    "Win32_Foundation",
    "Win32_UI_WindowsAndMessaging",
]

[dependencies.encoding_rs]
version="0.8.31"

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: