QProcess не выводит результат выполнения команды
В заголовочном файле прописано
const QString windowsCommandProgramm = "tasklist.exe";
const QString windowsCommandArgs = "/fo list";
Если выполнять через Win+R получится следующий ответ:
Имя образа: conhost.exe
PID: 11104
Имя сессии: Console
№ сеанса: 1
Память: 10 908 КБ
Состояние: Unknown
Пользователь: DESKTOP-88NIKGJ\BBCCA
Время ЦП: 0:00:00
Заголовок окна: Н/Д
Имя образа: gdborig.exe
PID: 5476
Имя сессии: Console
№ сеанса: 1
Память: 70 256 КБ
Состояние: Unknown
Пользователь: DESKTOP-88NIKGJ\BBCCA
Время ЦП: 0:00:01
Заголовок окна: Н/Д
Имя образа: SLauncher.exe
PID: 13228
Имя сессии: Console
№ сеанса: 1
Память: 1 676 КБ
Состояние: Running
Пользователь: DESKTOP-88NIKGJ\BBCCA
Время ЦП: 0:00:57
Заголовок окна: Н/Д
Имя образа: msedge.exe
PID: 9992
Имя сессии: Console
№ сеанса: 1
Память: 106 812 КБ
Состояние: Unknown
Пользователь: DESKTOP-88NIKGJ\BBCCA
Время ЦП: 0:00:14
Заголовок окна: Н/Д
Имя образа: msedge.exe
PID: 13704
Имя сессии: Console
№ сеанса: 1
Память: 87 364 КБ
Состояние: Unknown
Пользователь: DESKTOP-88NIKGJ\BBCCA
Время ЦП: 0:00:02
Заголовок окна: Н/Д
Имя образа: svchost.exe
PID: 4768
Имя сессии: Services
№ сеанса: 0
Память: 7 524 КБ
Состояние: Unknown
Пользователь: NT AUTHORITY\СИСТЕМА
Время ЦП: 0:00:00
Заголовок окна: Н/Д
Имя образа: tasklist.exe
PID: 6272
Имя сессии: Console
№ сеанса: 1
Память: 10 056 КБ
Состояние: Unknown
Пользователь: DESKTOP-88NIKGJ\BBCCA
Время ЦП: 0:00:00
Заголовок окна: Н/Д
Имя образа: WmiPrvSE.exe
PID: 14144
Имя сессии: Services
№ сеанса: 0
Память: 9 444 КБ
Состояние: Unknown
Пользователь: NT AUTHORITY\NETWORK SERVICE
Время ЦП: 0:00:00
Заголовок окна: Н/Д
Далее я прописал комманду:
QProcess process;
process.start(consoleCommandProgramm, QStringList() << consoleCommandArgs);
if( !process.waitForStarted() || !process.waitForFinished() ) {
return false;
}
qDebug() << QString::fromStdString(process.readAll().toStdString());
В выводе же:
17:25:28: Отладка запущена
""
17:31:23: Отладка завершена
Почему так происходит? И как вывести список процессов?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UPD: добавил текущий результат
bool checkProcesses(std::vector<std::string>* blackList){
std::string osName = QSysInfo::productType().toStdString();
QString consoleCommandProgramm = ((osName == "windows") || (osName == "winrt"))? windowsCommandProgramm : posixCommandProgramm;
QString consoleCommandArgs = ((osName == "windows") || (osName == "winrt"))? windowsCommandArgs : posixCommandArgs;
auto process = new QProcess();
process->start(consoleCommandProgramm, QStringList() << consoleCommandArgs);
// Qt5+
QObject::connect(process, &QProcess::readyReadStandardOutput, [&]() {
qDebug() << QString::fromStdString(process->readAll().toStdString());
});
return true;
}
Ответы (2 шт):
Автор решения: Alexander Chernin
→ Ссылка
Вариант 1: Процесс сразу возвращает результат и завершает свою работу (код расположен в одном методе):
QProcess process;
// Запускаем процесс
process.start("tasklist", QStringList() << "/FO" << "list");
// Ждем завершения его работы
process.waitForFinished();
// Получаем и выводим результат
qDebug() << process.readAllStandardOutput();
Вариант 2:
Использовать сигнал QProcess::readyReadStandardOutput, который срабатывает когда имеются данные в стандартном потоке вывода.
Объект процесса должен "жить" до получения результата работы (например, быть полем класса)
QProcess process;
process.start(consoleCommandProgramm, QStringList() << "/fo" << "list");
// Qt5+
// Основной вывод
connect(&process, &QProcess::readyReadStandardOutput, [&]() {
qDebug() << QString::fromStdString(process.readAll().toStdString());
});
// Ошибки
connect(&process, &QProcess::readyReadStandardError, [&]() {
qDebug() << process.readAllStandardError();
});
Автор решения: Fat-Zer
→ Ссылка
/fo и list — это два разных аргумента. Соответственно и передавать их надо отдельно:
process.start(consoleCommandProgramm, QStringList() << "/fo" << "list");