2012-04-02 11 views
4

Ich möchte eine TEST.exe in einem C-Programm ausführen. Während ich verwendesystem() und CreateProcess()/CreateProcessW()

system("TEST.exe <input-file> output-file"); 

kann ich bekommen, was ich erwartet habe.

Aber CreateProcessW() nicht richtig funktionieren, wenn ich den folgenden Code verwenden (siehe How do I run an external program?):

if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()), 
    pwszParam, 0, 0, false, 
    CREATE_DEFAULT_ERROR_MODE, 0, 0, 
    &siStartupInfo, &piProcessInfo) != false) 
{ 
    /* Watch the process. */ 
    dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000)); 
    iReturnVal = GetLastError(); 
} 
else 
{ 
    /* CreateProcess failed */ 
    iReturnVal = GetLastError(); 
} 

wo

FullPathToExe="TEST.exe", pwszParam="TEST.exe <input-file> output-file". 

und WaitForSingleObject() liefert 258, GetLastError() zurückkehrt 1813 ("Der angegebene Ressourcentyp kann nicht in der Image-Datei gefunden werden.").

Auch Die obige CreateProcessW() Code funktioniert gut, wenn ich meine eigenen HelloProcess.exe laufen (Druck hallo, und einige Sekunden durch die folgende Nummer, dann die Ausfahrt bestimmt schlafen.) Mit

FullPathToExe="HelloProcess.exe", pwszParam="HelloProcess.exe 10". 

Irgendwelche Ideen ? Danke für Hinweise!

+0

Ist FullPathToExe eine Zeichenfolge oder ein Wstring? – zdan

+0

Es ist ein Wstring. Ich denke, die Arten von Variablen sind in Ordnung, da der Code gut mit meiner eigenen * .exe läuft. Ich frage mich, ob es ein Problem mit der "<"/">" in den Parametern gibt? – dehiker

+0

Titel sollte geändert werden in "Eingabe/Ausgabe-Umleitung: System() vs. CreateProcess()", aber ich darf es nicht bearbeiten. Außerdem ist der Abstand in " output-file" inkonsequent - und somit irreführend -. Zeichen '<>' sind Präfixe, aber der Abstand zwischen OP bedeutet, dass es sich um Klammern handelt. Abstand, der nicht irreführend wäre: ' input-file'. – 7vujy0f0hy

Antwort

6

system laicht tatsächlich eine cmd Instanz in dem Ihr Befehl ausgeführt wird:

Das System Funktionsbefehl an die Befehls-Interpreter übergibt, die die Zeichenfolge als einen Betriebssystem-Befehl ausführen. System bezieht sich auf die Umgebungsvariablen COMSPEC und PATH, die die Befehlsinterpreterdatei (die Datei mit Name CMD.EXE in Windows NT) finden. Wenn der Befehl NULL ist, überprüft die Funktion einfach, ob der Befehlsinterpreter existiert.
- Documentation of system

Aus diesem Grund Umleitung Operatoren wie < und > Arbeit. Dies ist nicht der Fall für CreateProcess, die wirklich nur einen Prozess statt einer Shell, die einen anderen Prozess ausführt. Da die Umleitungsoperatoren eine Funktion der Shell und nicht des Betriebssystems sind, müssen Sie den Prozess manuell eingeben und ausgeben.

+0

Vielen Dank für Ihre Erklärung. Und ich finde jetzt die Lösung für mein Problem, hurra !! – dehiker

2

Ich mache was CreateProcess and command line arguments sagt mir zu tun, und beheben Sie das Problem! Vielen Dank für Ihre Aufmerksamkeit!

Für Ihre Bequemlichkeit ist hier das Zitat der Antwort:

Sie keine Befehlszeilenumleitungsoperatoren mit Createprocess() direkt nutzen können. Sie haben eine Instanz von cmd.exe, um laichen und die Betreiber es stattdessen passieren, zB:

CreateProcess("C:\\windows\\system32\\cmd.exe", t_str2, ...)) 

Wo t_str2 ist „/CC:\Temp\sift.exe < C: \ img1.pgm> C: \ img1.key ". Der tatsächliche Pfad zu cmd.exe kann ermittelt werden, indem die Umgebungsvariable% COMSPEC% gelesen wird.

0

WaitForSingleObject() gibt ein Warteergebnis und nicht den Beendigungscode zurück. https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

258 ist ein WAIT_TIMEOUT. Sie sollten diesen Fehlercode erneut versuchen, bis Sie den Rückgabewert 0 (WAIT_OBJECT_0) oder einen anderen Fehler erhalten.

Danach verwenden Sie GetExitCodeProcess https://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx , um den Exit-Code des Prozesses zu erhalten.