Ожидание ShellExecuteEx (Настройка прав доступа для процесса Windows) - PullRequest
4 голосов
/ 17 июля 2009

Я использую функцию ShellExecuteEx в программе на C ++ для запуска файла Uninstall.lnk. В моей программе я хотел бы дождаться окончания удаления. Моя первая попытка состояла в том, чтобы установить флаг SEE_MASK_NOCLOSEPROCESS в структуре SHELLEXECUTEINFO, а затем вызвать WaitForSingleObject для дескриптора hProcess, доступного в структуре SHELLEXECUTEINFO, переданной в ShellExecuteEx, но это все равно, похоже, тоже возвращалось рано.

В настоящее время я подозреваю, что это потому, что процесс, запущенный ShellExecuteEx (запускает ли он новую оболочку?), Создает новые дочерние процессы, но не ждет их. Поэтому я пытаюсь создать функцию «дождаться моего дочернего процесса и всех дочерних процессов, которые он запускает». Для этого я пытаюсь использовать объекты заданий.

Я создал объект задания, используя CreateJobObject, назначил дескриптор процесса, возвращенный ShellExecuteEx, заданию, а затем попытался дождаться объекта задания. К сожалению, назначение процесса заданию не удалось, и я думаю, что это связано с недостаточными правами доступа.

Кто-нибудь знает, как установить права доступа PROCESS_SET_QUOTA и PROCESS_TERMINATE (которые необходимы для успешного выполнения AssignProcessToJobObject, в соответствии с MSDN) для дескриптора процесса или другой способ ожидания завершения процесса, запущенного ShellExecuteEx?

ОБНОВЛЕНИЕ: Я должен отметить, что я также запускаю другие приложения, а не только Uninstall.lnk. Одним из них является, например, приложение ClickOnce , которое представляет собой простой XML-файл с расширением .application.

Ответы [ 2 ]

2 голосов
/ 17 июля 2009

Vista использует объекты задания для запуска ссылок. Поэтому процесс, который вы пытаетесь назначить другому объекту задания, может быть уже назначен.

См .: этот вопрос

1 голос
/ 17 июля 2009

Почему бы не выполнить целевой файл вместо открытия Uninstall.lnk? Вы можете использовать IShellLink, чтобы получить ярлык цели. Затем вы сможете выполнить целевой файл через ShellExecuteEx, используя флаг SEE_MASK_NOCLOSEPROCESS.

...