2013-12-26 5 views
2

Я должен проверить, является ли служба RUNNING. У меня проблема с выполнением запроса QProcess, когда дело доходит до выполнения следующего запроса: SC QUERY "service name" | findstr RUNNING, хотя это отлично работает при выполнении непосредственно в командной строке в Windows. Код snipet здесь следующим образом:Запрос с QProcess

QProcess process; 
    process.setProcessChannelMode(QProcess::ForwardedChannels); 
    process.start("SC QUERY \"Service_name\" | findstr RUNNING", QIODevice::ReadWrite); 


    // Wait for it to start 
    if(!process.waitForStarted()) 
     return 0; 

    QByteArray buffer; 
    while(process.waitForFinished()) 
     buffer.append(process.readAll()); 
    qDebug() << buffer.data(); 

Выход: enter image description here

Можете ли вы мне помочь?

+0

Какая проблема? Вы проверили stdout/err с объектом, а также с errorString()? Также покажите свой код! – lpapp

+0

Он не выполняет его, а ссылается на команду help – elgolondrino

+0

Пожалуйста, покажите свой код, как вы его пытаетесь использовать. Вы уверены, что правильно его используете? Какой Qt вы используете, на всякий случай и т. Д.? Проверьте это: http://doc-snapshot.qt-project.org/qdoc/qprocess.html#setStandardOutputProcess – lpapp

ответ

2

Это происходит потому, что с помощью этих трех строк не даст вам ожидаемые результаты:

QProcess process; 
process.setProcessChannelMode(QProcess::ForwardedChannels); 
process.start("SC QUERY \"Service_name\" | findstr RUNNING", QIODevice::ReadWrite); 

Основываясь на official documentation, QProcess должен работать для pipe'd команд:

void QProcess::setStandardOutputProcess(QProcess * destination)

Pipes the standard output stream of this process to the destination process' standard input.

В другими словами, команда командного командования command1 | command2 может быть достигнута следующим образом:

QProcess process1; 
QProcess process2; 

process1.setStandardOutputProcess(&process2); 

process1.start("SC QUERY \"Service_name\""); 
process2.start("findstr RUNNING"); 
process2.setProcessChannelMode(QProcess::ForwardedChannels); 

// Wait for it to start 
if(!process1.waitForStarted()) 
    return 0; 

bool retval = false; 
QByteArray buffer; 
while ((retval = process2.waitForFinished())); 
    buffer.append(process2.readAll()); 

if (!retval) { 
    qDebug() << "Process 2 error:" << process2.errorString(); 
    return 1; 
} 

qDebug() << "Buffer data" << buffer; 
+0

Благодарим вас за ответ Ласло, но нет выхода? – elgolondrino

+0

@elgolondrino: вы получаете выход в консоли? Вы проверили errorString(), если есть какие-либо ошибки? – lpapp

+0

Нет вывода ошибки только пустым буфером (QByteArray) – elgolondrino

Смежные вопросы