GUIアプリケーションをCLIアプリとしても使えるようにする
Win32 APIの話題というだけで、かなり今更感があるのだけれども、臆せずにメモっておく。
やりたいことは、
- Windowベースのアプリケーションがあるんだけど、たまにコマンドラインアプリとしても利用したい(バッチ処理など)
- しかもコマンドラインアプリとして起動した場合には、窓を出さずにコンソールにprintfとかしたい
やるべきことは以下の通り
- wWinMainのpCmdLineに対してCommandLineToArgvWを呼び出し、tokenizeされた引数をパースする
- オプションに応じて、GUIモードか、Command Lineモードか判定する
- GUIモードのときは既存のパスに行く
- Command Lineモードのときは、AttachConsoleで親プロセスのコンソールをアタッチして、CRTのstdout、stderrをコンソールに関連付ける。← ここがみそ。
こんなかんじ
if (bCommandLineMode) { //Command Lineモード ::AttachConsole(ATTACH_PARENT_PROCESS); freopen("CON", "w", stdout); freopen("CON", "w", stderr); // : //淡々と処理 // : } else { //GUIモード // : //窓を出してインタラクティブに処理 // : }
CONなやり方があるとはね。