2017-04-14 14 views
0

以下のコードを実行すると、ドーズウィンドウがすぐに表示され、消えます。 私が望むのは、ウィンドウがユーザーの次のコマンド入力を待機して待機することです。 WINEXECなどではない、私は窓の上映を維持したいと私は私のプロジェクトでは、CreateProcessを使用する必要がある場合、私はstartupInfo.hStdInputで何をすべきドーズウィンドウが表示され、すぐに消えます

int WINAPI WinMain(
        HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPSTR lpComLine, 
        int nCmdShow) 
{ 
    SECURITY_ATTRIBUTES secAttr; 
    HANDLE hRead,hWrite; 

secAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
secAttr.lpSecurityDescriptor = NULL; 
secAttr.bInheritHandle = TRUE; 
if (!CreatePipe(&hRead,&hWrite,&secAttr,0)) 
{ 
    return FALSE; 
} 

char command[1024]; 
strcpy(command,"ping 192.168.0.1"); 

STARTUPINFO startupInfo; 
PROCESS_INFORMATION processInfo; 
startupInfo.cb = sizeof(STARTUPINFO); 
GetStartupInfo(&startupInfo); 
startupInfo.hStdError = hWrite;  
startupInfo.hStdOutput = hWrite; 
startupInfo.hStdInput = hRead;   
startupInfo.lpTitle = "CMD"; 

if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&startupInfo,&processInfo)) 
{ 
     MessageBox(NULL, "Failed", NULL, MB_OK); 
     CloseHandle(hWrite); 
     CloseHandle(hRead); 
     return FALSE; 
} 

CloseHandle(hWrite); 
CloseHandle(hRead); 

return 0; 
} 
+0

['IcmpSendEcho()'](https://msdn.microsoft.com/en-us/library/windows/desktop/aa366050.aspx)の代わりに、手動で 'ping'を手動で実行しているのはなぜですか? ? –

+0

私はWin32アプリケーションを介してコンソールで入出力を継続したいプロジェクトを書いていますので、コードCreateProcess(NULL、コマンド、NULL、NULL、TRUE、NULL、NULL、NULL、&startupInfo、 &processInfo)が実行され、次のユーザーのコマンドを待ちます –

+0

指定された 'command'が実行を終了すると、DOSウィンドウが閉じます。あなたの 'コマンド 'は' ping'だけであるので、 'ping'が終了するとDOSウィンドウが閉じます。 'ping'終了後にDOSウィンドウを開いたままにしたい場合は、'/K'コマンドラインスイッチを指定して 'cmd.exe'を実行し、' cmd.exe 'の初期コマンドとして 'ping'を実行する必要があります'を実行します。例えば、' cmd.exe/K ping 192.168.0.1'。 '%COMSPEC%'環境変数を使って 'cmd.exe'へのフルパスを取得してください。 –

答えて

0

問題は、プロセス・ウィンドウがすぐに閉じていることである場合であってもよく、あなたは今

...あなたの pingコマンドの結果を見ることができるように... pauseを追加する必要があり、私は決して c++専門にしています...しかし、私は次のコード行に沿って何かをしようとする、ことをお勧め...

CreateProcess( 
         "c:\\windows\\system32\\cmd.exe", 
         "/k ping 192.168.0.1 && pause && exit", 
         NULL, 
         NULL, 
         FALSE, 
         0, 
         NULL, 
         NULL, 
         &startupInfo,&processInfo); 
+0

なぜ '&& pause && exit'を'/k'スイッチで使うのですか? OPは "*ユーザーの次のコマンド入力を待つ*"と言っていますが、このコンボではさらに多くのユーザーコマンドを入力することはできません。 '/ k'を単独で使用すると終了する場合は、 '&& exit'を削除して'/k'の代わりに '/ c'を使用することもできます。 –

+0

@RemyLebeauあなたはおそらく正しいです...私は「次のコマンド」の部分を見逃していました... – Plirkee

関連する問題