konsolen-prozesse redirecten - windows programme starten

sodala, immernoch im zuge meines projekts nun wiedermal ein problem :( (habs zwar schon in den anderen thread reineditiert, aber den liest wohl keiner mehr..)
und zwar:
ich erzeuge mit meinem programm einen kindprozess aus cmd.exe und leite die stdin/stdout-handles in mein programm um. der vorgang basiert im groben auf der technik, die hier bei microsoft erklärt wird, nur dass mein programm halt ein gui hat. das problem is jetzt nur:
wenn ich mit dieser umgeleiteten cmd ein windows-programm starten will (z.b. mspaint.exe, mmc.exe etc.) wird der prozess zwar erstellt, das fenster wird jedoch erst angezeigt, nachdem ich ein paar mehr befehle eigebe (dann ist zwar das fenster da, aber es hängt) oder ich meinen childprozess beende. hab schon die suchmaschine bemueht, aber auf dem board und auch bei google nichts entsprechendes gefunden.
hatte irgendjemand dieses problem schon mal bzw. hat da ne lösung gefunden?
hab jetz diverse code-foren abgegrast, die zwar alle unterschiedliche ansätze fuer das piping vorstellen, aber alle die gleiche macke haben.. scheint wohl irgendwie keine lösung dafür zu geben.
meine eigene idee dazu wäre, bei der prozesserstellung per IAT-hook die createprocess-funktion abzufangen, dann per neuer pipe den zu erstellenden prozess an meine host-anwendung zu senden und den prozess dann von der zu erstellen.. aber mir kommt das vor wie mit kanonen auf spatzen schießen, da es ja vielleicht nur an einem falsch gesetzten parameter oder so liegt X(

mfg jacky
 
Original von heinzelJacKy :
...aber den liest wohl keiner mehr..
Die automatische Benachrichtigung per Mail funktioniert leider nicht bei Beiträgen, die editiert wurden sondern nur bei neu erstellten.

Dein Programm enthält keinen Fehler. So sieht es die "Designer-Logik" vor :

Ein Parentprozess erzeugt ein Childprozess und wird solange angehalten bis der Childprozess beendet wird.

Diese Technik stammt noch aus einer Zeit, in der es Multitask-Betriebssysteme noch nicht gab.

Soll denn Deine Host-Anwendung so etwas wie ein "Programmstarter" werden ?
 
hm jo also das ganze soll, wie in dem anderen thread beschrieben, eine cmd mit erweiterung werden, die dauerhaft im hintergrund läuft und bei bedarf aktiviert wird.
Ein Parentprozess erzeugt ein Childprozess und wird solange angehalten bis der Childprozess beendet wird.
nee, es is ja genau andersrum: die childprozesse meines childprozesses werden angehalten und erst aktiviert, wenn mein host bzw. mein child1 beendet wird:
host (mein prog)
|____cmd.exe
|____paint
|____mmc
|____...

also alle childprozesse von cmd.exe werden angehalten... evtl liegts auch an den handles die vererbt werden, aber normalerweise sollten ja die windows-programme sich garnicht um stdin/stdout kuemmern..

mfg jacky
 
Du musst die "erweiterte Befehlsanzeige" der gestarteten cmd.exe deaktivieren :

Code:
vorher :
bool bFuncRetn = CreateProcess(NULL, "cmd.exe",(...)

nachher :
bool bFuncRetn = CreateProcess(NULL, "cmd.exe /E:OFF",(...)
Ohne diese Änderung können Programme via "start programmname" ausgeführt werden.
Wenn die "erweiterte Befehlsanzeige" aktiv ist, dann startet cmd.exe zwar das Programm, wartet aber noch auf weitere Kommandozeilen.
 
hm ja du hattest recht, das mit der erweiterten befehlsanzeige stimmt. allerdings pausiert nun die cmd.exe bis die gestartete anwendung beendet wurde.. naja bin zu dem schluss gekommen, dass das ganze wohl net so einfach möglich ist und hab mich nun entschieden, das ganze zu lösen indem ich in meinem programm eine funktion einbaue, die kommandos wie "^mspaint" in "start mspaint" umwandelt..das sollte dann auf jeden fall funktionieren.

thx fuer den tipp
--jacky
 
Zurück
Oben