DOS-Konsole startet meine MFC-Window-Anwendung, wartet aber nicht auf deren Ende...



  • Hallo.

    Ich verwende das VS 2005 und habe dort unter C++ eine MFC-Windows-Anwendung erstellt (Datei / neu / MFC / MFC-Anwendung /...).

    Der Hintergrund für mein Anliegen ist, dass meine Anwendung einige Optionen unterstützt, die über die DOS-Konsole verwendet werden können. Sonst aber soll sie als normale Windows-Anwendung arbeiten.

    Das Problem: Wenn ich aus einer DOS-Konsole heraus mein Programm starte, dann wartet die Konsole nicht, bis das Programm beendet wurde, sondern geht danach weiter.

    Ich möchte nun das Verhalten meiner Anwendung dahingehend ändern, dass sie sich praktisch so verhält, als wäre sie beispielsweise per „start /wait <Anwendung>“ gestartet worden – aber eben ohne „start“ verwenden zu müssen.

    Eine Möglichkeit wäre die Linker-Option "/subsystem:console", die ich probehalber über…

    #pragma comment(linker, "/subsystem:console")
    

    … getestet habe. Das funktioniert soweit auch gut, sobald ich meine Anwendung aus der DOS-Konsole heraus starte. Nur hat diese Vorgehensweise den Nachteil, dass eine Konsole geöffnet wird, wenn die Anwendung nicht aus einer Konsole heraus gestartet wird.

    Gibt es eine Möglichkeit, meiner Anwendung das gewünschte Verhalten beizubringen?

    MarviESC



  • Die Korrekte Lösung ist: Du erzeugst *zwei* Prozesse. Den einen benennst Du ganz normal "AppName.exe". Das ist Deine ganz normale Windows-Applikation.

    Jetzt erstellst Du noch einen zweiten Prozess (z.B. AppNameConsole.exe) den Du dann aber umbenennst nach "AppName.com" 😉
    Das ist dann der Prozess welcher in der Console aufgerufen wird. Der kann ja dann wieder den anderen starten... das ist dann Dir überlassen.

    Du kannst aber keinen Prozess machen, der beides gleichzeitig unterstützt. Deshalb dieser Weg.

    So macht es u.a. devenv (VS) selber auch...



  • s/Prozess/ausführbare Datei/



  • Danke für die Antwort.

    Dass das nicht geht, hätte ich nicht erwartet, da der Linker Parameter "/subsystem:console" das ja auch irgendwie schafft.

    Hm, dann bleibt wohl nur die vorgeschlagende Lösung. Könnte man die Idee mit den beiden Programmen dann nicht derart auszubauen, dass man die zweite (Win-)exe z.B. als Ressource in dem Konsoleprogramm hinterlegt. So gäbe es nur eine exe (den „starter“ sozusagen), der im Bedarfsfall die Windows-Anwendung _direkt aus der Ressource heraus_ startet.

    Geht das?

    MarviESC



  • Geht nicht... außer Du willst das man immer kurz eine Console sieht...



  • Agrrr, stimmt, das war keine gute Idee von mir. Dann hätte ich ja das gleiche Problem wie oben mit "/subsystem:console".

    Die zusätzliche Konsole zu schließen, wenn die exe nicht aus der DOS-Konsole heraus aufgerufen wurde, ist auch bei der Linker-Parameter-Lösung möglich (Aufruf von FreeConsole() im Konstruktor der App); aber auch dann blitzt sie noch immer kurzzeitig auf. Unschön.

    MarviESC


Anmelden zum Antworten