Zusätzliche Konsole öffnen
-
Hi,
ich habe ein (Windows-) Kommandozeilen-Programm, in welches ich noch folgendes "feature" einbauen möchte:
Während der Laufzeit soll eine weitere Shell aufgerufen werden, in welcher dann ein bestimmter Teil desselben Programms abläuft und danach die Kontrolle wieder an die aufrufende Shell zurückgibt. Ich kenne aber keine Funktionen/Befehle die das bewerkstelligen.
Ich weiß, dass das irgendwie gehen muss, da ich etwas Ähnliches schonmal irgendwo gelesen habe, allerdings finde ich nix mehr zu dem Thema. (Mir würden auch system()-Befehle langen)
Zur Info: Das Prog ist in 'C' programmiert.Vielen Dank für eure Hilfe.
-
Ich glaube nicht, daß das so geht, denn:
"A process can be associated with only one console, so the AllocConsole function fails if the calling process already has a console. A process can use the FreeConsole function to detach itself from its current console, and then it can call AllocConsole to create a new console. If the calling process creates a child process, the child inherits the new console."
-
probier mal
system("cmd"); system("exit");
ist schon ne weile her das ich sowas gemacht habe allso keine garantie drauf.
cmd öffnet eine neue "shell" aber in der aktuellen.
dazwischen fürst du deine befehle aus.
Sitze gerade an einem Linux rechner sonst würde ich es testen.und exit beendet dies dan wider.
-
Wenn ich das richtig verstanden habe, heißt das doch, dass eine neue (Child) Konsole alles aus der Parent Konsole erbt --> soweit wäre das gut und könnte ich auch gebrauchen
aber die Parent Konsole danach wieder aktiv zu machen geht nicht --> das wäre schlechtKann das jemand bestätigen widerlegen?
-
@ Bigmek: Ich probier mal deine Lösung und meld mich wieder.
-
ITAzubi23 schrieb:
Wenn ich das richtig verstanden habe, heißt das doch, dass eine neue (Child) Konsole alles aus der Parent Konsole erbt --> soweit wäre das gut und könnte ich auch gebrauchen
aber die Parent Konsole danach wieder aktiv zu machen geht nicht --> das wäre schlechtKann das jemand bestätigen widerlegen?
gehe mal auf start ausführen, schreibt cmd. ENTER
dann schreib cmd. und schau was passiert, das gleiche passiert dann auch bei deinem Porgramm.PS: mit "start cmd" ohne " startert er eine konsole in einem neuen fenster.
aber ob man dan auf diese irgendwie zugreifen kann weis ich nicht?EDIT:mit exit wird die Child Konsole geschlossen und die Parent konsole ist wider aktiv.
du kannst übrigens beliebig viele Konsolen ineinander erstellen.
-
ITAzubi23 schrieb:
Wenn ich das richtig verstanden habe, heißt das doch, dass eine neue (Child) Konsole alles aus der Parent Konsole erbt --> soweit wäre das gut und könnte ich auch gebrauchen
aber die Parent Konsole danach wieder aktiv zu machen geht nicht --> das wäre schlechtKann das jemand bestätigen widerlegen?
Du kannst einen neuen Prozess in einer neuen (weiteren) Konsole starten, kein Problem. Aber was Du wolltest, war, daß in Deiner neuen Konsole Teile Deines aufrufenden Programmes ablaufen, dann die neue Konsole wieder schließen und in der alten weitermachen, und daß das geht, bezweifel ich.
Du kannst aber via CreateProcess ein anderes Programm in einer neuen Konsole starten - aber eben ein zweites Programm, welches dann parallel zu Deinem Aufrufer läuft.
-
Habs grad getestet. Scheint echt problematisch zu sein. Da muss ich wohl einen anderen Weg finden...
Trotzdem danke.
-
Du kannst doch einfach die Teile, die in der anderen Konsole laufen sollen, in ein zweites Programm packen. Dieses startest Du dann via CreateProcess in einer zweiten Konsole, während Du im aufrufenden Programm darauf wartest, daß das aufgerufene Programm beendet wird (WaitForSingleObject). Dann machst Du beim Aufrufer normal weiter.
-
Hab ich auch schon dran gedacht, ist aber sehr unschön und für meine Zwecke etwas oversized. Trotzdem danke.
-
Mach es ins gleiche Programm und lös es mit paramatern.
Und zum warten hätte ich auch ne idee ist aber unschön.Lass das haupprogramm eine datei im programm Verzeichniss erstellen.
Und dann prüfts du jede sekunde(oder mehr, wie du willst) ob du datei vorhanden ist wenn ja dan warte wider eine Sekunde, wenn nein dan laufe weiter.Un Im Sek. Programm führst du deine befehle aus und wenn du fertig bist löscht du die datei wider, damit das hauptprogramm weiterläuft.
Ha vergiss was ich oben beschrieben hab so gehts:
#include <iostream> using namespace std; int main(int argc, char* argv[]) { //IN argv[argc-1] steht der Parameter -t wenn es von sich selbst aufgerufen worden ist if (argv[argc-1][0] == '-' && argv[argc-1][1] == 't') { cout<<"Programm 2 ist mein name ich wurde von Programm 1 gestartet"<<endl; } else { cout<<"Programm 1 ist mein name"<<endl; //Starte eine neue konsole in der aktuellen und führe das Programm testKonsol.exe -t aus system("CMD / F:\\Projekte\\MeineC++\\testKonsol\\Debug\\testKonsol.exe -t"); //system("CLS"); system("PAUSE"); } return 0; }
-
Es gibt 2 Möglichkeiten. Entweder zu erstellst dir selber sowas wie eine Konsole (Also meinetwegen ein Fenster mit einem Multi-Line-Editfeld), oder aber du erzeugst einen Tochterprozess, der sich eine Konsole aufmacht und beispielsweise über Nachrichten (ja, Nachrichtenschleifen kann man in Konsolenprogrammen auch aufmachen) mit Daten versorgt wird, die er ausgibt. Aber dass die beiden Prozesse vernünftig miteinander kommunizieren, wird dann schon wieder etwas komplizierter.
-
Decimad schrieb:
[...]
Aber dass die beiden Prozesse vernünftig miteinander kommunizieren, wird dann schon wieder etwas komplizierter.
Nö, das kann man prima mit Pipes machen.
-
Also die Lösung von bigmek funktioniert einwandfrei, danke dafür.
Hab jetzt trotzdem eine andere Möglichkeit gefunden, ohne ein neues Fenster öffnen zu müssen...thx @ all.
Habt mir mit euren Anregungen echt super weitergeholfen*Thread geschlossen*