2009-07-17 4 views
4

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.

Répondre

2

Vista utilise des objets de travail pour lancer des liens. Par conséquent, le processus que vous essayez d'affecter à un autre objet de travail peut déjà être affecté.

Voir: this question

+0

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

+0

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

1

Pourquoi ne pas exécuter le fichier cible au lieu de Openning Uninstall.lnk? Vous pouvez utiliser IShellLink pour obtenir une cible de raccourci. Ensuite, vous serez en mesure d'exécuter le fichier cible via ShellExecuteEx en utilisant le drapeau SEE_MASK_NOCLOSEPROCESS.

+0

Si le processus cible engendre un autre processus (comme msiexec.exe) et meurt, cela n'aidera pas. – Paul

+0

Ensuite, vous devriez exécuter 'msiexec.exe' ou même mieux pour utiliser l'API du programme d'installation. –

+0

Je suis désolé pour l'imprécision; Je lance également d'autres types de fichiers, pas seulement des fichiers .lnk. Je lance aussi des fichiers ordinaires .exe ainsi que des applications ClickOnce (fichiers .application). –

Questions connexes