2009-07-17 6 views
4

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.

Antwort

2

Vista verwendet Job-Objekte zum Starten von Links. Daher könnte der Prozess, den Sie einem anderen Jobobjekt zuweisen möchten, bereits vergeben sein.

See: this question

+0

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. : -/ –

+0

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

1

Warum nicht Zieldatei statt openning Uninstall.lnk auszuführen? Sie können IShellLink verwenden, um Verknüpfungsziel zu erhalten. Dann können Sie die Zieldatei über ShellExecuteEx mit dem Flag SEE_MASK_NOCLOSEPROCESS ausführen.

+0

Wenn Zielprozess einen anderen Prozess (wie msiexec.exe) hervorbringt und stirbt, wird dies nicht helfen. – Paul

+0

Dann sollten Sie 'msiexec.exe' ausführen oder noch besser Installer-API verwenden. –

+0

Es tut mir leid für die Ungenauigkeit; Ich starte auch andere Arten von Dateien, nicht nur LNK-Dateien. Ich starte auch gewöhnliche .exe-Dateien sowie ClickOnce-Anwendungen (.application-Dateien). –