Ich verwende die ShellExecuteEx
-Funktion in einem C++ - Programm, um eine Uninstall.lnk-Datei zu starten. In meinem Programm möchte ich warten, bis das Deinstallationsprogramm beendet ist. Mein erster Versuch war, das SEE_MASK_NOCLOSEPROCESS
Flag in der SHELLEXECUTEINFO
Struktur und dann WaitForSingleObject
auf dem hProcess
Griff in der SHELLEXECUTEINFO
Struktur übergeben an ShellExecuteEx
übergeben, aber das schien noch viel zu früh zurück.Warten auf ShellExecuteEx (Festlegen von Zugriffsrechten auf Windows-Prozess)
Mein aktueller Verdacht ist, dass dies daran liegt, dass der von ShellExecuteEx gestartete Prozess (startet es eine neue Shell?) Neue untergeordnete Prozesse erstellt, aber nicht auf sie wartet. Also versuche ich eine "warten auf meinen Kindprozess und alle Kinder, die es startet" -Funktion zu erstellen. Um dies zu tun, versuche ich, Job-Objekte zu verwenden.
Ich erstellte ein Jobobjekt mit CreateJobObject
, wies den Prozesshandle, der von ShellExecuteEx
zurückgegeben wurde, dem Job zu und versuchte dann, auf das Jobobjekt zu warten. Leider ist die Zuordnung des Prozesses zum Job fehlgeschlagen, und ich denke, dass dies auf unzureichende Zugriffsrechte zurückzuführen ist.
Weiß jemand, wie die PROCESS_SET_QUOTA und PROCESS_TERMINATE Zugriffsrechte zu setzen (die für AssignProcessToJobObject
erforderlich sind, um erfolgreich zu sein, nach dem MSDN) auf einem Prozess handelt, oder eine andere Art und Weise für den Prozess von ShellExecuteEx ins Leben gerufen, zu warten bis zum Ende?
UPDATE: Ich sollte darauf hinweisen, dass ich auch andere Anwendungen starten, nicht nur Uninstall.lnk
. Einer von ihnen ist z.B. eine ClickOnce Anwendung, die effektiv eine einfache XML-Datei mit der Dateierweiterung .application
ist.
Guter Punkt. In der Tat scheint es manchmal so, als wäre der gestartete Prozess bereits Teil eines Jobobjekts (abhängig von der Art der Datei, die ich über 'ShellExecuteEx 'starte). Leider ist es nicht möglich, diese Verbindung zu brechen. : -/ –
Guter Punkt. Einer der Gründe für die Verwendung von ShellExecuteEx ist die Übergabe einer ganzen Reihe von Verantwortlichkeiten an die Shell. Wenn Sie eine präzisere Kontrolle wünschen, z. B. Jobsteuerung, verwenden Sie CreateProcess. – MSalters