WaitForSingleObject - Prozessende
-
Hallo,
ich würde gerne mit der Funktion WaitForSingleObject auf das Schließen eines Prozesses warten bzw eines Programmes.
Wie/womit mache ich das?
Mit OpenProzess oder womit geht das?MfG TheCaleb
-
Ja, OpenProcess() kannst du ein Handle eines bestehenden Prozesses bekommen (vorausgesetzt, du kennst seine Prozess-ID) - und diesen Handle kannst du dann an WaitForSingleObject() übergeben, um auf das Prozessende zu warten.
(nach der Prozess-ID müsstest du das Zielprogramm vermutlich fragen)
PS: Wenn du das Programm selber starten willst, kannst du dazu auch ShellExecuteEx() verwenden, das liefert dir auf Wunsch auch ein Handle auf das gerade geöffnete Programm zurück.
-
Vielen Dank schonmal aber könntest du mir bitte erklären, was ich alles in die SHELLEXECUTEINFO eintragen muss, um das Programm normal zu starten und die ID zu bekommen?
Bzw was muss ich bei dem OpenProcess dann noch angeben, ausser die ID?
Nen Bsp wäre sehr hilfreich!MfG TheCaleb
-
typedef struct _SHELLEXECUTEINFO{ DWORD cbSize; // Größe der struct - sizeof(SHELLEXECUTEINFO) ULONG fMask; // Flags - du brauchst zumindest SEE_MASK_NOCLOESEPROCESS HWND hwnd; // Window Handle - vermutlich entweder dein eigenes oder NULL LPCTSTR lpVerb; // erwartete Aktion - "open" oder NULL LPCTSTR lpFile; // Name des Zielprogramms LPCTSTR lpParameters; // Parameter für das Zielprogramm LPCTSTR lpDirectory; // Arbeitsverzeichnis int nShow; // Show Flags für Zielprogramm - entweder SW_SHOW oder SW_HIDE HINSTANCE hInstApp; // hier meldet die Funktion mögliche Fehler zurück // Optional members LPVOID lpIDList; LPCSTR lpClass; HKEY hkeyClass; DWORD dwHotKey; HANDLE hIcon; HANDLE hProcess; // und das ist dein Process-Handle } SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;(die übrigen Member kannst du ignorieren)
-
Vielen Dank, kannste mir vlt noch einen Tipp geben?!
Wie kann ich ne Liste mit HANDLE machen?
Also gibt es da ne spezielle Liste, bzw wie kann ich sie nach der Deklaration beliebig vergrößern??
-
Nimm doch einen std::vector<> (oder eine andere Containerklasse - alternativ hat auch die MFC ein paar zur Auswahl), wo du alle Handles reinpacken kannst.
PS: Nur aus Neugierde: wie sieht eigentlich dein Gesamtplan aus?
-
Ich habe vor ein Programm zu schreiben, welches einen Prozess startet und überwacht.
Son Mist, das mit den Vectoren ist schon ne Weile her, kannste vlt noch Tipps geben??

-
Wenn du nur einen Prozess überwachen willst, wozu brauchst du dann die Liste?
Zu vector<> empfehle ich einen Blick in meinen Artikel "Aufbau der STL" oder auf www.cppreference.com
-
Und vielen Dank, das soll ja ein dyn Programm sein, also auch für mehr als nur einen Prozess!
-
Also ich bin nun soweit, dass ich der OpenProzess Funktion die ID übergeben möchte, du hast ja geschrieben, dass ich den Handle nehmen soll, doch wie genau muss ich das dann anwednen?!
-
Erstmal brauchst du das nur, um ein Handle zu einem bereits existierenden Prozess zu besorgen (z.B. weil jemand anderes den Prozess angelegt hat). Und dann benötigst du die ID des PRozesses (und ich bin mir nicht sicher, wie du die bekommen kannst). Wenn du alles zusammenhast, kannst du mit
h = OpenProcess( SYNCHRONIZE,//je nach Bedarf kannst du noch weitere Flags setzen FALSE, theID);das zugehörige Handle besorgen.