由UAC阻止的QProcess :: startDetached(运行更新程序)

时间:2010-12-24 14:16:35

标签: qt process uac

我的应用程序中有更新功能 - 它会下载并验证安装程序(使用NSIS创建的setup.exe)。为了实际启动更新,我一直在做:

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

这在XP上运行良好 - 但在Vista和Win7上,下载完成后没有任何反应。如果我浏览到下载的更新并手动运行它,它可以正常工作。我假设发生的事情是UAC在CreateProcess时阻塞了安装程序,但这是我的知识耗尽的地方。

额外的复杂性 - 当我从命令行运行调试版本时,上面的步骤工作 - 我得到UAC提示并可以运行安装程序。这是发布版本,从开始菜单/快捷方式开始,有问题 - 我假设从命令shell运行时auth令牌有所不同。

4 个答案:

答案 0 :(得分:7)

您也可以使用

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

可能会令人惊讶且违反直觉,但它有效并且更具跨平台性

答案 1 :(得分:3)

如果你不是管理员,你在带有“Vista”清单的.exe上调用CreateProcess()(或者没有清单,但Windows检测为安装程序(包括NSIS)的.exe)调用失败,你需要使用ShellExecute[Ex]()。如果需要,ShellExecute将触发UAC提示......

答案 2 :(得分:2)

这似乎是一个Qt错误,请参阅QTBUG-9761,正确的解决方法是在ShellExecute设置为lpOperation的情况下使用runas

答案 3 :(得分:1)

另一种选择是在执行之前加上cmd.exe /C。这样可以有效地通过外壳路由您的执行,因此您会收到UAC提示。不利的一面是,如果您的流程失败了,您经过ShellExecute[Ex]可能不会得到太多的信息,但是从好的方面来说,您将获得QProcess所缺少的所有便利,如果您使用QDesktopServices::openUrl,您不知道事情是否有效。