QProcess :: startDetached заблокирован UAC (работает апдейтер) - PullRequest
6 голосов
/ 24 декабря 2010

В моем приложении есть функция обновления - она ​​загружает и проверяет установщик (setup.exe, созданный с помощью NSIS). Чтобы действительно запустить обновление, я просто делал:

QString path = .. absolute path to the downloaded file ...
QProcess::startDetached(path, QStringList());

Это нормально работает на XP - но на Vista и Win7 ничего не происходит после завершения загрузки. Если я просматриваю загруженное обновление и запускаю его вручную, оно работает нормально. Я предполагаю, что происходит то, что UAC блокирует установщик во время CreateProcess, но на этом мои знания заканчиваются.

Дополнительные сложности - когда я запускаю отладочную сборку из командной строки, описанные выше шаги работают - я получаю приглашение UAC и могу запустить установщик. Это релизные сборки, запускаемые из меню / ярлыка «Пуск», в которых есть проблема - я предполагаю, что есть разница в токене аутентификации при запуске из командной оболочки.

Ответы [ 4 ]

7 голосов
/ 07 ноября 2012

Вы также можете использовать

QDesktopServices::openUrl(QUrl::fromLocalFile(path));

Может показаться удивительным и нелогичным, но работает и более кроссплатформенно

3 голосов
/ 26 декабря 2010

Если вы не являетесь администратором и вызываете CreateProcess () для .exe с манифестом «Vista» (или без манифеста, но с .exe, который Windows обнаруживает в качестве установщика (включая NSIS)), вызов завершится неудачно, вынужно использовать ShellExecute[Ex]().ShellExecute вызовет запрос UAC, если требуется ...

2 голосов
/ 26 декабря 2010

Это похоже на ошибку Qt, см. QTBUG-9761 , правильный обходной путь - использовать ShellExecute с lpOperation, установленным на runas.

1 голос
/ 16 апреля 2019

Другой альтернативой является предварительное выполнение с cmd.exe /C.Это эффективно направляет ваше выполнение через оболочку, поэтому вы получите приглашение UAC.Недостатком является то, что если ваш процесс завершится неудачно, вы, вероятно, не получите столько информации, сколько прошли через ShellExecute[Ex], но, с другой стороны, вы получите все возможности QProcess, которые вам не хватает, если вы используете QDesktopServices::openUrl,где вы понятия не имеете, сработало или нет.

...