QProcess::startDetached被UAC阻塞(运行更新程序)

6

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

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

在XP上这个工作正常 - 但在Vista和Win7上,一旦下载完成就什么也不会发生。如果我浏览到已下载的更新并手动运行它,则可以正常工作。我认为发生的情况是UAC在CreateProcess时阻止了安装程序,但这就是我的知识枯竭的地方。
额外的复杂性 - 当我从命令行运行调试版本时,上述步骤有效 - 我得到了UAC提示并可以运行安装程序。启动菜单/快捷方式中的发布版本存在问题 - 我认为在从命令行运行时存在授权令牌的差异。
4个回答

7
您可以使用以下方法:

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

可能让人感到惊讶和违反直觉,但它是可行的并更具跨平台性。

很棒的解决方案。它实际上在后台调用了ShellExecute。我看到的唯一问题是它没有将UAC窗口置于顶部。 - Daniel Georgiev

3

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


2

这似乎是Qt的一个bug,详见QTBUG-9761,正确的解决方法是使用ShellExecute并将lpOperation设置为runas


使用runas动词将_强制_进行UAC提升,如果您没有指定动词,ShellExecute将自行解决... - Anders

1
另一种选择是在执行前加上cmd.exe /C。这样可以通过shell路由执行,因此您会得到UAC提示。缺点是,如果进程失败,您可能无法获得与ShellExecute[Ex]相同的信息,但优点是,您将获得所有QProcess的功能,如果使用QDesktopServices::openUrl,您不知道事情是否成功。请保留HTML标记。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接