don't kill me



  • Hi!

    Ich habe von meinem Programm aus eine externe Anwendung (läuft als Win32 Terminal) gestart via CreateProcess.

    STARTUPINFO         si;
      PROCESS_INFORMATION pi;
    
      ...
    
      CreateProcess(NULL,
                    "C:\\pfad\\extern.exe -option",
                    NULL,
                    NULL,
                    FALSE,
                    IDLE_PRIORITY_CLASS | CREATE_NEW_CONSOLE,
                    NULL,
                    "C:\\pfad\\",
                    &si,
                    &pi);
    

    Mit Programmende möchte ich auch den Prozess wieder schließen. Deshalb habe ich das hier gemacht:

    TerminateProcess(pi.hProcess, 0);
    

    Das externe Programm muss allerdings noch ein paar Aufräumarbeiten ausführen. TerminateProcess scheint aber quasi ein "Linux kill -9" auszuführen und der Prozess wird so schnell platt gemacht, dass keine Zeit mehr zum sauberen Aufräumen bleibt.

    Was kann ich tun, damit die Anwendung etwas softer gekillt wird (also ein TERM-Signal statt KILL-Signal)??



  • Hi !
    Killing me softly ?

    Try, CloseHandle(pi.hProcess)

    Gruß, J.



  • Das war ein Satz mit "x"...denn hätte ich zwei Zeilen weiter gelesen (MSDN):

    ...Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread....

    Also doch die hard, Terminator-like.

    MfG J.



  • Kannst du die externe Anwendung umschreiben? Ansonsten kann man da wohl nichts machen.



  • ExitProcess?



  • Hat das externe Programm geladene *.dll Dateien ?



  • Natürlich. Jedes Programm lädt DLLs!



  • Auszug aus MSDN:

    ...Terminating a process does not cause child processes to be terminated...
    ..... A process object is deleted when the last handle to the process is closed .....

    Wenn Du also ale childs und handles erwischen kannst, dann sollte das doch ok sein, oder ?



  • deleted



  • ExitProcess wollte ich auch schon probieren, aber damit kann sich ein Prozess ja leider nur selbst beenden.

    Ich hab's jetzt einfach so gemacht: via SendInput ein Ctrl-C an die DOS-Box. Das Problem ist ja auch, dass mit einem Schließen des Terminals die Anwendung kein Signal bekommt.
    Funktioniert auf jeden Fall prima.

    cu + Danke


Anmelden zum Antworten