2017-02-03 23 views
0

私の目標は、コンソールウィンドウを表示せずにコマンドラインバッチスクリプト(.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オプションを使用しますコンソールウィンドウで次のエラーが表示されます。

ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません。

enter image description here

cmd.exe

とエラーコード1を返します。

ここで私は何が欠けていますか?

EDIT:申し訳ありませんが、私はGUIプロセスから呼び出しています。

+1

パスが間違っている可能性があります。エラーをチェックしないことは問題です。 SIZEOFの使用は間違っています。なぜTCHARを使用していますか?あなたはWin98をターゲットにしていますか?なぜ環境文字列を渡すのですか?環境を継承するためにNULLを渡すだけです。 –

+0

@DavidHeffernan:このコードサンプルでエラーをチェックするのは、読みやすくするためではありません。あなたの苦しみのために調整されています。 – c00000fd

+0

言い換えれば、私たちが見ることのできないコードについて質問しています。 –

答えて

1

フェラ、私はそれを得たと思う。これはあまりにも愚かです。答えはC++CreateProcessまたはcmd.exeとは関係ありません。それはWindowsの10です。私は最近、私のラップトップのWindows 7からそれに切り替えました。したがって、"un-learning curve"です。

誰かがWindowsエクスプローラに追加したこのばかげたことに遭遇した場合(Windows 10または8.1の場合はわかりません)、試してみることになります。愚かな何かを修正する!

とにかく、私は、Windows 7でのファイルのパスを取得するような方法は、私はWindowsのエクスプローラで、それを右クリックし、[Propertiesに行き、その後、SecurityObject Nameフィールドからコピーしたい:

enter image description here

冒頭にはLEFT-TO-RIGHT EMBEDDING Unicode character 202A)があり、エクスプローラは他のパスと一緒にコピーしています。さらに、ソースファイルに貼り付けると、目に見えなくなります。その時点であなたのコードがうまくいかない理由を知ることができます。ここで

は、文字列の六角ビューは、(私はUnicodeテキストファイルに保存された後、その最初のFEFFは、BOMのマーカーである)です。

enter image description here

Raymond Chen私もfound this記事、いつものように、その使用を正当化する。

したがって、最終行Windows 10(または8.1)の[プロパティ]の[セキュリティ]タブで、PATHSをコピーしないでください!

だからChristopher Oicles私のOPにコメントの中でそれがあった。

PS。面白いことに、Generalタブのフォルダパスだけをコピーすると、先頭にそのUnicode文字はありません。だから、Microsoftの姿を見せてください!

+0

質問から答えられません。多くを削除するだけでベスト。 –

+0

@DavidHeffernan:私は将来のGoogle検索のためにここに入れました。 – c00000fd

+0

質問を削除し、問題のパスがどこから来たのかを詳細に新しいQ&Aを提供してください。質問に最初のコメントの最初の文を読んでいるはずです。 –

関連する問題