MessageBoxAにs!で文字列を渡すと日本語が文字化けするので、encoding_rsでShiftJISへ変換する。さらに0終端にするためにto_vec()でvecへ変換し0をpushする。
なおencoding_rsを使うための設定をCargo.tomlに加筆する。
※ このやり方が正攻法なのかよくわからない。
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(()) }
[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"