スポンサーリンク

| キーワード:

RustでWinMainのようなものを作る

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;

}
>\debug>rs_win.exe "hello world"
hInstance : 140697499664384
hPrevInstance : 0
lpCmdLine : ["rs_win.exe", "hello world"]
nCmdShow : 1

コメントを残す

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

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


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