【发布时间】:2018-10-10 17:34:47
【问题描述】:
我从我的 app.exe 调用 QtIFW 的 maintenancetool.exe 来检查这样的更新:
QString command = QString( "\"C:/Program Files/My Application/maintenancetool.exe\" --checkupdates" );
QProcess process;
process.start( command );
process.waitForFinished();
if ( process.error() != QProcess::UnknownError )
{
return;
}
QByteArray data = process.readAllStandardOutput();
如果我运行我的应用程序,它会在调用maintenancetool.exe --checkupdates 时显示管理权限对话框,就像任何其他需要权限的应用程序一样,我同意接受。然后,我的应用程序挂了一段时间,最后 process.error() 返回了一个QProcess::Timedout 错误。
如果我以管理权限运行我的应用程序一切正常。
有没有办法使用QProcess::start 从另一个不需要管理权限的 exe 中运行需要管理权限的 exe?当然,我试图避免用户在每次运行 myapp.exe 时都打开管理权限对话框(仅在它查找更新时)。
我不能使用QProcess::startDeattached,因为我必须检索输出。
注意:如果 myapp.exe 和 maintenancetool.exe 未安装在 Program Files 中,而是安装在任何其他常规文件夹(例如 C:/myfolder)中,则一切正常。
编辑
我发现问题是当 myapp.exe 调用 maintenancetool.exe 并请求管理权限时,maintenancetool.exe 需要很长时间才能完成(33 秒)。
有趣的是默认等待时间是 30 秒
bool waitForFinished(int msecs = 30000);
所以,如果我这样称呼它,它可以工作,但我必须等待 33 秒!
process.waitForFinished( 60000 );
【问题讨论】:
-
很高兴听到您的问题已解决。考虑添加该解决方案作为对您问题的自我回答。
-
你应该检查
QProcess::waitForFinished()的返回值。看来您正在使用在线安装程序,对吗?对于管理员权限问题,您可以使用管理员权限安装您的应用程序。那将在安装程序的配置文件中。你可能想看看这个:github.com/Skycoder42/QtAutoUpdater.