Я вызываю QtoFW maintenancetool.exe из моего app.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
.
Если я запускаю свое приложение с правами администратора, все идет нормально.
Есть лиспособ запустить exe-файл, требующий прав администратора, из другого exe-файла, который этого не использует, используя QProcess::start
?Конечно, я стараюсь не открывать пользователям диалоговое окно с правами администратора при каждом запуске myapp.exe (только при поиске обновлений).
Я не могу использовать QProcess::startDeattached
, так как мне нужно получитьвыходные данные.
ПРИМЕЧАНИЕ: все также работает нормально, если myapp.exe и maintenancetool.exe не установлены в Program Files, но находятся в любой другой обычной папке (например, C: / myfolder).
Редактировать
Я обнаружил, что проблема в том, что когда myapp.exe вызывает maintenancetool.exe и запрашиваются административные привилегии, обслуживаниеtotool.exe занимает слишком много времени (33 секунды).
Забавная частьвремя ожидания по умолчанию составляет 30 секунд
bool waitForFinished(int msecs = 30000);
Так что, если я назову это так, оно будет работать, но мне придется ждать 33 секунды!
process.waitForFinished( 60000 );