So führen Sie eine einfache Befehlszeile mit CreateProcess?
Möchte ich ausführen einer einfachen Kommandozeile, aber ohne, um ein Fenster zu erscheinen. Daher kann ich nicht verwenden, System und Funktion CreateProcess, soweit ich weiß.
Also ich habe den folgenden code zum Beispiel:
//.../
CreateProcess(NULL,input,NULL,NULL,false,NORMAL_PRIORITY_CLASS |
CREATE_NO_WINDOW,NULL,NULL,&startInf,&procInf);//)
//.../
Wenn die Eingabe eine Zeile wie "ping www.google.com -n-2" es scheint zu funktionieren.
Was ich brauche, ist die löschen-Funktion.
Deshalb habe ich versucht, eine Menge von Variationen wie:
input = "rd /S /Q \"D:\\ALEX_DATEN\\PC\\C++\\bla\"";
und
input = "rd /S /Q \"D:/DATEN/PC/C++/bla\"";
Aber nichts passiert, und die Funktion gibt den Fehler :/
Wenn ich Schreibe es als .bat-Datei (ohne die "\" Escape chars) das löschen funktioniert perfekt!
Weiß jemand, was ich falsch mache?
P. s. Nein, ich bin nicht schriftlich eine zerstörerische virus.. wenn das gewesen wäre, mein Ziel, hätte ich definitiv gefunden habe, einfachere Möglichkeiten...
- Versuchen ShellExecute vielleicht?
- HM, ich weiß nicht wirklich sehen, warum verwenden Sie diese. Soweit ich udnerstand hier: msdn.microsoft.com/en-us/library/windows/desktop/... es ausführen will eine Datei, aber ich muss nur eine Zeichenfolge auszuführen...
- cppguy Recht, imo; ShellExecute ist ausgelegt für die Ausführung von Befehls-Zeilen, während CreateProcess ausgelegt ist zum ausführen einer bestimmten EXE-Datei. So, wie ich es sehe, einige Ihrer Optionen sind 1) Verwenden Sie ShellExecute, 2) Erstellen Sie eine dummy-ausführbare Datei, die wraps ShellExecute (oder so ähnlich) und führen Sie den dummy über CreateProcess, oder 3) sehen, wenn Sie direkt ausführen die binären realisiert, dass der rd-Befehl. IMO, ShellExecute ist der Weg des geringsten Widerstandes.
rd
ist ein Befehl in die shell integriert, so können Sie nicht ausführen (zumindest direkt) mitCreateProcess
. Es zu tun, würden Sie ausführen müssencmd.exe
wie die ausführbare Datei, und führen Sie Ihrerd /S ...
.- Oh okey o-o Interessant. Also nicht, dass heißt, ich kann als argument lpFile, einfach die Befehlszeile?
- Jerry Sarg: ahhh.. okey, das macht Sinn auch!
- Die Funktion system() wäre einfacher.
- Carey, Gregory, ja, aber es dispalys ein Fenster, was ich nicht will! Und ich Schaffe es nicht zu machen ShellExecute funktioniert.. =/
- +1 gute Frage! Vielen Dank, es war genau das, was ich suchte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige system-Befehl wie
rd
,del
und ... sind nicht die tatsächlichen ausführbaren Bilder (zB .exe-Dateien), so können Sie nicht ausführen/starten Sie mitCreateProcess
Sie sind built-in-Befehle, die bekannt, umcmd
(Kommando-interpreter von windows) so erstellen Siecmd
und pass dein Befehl:Hinweis: Bitte Lesen Sie die Argumente von
cmd
haben, müssen Sie auf/C
übergeben Ihr Kommando. Damit der Befehl ist wie folgt:GetExitCodeProcess
!!startInf
? es wird wieder auf null gesetzt werden,startInf.cb = sizeof startInf
und wenn Sie möchten, dass das Ergebnis der operation legen Sie dannhStdOutput
zu einer Datei, die Sie später Lesen, oder sogar setzen Sie ihn auf ein Rohr, das in das Programm und erhalten dann das Ergebnis der Ausführung durch die Leitung und wenn Sie nicht brauchen, den Ausgang, ignorieren Sie es einfach!LPSTARTUPINFOW
ist ein typedef fürSTARTUPINFOW*
so können Sie es nicht verwenden, wie, dass, nehmen Sie einen Blick auf meine bearbeitete AntwortWie andere gesagt haben,
rd
kann nicht ausgeführt werden mitCreateProcess()
direkt, müssen Sie ausführencmd.exe
mit/C rd ...
als seine eigenen Kommandozeilen-parameter. AnstattCreateProcess()
wie dieser, sollten SieSHFileOperation()
statt: