MFC Programm + Visual Studio Konsole
-
Hi zusammen,
folgendes Problem habe ich zur Zeit:
Ich hab ein in C++/MFC geschriebenes Tool. Das Tool unterstützt sowohl das Arbeiten via GUI (gemacht mit MFC), soll nun aber auch die wichtigsten Funktionen in der Konsole anbieten. Das funktioniert insoweit schon ganz ordentlich, als das ich es aus der MS Console (Start->Ausführen->cmd) ausführen kann und dort kann ich auch etwas schreiben. Nur leider kann ich hier ja nicht debuggen (in die Konsole muss auch nur geschrieben werden). Jetzt würde ich das aber gerne auch direkt in Visual Studio benutzen können, um eben auch mal mitzusteppen. Leider schmeißt er immer einen Fehler mit dem Code für die MS Console. Ich zeig euch mal den Code, soweit er steht und funktioniert:Hauptklasse, in der zwischen GUI und Konsolenstart unterschieden wird
// Check if there are Command Line arguments CommandLineParser cmdLineInfo; ParseCommandLine(cmdLineInfo); if (cmdLineInfo.HasCommandLineArgs()) { CommandLineInterpreter cLineInterpreter; int retVal = cLineInterpreter.Interpret(cmdLineInfo.ErrorOccured(), cmdLineInfo.IsHelp(), cmdLineInfo.m_GivenParameters); } else { // GUI starten }
Ich parse also erst die Kommandozeilenargumente, und falls es welche gibt, haue ich sie in den Interpreter, der dann das weitere übernimmt. Im Konstruktor des Interpreters hole ich mir die Verbindung zur Konsole:
CommandLineInterpreter::CommandLineInterpreter() { // Attach to the MS Console and let the stdout point to it (needed for using std::cout) AttachConsole(ATTACH_PARENT_PROCESS); hf = _fdopen( _open_osfhandle( (intptr_t)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT ), "w" ); *stdout = *hf; setvbuf(stdout, NULL, _IONBF, 0); SetConsoleCtrlHandler(NULL, true); }
Bei _fdopen fliegt der Fehler.
-
Das Problem ist ja, dass die Console schon längst weiterarbeitet... das kannst Du am besten in einer Batch Datei nachvollziehen.
In einer Console werden *nur* Consolen-Anwendungen sinnvoll dargestellt!
Aus diesem Grunde lösen die meisten Programme (u.a. auch devenv.exe) dies so, indem sie einen *eigenen* Prozess schreiben, welches als Consolen-Prozess übersetzt wurde; mit genau dem gleichen Namen, aber umbenannt nach *.com!
In einer Console wird nämlich *zuerst* nach einer Datei mit der Endung *.com gesucht und erst dann nach *.exe. So wird in der Console immer zuerst die richtige Consolen-Anwendung gestartet und ansonsten immer die exe
-
Jochen Kalmbach schrieb:
Das Problem ist ja, dass die Console schon längst weiterarbeitet... das kannst Du am besten in einer Batch Datei nachvollziehen.
In einer Console werden *nur* Consolen-Anwendungen sinnvoll dargestellt!
Aus diesem Grunde lösen die meisten Programme (u.a. auch devenv.exe) dies so, indem sie einen *eigenen* Prozess schreiben, welches als Consolen-Prozess übersetzt wurde; mit genau dem gleichen Namen, aber umbenannt nach *.com!
In einer Console wird nämlich *zuerst* nach einer Datei mit der Endung *.com gesucht und erst dann nach *.exe. So wird in der Console immer zuerst die richtige Consolen-Anwendung gestartet und ansonsten immer die exe
Ok, wenn ich das richtig verstehe müsste ich es als Konsolenanwendung übersetzen lassen um es so zu benutzen wie ich mag?!
Ich hab zumindest schonmal eine Ausweichmöglichkeit gefunden: Über Debug->Attach to Process.. kann ich mich dranhängen, wenn sie in der MS Console läuft. Aber ist natürlich etwas nervig, da jedes mal an der entsprechenden Stelle nen Sleep einzubauen und dann per Hand schnell Attach to Process zu machen..
-
Wenn ich dich richtig verstehe, willst du einfach nur die an das Programm übergebenen Parameter "debuggen", zumindest deinen Parser, oder?
Wenn ja, dann gibts dafür meiner Meinung nach einen anderen Weg:
In den Einstellungen deines Projekts > Configuration Properties > Debugging > Command Arguments.Dort kannst dann deine Parameter eintragen und wie gewohnt debuggen. Hoffe das hilft und ich habe das Problem richtig verstanden
-
Source2702 schrieb:
Wenn ich dich richtig verstehe, willst du einfach nur die an das Programm übergebenen Parameter "debuggen", zumindest deinen Parser, oder?
Wenn ja, dann gibts dafür meiner Meinung nach einen anderen Weg:
In den Einstellungen deines Projekts > Configuration Properties > Debugging > Command Arguments.Dort kannst dann deine Parameter eintragen und wie gewohnt debuggen. Hoffe das hilft und ich habe das Problem richtig verstanden
nö, haste missverstanden
Das ich meine Argumente da eingebe, weiß ich. Ich will tatsächlich das komplette Programm debuggen können, egal ob es jetzt die GUI startet oder über die Konsole kommunizieren soll.