我从我的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 );
答案 0 :(得分:0)
(代表问题作者发布了解决方案)。
Qt的maintenancetool.exe似乎根本不要求管理员特权,这是针对3.0.2(我使用的版本)报告的错误,并且已在3.0.4中修复。