2016-10-28 2 views
0

私はプログラムを実行するとCreateProcessA(NULL, "cmd", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);オープンシェル/ CMD

を使用してcmdを、標準のウィンドウを開きたい、コンソールが点滅を簡単にし、その後 どうすれば、プログラムのコマンドラインを開いて、ために開いたままにしますが消えます任意のコマンドを入力するユーザーですか?

+0

ない完全なコードなしで何が起こっているかを確認し、それはあなたのコードを持っている唯一のものである場合プロセスは実行後直ちに終了し、すべての子プロセスを強制終了します。 "WaitForSingleObject"のようなハンドラのように、コマンドの後にループを追加してください。 – Makaronodentro

+0

@Makaronodentro:* "したがって、すべての子プロセスを殺す" * - いいえ、何も起こっていません。起こっているのは、プロセスが終了すると、 'CreateProcessW'から返されたプロセス(およびスレッド)ハンドルを閉じます。そして、それらは* cmd.exe *プロセスに対する最後の開いたハンドルだったので、そのプロセスは閉じられます。子/親の関係はまったく興味深いものではありません(そして、Windowsで管理されている間は、とにかく役に立ちません)。 – IInspectable

答えて

1

あなたはユーザーエントリのコンソールウィンドウを開いた保つcmd.exe/kオプションを使用する必要があります。次のスニペットは、exitのコマンドを使用して、それを終了するには、ユーザーの新しいシェルコンソールと待機を開きます。

STARTUPINFOA si; 
ZeroMemory(&si,sizeof(STARTUPINFO)); 
si.cb = sizeof(si); 
PROCESS_INFORMATION pi; 
ZeroMemory(&pi, sizeof(pi)); 
char cmd_exe[32767]; 
GetEnvironmentVariable("COMSPEC", cmd_exe, 32767); 
if (CreateProcessA(cmd_exe, "/k", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) 
{ 
    CloseHandle(pi.hThread); 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    DWORD dwExitCode = 0; 
    GetExitCodeProcess(pi.hProcess, &dwExitCode); 
    CloseHandle(pi.hProcess); 
    std::cout << "cmd process exit code = " << dwExitCode << std::endl; 
} 
else 
{ 
    DWORD dwErrorCode = GetLastError(); 
    std::cout << "cmd process not started, error = " << dwErrorCode << std::endl; 
} 
+1

Windowsフォルダの場所はインストール時にユーザ定義されているため、正しいパスを取得するには' GetEnvironmentVariable( "COMSPEC") 'を使用する必要があります。 'cmd.exe'へ。 –

+0

@RemyLebeau: 'cmd.exe'がPATHにあると仮定してフォルダ名を削除しました。 – shrike

+0

Brunoのその問題についての私のコメントを参照してください。 –

-1

これが開き、プロセスの状態を待ちを変更するコードです:

if (CreateProcessA(NULL, "cmd.exe", 
    NULL, NULL, TRUE, 0, NULL, 
    NULL, &StartupInfo, &ProcessInfo)) 
{ 
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE); 
    CloseHandle(ProcessInfo.hThread); 
    CloseHandle(ProcessInfo.hProcess); 
} 
else 
{ 
    // Failed to launch ... 
} 
+0

ダウン投票。この回答は、cmdウィンドウが閉じるのを待つ方法を示していますが、cmdウィンドウが開くとすぐに閉じないようにOPの質問に対処するために何もしません。また、 'cmd.exe'へのフルパスを指定しないと、' CreateProcess() 'はそれを見つけられません:" *部分的な名前の場合、関数は現在のドライブと現在のディレクトリを使用して**機能は検索パスを使用しません**。 " –