Wie bekommt man eine Exit Meldung für ein laufendes Program?



  • Hallo,

    ich will sehen, wenn ein Program geschlossen wird ohne dabei FindWindow zu verwenden.
    Mir CreateProcess kann ich ein Program starten und bekomme eine PROCESS_INFORMATION struktur, welche ich dann später nach dem Exit Code abfragen
    kann (pollen).
    Wie bekomme ich diese Struktur von einem bereits laufenden Programm, das nicht mit CreateProcess gestartet wurde.
    Bis jetzt habe ich den CWnd* (Findwindow) und die HINSTANCE (PSAPI) von diesem Program.
    Aber wie komme ich an die passende PROCESS_INFORMATION für meinen ExitCode?

    Grüße
    thenoname



  • Um ein Prozess-Handle zu bekommen brauchst Du die ProzessId, welcher Du z.B. mittels GetWindowThreadProcessId bekommen kannst.

    Warte mittels WaitForSingleObject auf das Prozess-Handle. Liefert dies "WAIT_OBJECT_0" zurück, so wurde der Prozess beendet und Du kannst den Exit-Code abfragen.



  • Hallo,

    ich habe es so gemacht wie du gesagt hast.
    Dass das Process Handle funktioniert, sehe ich mit einem GetModuleBaseName
    wo ich den Namen der EXE sehe.
    Nun mache ich ein

    result=WaitForSingleObject(processhandle,100);
    

    Aber es kommt immer ein "WAIT_FAILED" zurück.

    Warum?



  • Was sagt GetLastError()?
    Vielleicht hat das Handle nicht die nötigen Rechte?

    MSDN, OpenProcess schrieb:

    The handle returned by the OpenProcess function can be used in any function that requires a handle to a process, such as the wait functions, provided the appropriate access rights were requested.

    Für WaitForSingleObject müsstest du auf jeden Fall SYNCHRONIZE anfordern, für GetExitCodeProcess noch PROCESS_QUERY_INFORMATION.
    Wenn du Admin-Rechte hast kannst du natürlich PROCESS_ALL_ACCESS versuchen.

    Also...

    HANDLE h = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, false, processID);
    


  • Für WaitForSingleObject müsstest du auf jeden Fall SYNCHRONIZE anfordern

    Danke, das wars ...


Anmelden zum Antworten