Shellexecute(Programm schliessen)



  • Hi,

    ich öffne mit Shellexecute ein Programm, soweit so gut, aber kann ich das gestartete Prog. auch wieder mit Shellexecute schliessen ?


  • Mod

    Nein! Du kannst theoretisch WM_CLOSE an das fremde Programm senden, wenn es eine Windows Applikation ist.
    Ein kontrolliertes Verfahren das immer funktioniert gibt es nicht.

    Was ist das für ein Programm, dass Du Schließen möchtest und warum?



  • Ich möchte die Laufzeit eines externen Programmes auslesen können. Und ausserdem wollte ich eben dieses externe Programm, mit dem Programm starten und wieder beenden können. Also ich bin jetzt mal umgestiegen auf CreateProcess, ich vermute mal das ich damit eher zur Problemlösung komme, oder irre ich mich ?


  • Mod

    Du irrst Dich! Prozesse führen ein eigenständiges Leben, wenn diese Prozesse selbst es nicht vorsehen von außen Beendet zu werden hast Du keine Möglichkeit außer dem Holzhammer und dieser ist grundsätzlich abzulehnen.

    Wie ich schon schrieb. Evtl. hast Du Glück und die Applikation regaiert ohne Fragen auf Wdas senden von M_CLOSE...



  • Also meinst du es ist nicht möglich so ein Programm zu schreiben ?



  • Was ist denn für ein Programm, das du wieder schließen willst? Die meisten vernünftigen Windows-Programme reagieren auf ein WM_CLOSE, also sollte das auch funktionieren (Stichwort: SendMessage()).

    (und falls alle Stricke reiße, bleibt noch die Holzhammer-Methode TErminateProcess() - aber die solltest du nur verwenden, wenn das betroffene Prgramm auf gar nichts mehr reagiert)



  • Also ich öffne ein Programm um ein anderes Programm zu öffnen. Das Programm was ich zuerst geöffnet hab dient der Zeitmessung und sagt mir wielange das zweite Programm schon läuft. Jetzt will ich halt irgendwie die beiden Programme auch beim beenden wieder miteinander verkapseln damit ich nicht nur weiss ab wann ich das Programm gestartet hab, sondern damit ich auch weiss wann es beendet wurde.



  • Da hast du zwei prinzipielle Möglichkeiten:

    • Programm 1 (der Zeitmesser) wartet mit WaitForSingleObject() darauf, daß sich Programm 2 von selber beendet (das dafür notwendige Prozess-Handle liefert dir ShellExecuteEx() bzw. CreateProcess() in der struct, die du als (einzigen bzw. letzten) Parameter übergibst).
    • Programm 1 schickt per SendMessage die Aufforderung WM_CLOSE an Programm 2 (das Fenster-Handle mußt du über FindWindow() o.ä. herausfinden)

    -> ich würde vermutlich beide Ansätze kombinieren



  • super Danke, mal gucken wie ich das am besten mach


  • Mod

    Nur als Anmerkung: Sollte das Programm so etwas wie Dateien bearbeiten und vor dem Beenden fragen ob die geändertern Daten gespeichert werden sollen, dann hat man mit WM_CLOSE keinen Erfolg.

    Und TerminateProcess ist niemals eine Lösung.
    Man sollte dann untesuchen, ob eine MessageBox offen ist, diese entsprechend "Benatworten" und dafür sorgen, dass WM_CLOSE wirklich bearbeitet wird.



  • ja vielen Dank atm weiss ich eh noch nicht wirklich wie ich mit den Befehlen WM_CLOSE oder WaitForSingleObject arbeiten soll...

    Wenn ich an den CreatProcess()
    das hier anhänge

    WaitForSingleObject( pi.hProcess, INFINITE );

    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

    dann hängt sich das erste Programm auf , bis ich das zweite beende...


  • Mod

    Es hängt sich nicht auf, es wartet! Der Unterschied ist entscheidend...



  • hmmm ja vll. aber es sieht so aus als ob es sich aufgehangen hätte. Es steht auch oben wo der Name des Programms steht : (Keine Rückmeldung). Das kenn ich normal nur von Anwendungen die abgestürzt sind



  • Mit "keine Rückmeldung" kennzeichnet Windows Programme, die nicht mehr ihre Befehlswarteschlange abarbeiten. Wenn du nicht willst, daß dein Programm dort hängen bleibt, solltest du ein etwas kürzeres TimeOut-Intervall verwenden und WaitForSingleObject() im Rahmen der Nachrichtenschleife ständig aufrufen.

    (Wait...() hat auch einen Rückgabewert, der dir sagt, ob das Zielobjekt aktiv wurde (WAIT_OBJECT_0) oder der Timeout abgelaufen ist (WAIT_TIMEOUT))



  • hey vielen Dank jungs was würd ich nur ohne euch machen 👍


Log in to reply