CreateProcess und pipen
-
Hallo,
Da einige Signalverarbeitungsprogramme in der Schule nur unter Unix laufen, hat uns der Dozent eine Version von Cygwin zur Verfügung gestellt, bei der die Programme enthalten sind. Da die Installation dieser Cygwin Version recht mühsam ist, dachte ich, ich schreib mal ein Setup Programm. Das Problem ist nun, da das Archivfile im tgz Format ist, muss es um entpackt zu werden nach vom Programm gzip zum Programm tar gepipt werden. Um es klarer zu machen, im CMD muss folgendes eingegeben werden:
gzip -cd cygwin.tgz | tar xSpf -
führe ich diesen Befehl nun mit system("...") aus, funktioniert das einwandfrei. Da ich hier mal gelesen habe, dass man system() nicht verwenden sollte, möchte ich das Archiv mit CreatProcess entpacken. Ich habe das mal folgender massen versucht:bool ok = CreateProcess(NULL, "gzip -cd cygwin.tgz | tar xSpf -", NULL, NULL, true, NORMAL_PRIORITY_CLASS, NULL, GetCurrentDir().c_str() , &sStartInfo, &sProcessInfo);Das Ergebnis ist nun, dass zwar ein gzip Process generiert wird, der tar Process, an den die Daten von gzip gepipt werden sollen jedoch ausbleibt. Kann mir da vielleicht jemand helfen?
-
Würde das mal trennen 1. Parameter Applikation, 2. Paramter CommandLine
-
Oder du machst es dir einfacher mit ShellExecute().
-
Application und Commandline trennen bringt nichts, habe ich versucht.
Das Problem ist, wenn ich ShellExecute() verwende, erfahre ich nicht wann das enpacken fertig ist um die instellation fortzusetzten.
-
OK, da ist was dran...
-
Da hilft dir dann aber ShellExecuteEx. Da bekommst du auch einen Prozesshandle zurück.
-
Habe jetzt mal einen Versuch mit ShellExecuteEx() folgendermassen gestartet:
hUnzip.cbSize = sizeof(hUnzip); hUnzip.fMask = SEE_MASK_NOCLOSEPROCESS; hUnzip.nShow = SW_SHOW; hUnzip.lpFile = "gzip.exe"; hUnzip.lpParameters = "-cd cygwin.tgz | tar xSpf -"; ShellExecuteEx(&hUnzip);Doch leider mit demselben Ergebnis wie mit CreatProcess, der Process von gzip.exe wird ausgeführt, jener der tar.exe an den die Daten gepipt werden sollen bleibt aus.
Als Alternative habe ich noch Versucht, als lpFile = "cmd" zu übergeben und dann für lpParameters = "gzip -cd cygwin.tgz | tar xSpf -". Bei dieser Version werden die Parameter vollkommen ignoriert.
-
Habs weder mit CreateProcess noch mit ShellExecuteEx hin bekommen. Habe jetzt folgende lösung gewählt. Ich erstelle ein batch file, in dem die Pfanangaben richtig gesetzt werden und führe anschliessend dies batch Datei mit ShellExecuteEx aus und hole mir anschliessend die beiden Handles des gzip und tar Prozesses.