私の目標は、コンソールウィンドウを表示せずにコマンドラインバッチスクリプト(.bat
ファイルから)を実行し、実行が完了するのを待ってから続行します。私はexample from hereを使用しています。だから私は、次のコードを思い付いた:GUIアプリケーションからCreateProcessで.batスクリプトを実行すると、 "ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません。"エラー
//NOTE: Error checks are omitted for brevity
//Get path to cmd.exe
WCHAR buffCmd[1024];
::GetEnvironmentVariable(L"ComSpec", buffCmd, 1024);
std::wstring runPath = buffCmd;
runPath = runPath + L" /C \"path-to\\test.bat\"";
LPWCH pEnvStrs = ::GetEnvironmentStrings();
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);
::CreateProcess(NULL, &runPath[0], NULL, NULL, FALSE,
/*CREATE_NO_WINDOW | */ //Will uncomment it when I make it work
CREATE_UNICODE_ENVIRONMENT,
pEnvStrs, NULL, &si, &pi);
HANDLE hProc = pi.hProcess;
::WaitForSingleObject(hProc, INFINITE);
DWORD dwProcExitCode = 0xCCCCCCCC;
::GetExitCodeProcess(hProc, &dwProcExitCode);
//Clean up
::FreeEnvironmentStrings(pEnvStrs);
::CloseHandle(pi.hThread);
::CloseHandle(pi.hProcess);
とバッチtest.bat
ファイルはちょうどこのです:
notepad
しかし、私はそれを実行すると、オープンコンソールを維持するために/C
の代わりに/K
オプションを使用しますコンソールウィンドウで次のエラーが表示されます。
ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません。
cmd.exe
とエラーコード1
を返します。
ここで私は何が欠けていますか?
EDIT:申し訳ありませんが、私はGUIプロセスから呼び出しています。
パスが間違っている可能性があります。エラーをチェックしないことは問題です。 SIZEOFの使用は間違っています。なぜTCHARを使用していますか?あなたはWin98をターゲットにしていますか?なぜ環境文字列を渡すのですか?環境を継承するためにNULLを渡すだけです。 –
@DavidHeffernan:このコードサンプルでエラーをチェックするのは、読みやすくするためではありません。あなたの苦しみのために調整されています。 – c00000fd
言い換えれば、私たちが見ることのできないコードについて質問しています。 –