我的应用程序中有更新功能 - 它会下载并验证安装程序(使用NSIS创建的setup.exe)。为了实际启动更新,我一直在做:
QString path = .. absolute path to the downloaded file ...
QProcess::startDetached(path, QStringList());
这在XP上运行良好 - 但在Vista和Win7上,下载完成后没有任何反应。如果我浏览到下载的更新并手动运行它,它可以正常工作。我假设发生的事情是UAC在CreateProcess时阻塞了安装程序,但这是我的知识耗尽的地方。
额外的复杂性 - 当我从命令行运行调试版本时,上面的步骤工作 - 我得到UAC提示并可以运行安装程序。这是发布版本,从开始菜单/快捷方式开始,有问题 - 我假设从命令shell运行时auth令牌有所不同。
答案 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
,您不知道事情是否有效。