Я использую функцию 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
.