我的应用程序中有一个更新功能 - 它下载并验证安装程序(使用NSIS创建的setup.exe).要实际启动更新,我只是在做:
QString path = .. absolute path to the downloaded file ...
QProcess::startDetached(path, QStringList());
Run Code Online (Sandbox Code Playgroud)
这在XP上运行良好 - 但在Vista和Win7上,下载完成后没有任何反应.如果我浏览到下载的更新并手动运行它,它可以正常工作.我假设发生的事情是UAC在CreateProcess时阻塞了安装程序,但这是我的知识耗尽的地方.
额外的复杂性 - 当我从命令行运行调试版本时,上面的步骤工作 - 我得到UAC提示并可以运行安装程序.这是发布版本,从开始菜单/快捷方式开始,有问题 - 我假设从命令shell运行时auth令牌有所不同.
小智 7
你也可以使用
QDesktopServices::openUrl(QUrl::fromLocalFile(path));
Run Code Online (Sandbox Code Playgroud)
可能会令人惊讶且违反直觉,但它可以工作并且更具跨平台性
如果您不是管理员,并且您在具有“Vista”清单(或没有清单,但 Windows 检测为安装程序(包括 NSIS)的 .exe)的 .exe 上调用 CreateProcess() ,则调用失败,您需要使用ShellExecute[Ex]()。如果需要,ShellExecute 将触发 UAC 提示...