J'utilise la fonction ShellExecuteEx
dans un programme C++ pour lancer un fichier Uninstall.lnk. Dans mon programme, j'aimerais attendre la fin du programme de désinstallation. Ma première tentative a été de définir le drapeau SEE_MASK_NOCLOSEPROCESS
dans la structure SHELLEXECUTEINFO
puis d'appeler le WaitForSingleObject
sur la poignée hProcess
disponible dans la structure SHELLEXECUTEINFO
passée à ShellExecuteEx
, mais cela semblait toujours revenir trop tôt. Mon soupçon actuel est que c'est parce que le processus lancé par ShellExecuteEx (lance-t-il un nouveau shell?) Crée de nouveaux processus fils, mais ne les attend pas. J'essaie donc de créer une fonction «attendre mon enfant et tous les enfants qu'il lance». Pour ce faire, j'essaie d'utiliser des objets de travail.En attente de ShellExecuteEx (Définition des droits d'accès sur le processus Windows)
J'ai créé un objet de travail en utilisant CreateJobObject
, affecté le handle de processus renvoyé par ShellExecuteEx
au travail, puis j'ai tenté d'attendre l'objet du travail. Malheureusement, l'attribution du processus à la tâche a échoué, et je pense que cela est dû à des droits d'accès insuffisants. Est-ce que quelqu'un sait comment définir les droits d'accès PROCESS_SET_QUOTA et PROCESS_TERMINATE (qui sont requis pour AssignProcessToJobObject
pour réussir, selon le MSDN) sur un handle de processus, ou une autre façon d'attendre que le processus lancé par ShellExecuteEx se termine?
MISE À JOUR: Je dois préciser que je lance également d'autres applications, et pas seulement Uninstall.lnk
. L'un d'eux est par exemple une application ClickOnce, qui est effectivement un fichier XML simple avec l'extension de fichier .application
.
Bon point. En effet, il semble que parfois (en fonction du type de fichier lancé via ShellExecuteEx), le processus lancé fasse déjà partie d'un objet de travail. Malheureusement, il n'est pas possible de rompre cette association. : -/ –
Bon point. L'une des raisons d'utiliser ShellExecuteEx est de confier tout un tas de responsabilités à Shell. Si vous souhaitez un contrôle plus précis, tel que le contrôle du travail, utilisez CreateProcess. – MSalters