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

问题描述 投票:6回答:4

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

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

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

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

qt process uac
4个回答
3
投票

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


7
投票

你也可以使用

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

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


2
投票

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


1
投票

另一种方法是使用cmd.exe /C预先执行。这有效地通过shell路由您的执行,因此您可以获得UAC提示。缺点是,如果你的过程失败,你可能不会得到尽可能多的信息,你通过ShellExecute[Ex],但在正面,你会得到你错过的QProcess的所有设施,如果你使用QDesktopServices::openUrl,你不知道是否事情有效与否。

© www.soinside.com 2019 - 2024. All rights reserved.