TeraCopyをコマンドラインから呼び出す(その4)

コマンドプロンプトが必ず表示されてしまうことの対策から始めた。
プロジェクトのプロパティから、構成プロパティ→リンカ→システム→サブシステムをコンソールからWindowsに変更する。これだけでコンパイルリンクすると、リンクでWinMainが無いとエラーになる。
で、_tmain()をWinMain()に変えて変数を適当に宣言してやるとコンパイルも通り、実行してみるとコマンドプロンプトも表示されないのでこれでよさそう。
次にWinMainで引数を取ることができないのかと調べてみたら、GetCommandLineW()とCommandLineToArgvW()で実現できるようだ。修正が面倒だったので、変数名をtmainに合わせた。

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
  int argc;
  LPWSTR *argv = NULL;

  argv = CommandLineToArgvW(GetCommandLineW(), &argc);

  if (argc < 4 || argv == NULL) {
     usage(); // エラーメッセージ
  }
        
  if (_tcsicmp(_T("copy"), argv[ARGC_CMD]) == 0 ||
      _tcsicmp(_T("move"), argv[ARGC_CMD]) == 0) {
     // COPY | MOVE
     teracopy(argc, argv);
  } else {
     usage(); // エラー
  }
  LocalFree(argv);
  return 0;
}

あとは、エラーメーセージをMessageBoxで表示するようにした。個人的には趣味じゃないけど、usage()ぐらいは表示したいので。

void usage(void)
{
  MessageBox(NULL, _T("teracopy_wrap.exe (COPY|MOVE) source target"), NULL, MB_OK);
  exit(-1);
}