Konsolenanwendung aus WinAPI-Anwendung heraus schließen
-
Hallo Leute,
ich starte von meiner WinAPI Anwendung heraus eine Konsolenanwendung.CreateProcess(NULL, prog_cmd_line, NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInfo);der Process wird aus einem extra Threat heraus gestartet und ich würde gerne diese Konsolenanwendung über einen Button aus meiner Anwendung heraus beenden. Das klappt nun schon fast. Jedoch wenn ich meinem Buttonevent bekomme und dann das aufrufe:
PostMessage(FindWindow(NULL, "meine consolenanwendung"), WM_CLOSE, 0, 0);dann erscheint immer eine POPUP in meiner Konsolenanwendung "möchten sie wirklich beenden nicht gespeicherte informationen ghen verloern" "JA/NEIN", hmmm wie kann ich die Konsolenanwendung ohne diese nachfrage beenden?
-
Probier mal:
PostMessage(FindWindow(...), WM_SYSCOMMAND, SC_CLOSE, 0);
-
Lass Deine COnsolenanwendung ein globale Event öffnen. Dieses Event wird von Deiner erzeugenden Applikation angelegt und bei Bedarf gesetzt. Deine Konsolen Applikation prüft zyklisch ob es beenen soll in dem es das Event prüft.
Andere Variante wäre das senden von Crtl+C
GenerateConsoleCtrlEvent!
-
Danke für die Antworten erstmal
@CodeFinder, leider bekomme ich bei dieser Methode das gleiche POPUP Fenster
@Martin Richter, ähm wenn ich das richtig verstehe, müsste die Konsolenanwendung da auch schon von mir programmiert worden sein, dem ist aber nicht so.
Die einzige Möglichkeit die ich gefunden habe und die funktioniert ist diese weniger schöne Variante:
TerminateProcess(...);
-
Für GenerateConsoleCtrlEvent müsste das nicht so sein.
In den meisten Fällen reagieren die Konsolen Anwendungen auf Ctrl+C.Wenn die Konsolen-Anwendung nicht von Dir ist, dann kannst Du sie auch nicht kontrolliert beenden. Egal ob Du das Fenster schließt oder TerminateProcess verwendest. Das würde alles letzten Endes die Applikation unkontrolliert beenden.
Warum lässt Du sie nicht bis zum Ende laufen?
-
Wenn die Anwendung nicht auf SC_CLOSE reagiert, dann ist die wahrscheinlichkeit sehr gering, dass diese auf Ctrl-C reagiert (aber man müsste es ausprobieren)... drück doch einfach mal Ctrl-C!
-
Prüfe mal mit Sysinternal's ProcessExplorer, ob die Konsolenanwendung eventuell ein globales Event hat, welches sich setzen lässt.
-
Danke für den Hinweis mit "GenerateConsoleCtrlEvent". Da sich die Konsole über CTRL+C schließen läßt, hat das dann auch damit geklappt.
-
Klaus.. schrieb:
Danke für den Hinweis mit "GenerateConsoleCtrlEvent". Da sich die Konsole über CTRL+C schließen läßt, hat das dann auch damit geklappt.
Wenn das Programm das Signal aber nicht speziell behandelt dürfte es genau wie TerminateProcess sein.
-
hel schrieb:
Klaus.. schrieb:
Danke für den Hinweis mit "GenerateConsoleCtrlEvent". Da sich die Konsole über CTRL+C schließen läßt, hat das dann auch damit geklappt.
Wenn das Programm das Signal aber nicht speziell behandelt dürfte es genau wie TerminateProcess sein.
Mit Sicherheit nicht!
Auf Ctrl-C wird alles was mit atexit und der normalen CRT zu tun hat, sauber geschlossen. Es wird kontrolliert ExitProcess aufgerufen. Es bleiben im allgemeinen keine Handle Leaks.Wenn das Programm auch einen richtigen Ctrl-C Handler hat (wie meine Programme) passiert gar nichts böses. Das Programm wird kontrolliert beendet.