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

その4までの内容で作った後、いくつかテストをしてみた。すると問題がすぐに2点みつかった。

コマンド実行後の復帰時間が遅い

明らかに応答を待っているようなので、WaitForSingleObjectをコメントアウトした。それにともなって、tmpディレクトリ以下に作った一時ファイルの削除処理を外した。処理を待たないので、コマンド完了前にファイルを削除するとまずい。

// コマンド実行部
void exec_cmd(stArgument *pstarg)
{
  BOOL result;
  TCHAR CmdStr[UMAX_PATH];
  PROCESS_INFORMATION pinfo = {NULL};
  STARTUPINFO sinfo = {NULL};

  _stprintf_s(CmdStr, sizeof(TCHAR) * UMAX_PATH, 
  _T("\"C:\\Program Files\\TeraCopy\\TeraCopy.exe\" %s \"%s\" \"%s\" /OverwriteOlder"),
        pstarg->cmd, pstarg->src, pstarg->trg);

  GetStartupInfo(&sinfo);
  result = CreateProcess(NULL,
              CmdStr, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS,
              NULL, NULL, &sinfo, &pinfo);
  if (result == FALSE) { // 失敗
    usage();
  }
  CloseHandle(pinfo.hThread);
//WaitForSingleObject(pinfo.hProcess, INFINITE);
  CloseHandle(pinfo.hThread);
}

日本語ファイル名が化ける。

調べるとロケールの設定が明示的に必要だったらしい。システムの規定のロケールを設定することにした。

#include <locale.h>
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
  int argc;
  LPWSTR *argv = NULL;
  _tsetlocale(LC_ALL, _T("")); // from MSDN システムの既定