空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

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なやり方があるとはね。