RustでWin32APIを書くときはWinMainがエントリポイントにならないので、mainから始める。
各種関数を駆使すればWinMainの引数と同等のものを得ることができるが、コマンドライン引数だけはスペースで区切られた配列で得る方法しか見つからなかった。
use windows::Win32::System::LibraryLoader::GetModuleHandleA; use std::env; use windows::Win32::System::Threading::{GetStartupInfoW, STARTUPINFOW}; // Rustのwindows-rsからウィンドウズアプリケーションをビルドする時には、 // WinWain ではなくmainをエントリポイントとする。
fn main()-> windows::core::Result<()> { let hInstance:windows::Win32::Foundation::HINSTANCE; unsafe{ // https://github.com/microsoft/windows-samples-rs/blob/master/create_window/src/main.rs hInstance = windows::Win32::System::LibraryLoader::GetModuleHandleA(None).unwrap(); } // https://doc.rust-jp.rs/book-ja/ch12-01-accepting-command-line-arguments.html let args: Vec<String> = env::args().collect(); // https://stackoverflow.com/questions/68322072/how-to-get-args-from-winmain-or-wwinmain-in-rust let mut si = windows::Win32::System::Threading::STARTUPINFOW { cb: std::mem::size_of::<windows::Win32::System::Threading::STARTUPINFOW>() as u32, ..Default::default() }; unsafe { windows::Win32::System::Threading::GetStartupInfoW(&mut si) }; let cmd_show = si.wShowWindow as i32; //////////////////////////////////////////////////////////////////////////////////// // 自作WinMainを呼び出す WinMain( hInstance, windows::Win32::Foundation::HINSTANCE(0), args, cmd_show ); Ok(()) }
/// やっぱり WinMain から起動したほうが読みやすい人のために /// 自作 WinMain を作成 fn WinMain( hInstance : windows::Win32::Foundation::HINSTANCE, hPrevInstance : windows::Win32::Foundation::HINSTANCE, lpCmdLine:Vec<String>, nCmdShow:i32 )->i32{ println!("hInstance : {}",hInstance.0); println!("hPrevInstance : {}", hPrevInstance.0); println!("lpCmdLine : {:?}", lpCmdLine); println!("nCmdShow : {}", nCmdShow); return 0; }