2017-04-14 3 views
0

Wenn ich die Codes unten ausführen, erscheinen dos Fenster sofort und verschwinden dann. Was ich will ist, dass das Fenster bleibt und auf die nächste Befehlseingabe des Benutzers wartet. Was soll ich mit startupInfo.hStdInput tun, wenn ich Fenster zeigt behalten wollen, und ich habe Createprocess in meinem Projekt nicht die WinExec usw.Dos Fenster erscheint dann verschwindet sofort

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

Warum führen Sie manuell so ein "Ping" aus, anstatt ['IcmpSendEcho()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366050.aspx) zu verwenden ? –

+0

Ich schreibe ein Projekt, das ich console über meine win32-Anwendung kontinuierlich Eingabe/Ausgabe möchte, so erwarte ich DOS-Fenster offen nach Code CreateProcess (NULL, Befehl, NULL, NULL, WAHR, NULL, NULL, NULL, & startupInfo, & processInfo) wird ausgeführt und wartet auf den nächsten Benutzerbefehl –

+0

Das DOS-Fenster wird geschlossen, wenn der angegebene Befehl beendet wird. Da Ihr 'Befehl' nur' Ping' ist, wird das DOS-Fenster geschlossen, wenn 'Ping' beendet wird. Wenn Sie das DOS-Fenster nach dem Beenden von 'ping' geöffnet lassen möchten, müssen Sie 'cmd.exe' stattdessen mit dem angegebenen Kommandozeilenschalter'/K' und 'ping' als Initialbefehl für' cmd.exe ausführen 'auszuführen, zB:' cmd.exe/K ping 192.168.0.1'. Verwenden Sie die Umgebungsvariable '% COMSPEC% ', um den vollständigen Pfad zu' cmd.exe' zu ​​erhalten. –

Antwort

0

zu verwenden, wenn das Problem, dass das schließt sofort Prozessfenster ist, sein kann Sie sollten pause ... in der Lage sein, die Ergebnisse Ihrer ping Befehl, um zu sehen ..

Nun, ich bin in keiner Weise c++ Experte hinzufügen ..., aber ich würde vorschlagen, etwas in den folgenden Zeilen Code zu versuchen, ...

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

Warum würden Sie '&& pause && exit' mit dem Schalter'/k' verwenden? Das OP sagte: "* Warte auf die nächste Befehlseingabe des Benutzers *", aber diese Kombination würde nicht erlauben, dass mehr Benutzerbefehle eingegeben werden. Die Verwendung von '/ k' würde es selbst tun. Wenn Sie gerade beenden, können Sie auch '&& exit' ablegen und'/c' anstelle von '/ k' verwenden. –

+0

@RemyLebeau du hast wahrscheinlich Recht ... Ich habe irgendwie den "nächsten Befehl" Teil verpasst ... – Plirkee

Verwandte Themen