получить информацию обо всех запущенных процессах, используя QProcess - PullRequest
7 голосов
/ 13 апреля 2010

Несколько дней назад я спросил о том, как получить все запущенные процессы в системе, используя QProcess. я нашел командную строку, которая может выводить все процессы в файл:

C: \ WINDOWS \ system32 \ wbem \ wmic.exe "/OUTPUT:C:\ProcessList.txt PROCESS get Caption

это создаст файл C: \ ProcessList.txt, содержащий все запущенные процессы в системе. Интересно, как я могу запустить его с помощью QProcess и передать его вывод в переменную.

кажется, что каждый раз, когда я пытаюсь запустить его и читать ничего не происходит:

QString program = "C:\\WINDOWS\\system32\\wbem\\wmic.exe";
QStringList arguments;
arguments << "/OUTPUT:C:\\ProcessList.txt" <<"PROCESS"<< "get"<< "Caption";

process->setStandardOutputFile("process.txt");
process->start(program,arguments);

QByteArray result = process->readAll();

Я предпочитаю вообще не создавать process.txt и переносить весь вывод в переменную ...

Ответы [ 2 ]

7 голосов
/ 14 апреля 2010

Вы можете запустить wmic.exe с ключом "/ OUTPUT: STDOUT", чтобы напечатать информацию о процессе непосредственно на стандартный вывод. Однако я не смог прочитать эту информацию через QProcess API и сохранить ее в переменной. Вот код, который я использовал:

#include <QtCore/QCoreApplication>
#include <QProcess>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QProcess process;
    process.setReadChannel(QProcess::StandardOutput);
    process.setReadChannelMode(QProcess::MergedChannels);
//    process.start("cmd.exe /C echo test");
    process.start("wmic.exe /OUTPUT:STDOUT PROCESS get Caption");

    process.waitForStarted(1000);
    process.waitForFinished(1000);

    QByteArray list = process.readAll();
    qDebug() << "Read" << list.length() << "bytes";
    qDebug() << list;
}

Этот код успешно фиксирует вывод «cmd.exe / C echo test», но не работает на wmic.exe. Кажется, что процесс wmic.exe никогда не завершается, и я предполагаю, что его стандартный вывод никогда не сбрасывается, поэтому вы не получаете ничего через QProcess :: readAll ().

Это все, что я могу вам помочь. Возможно, вы или какой-либо другой пользователь SO обнаружите ошибку в приведенном выше фрагменте кода.

2 голосов
/ 08 ноября 2010

Попробуйте, это будет хорошо работать.

process.start("cmd", QStringList() << "/C" << "echo" << "process" << "get" << "caption" << "|" << "wmic");
...