运行有效命令时,QProcess始终返回-2

时间:2014-08-23 00:14:15

标签: c++ qt qprocess

我正在用qt编写一个程序,它将在windows中执行命令。

这是我用来尝试让命令工作的方法。

bool FirmwareUpdater::RunCommand( QString& command, QStringList& args, int expectedCode )
{
    QProcess *proc = new QProcess();
    proc->setWorkingDirectory ( "C:\\windows\\" );
    int exitCode = proc->execute(command, args );
    proc->waitForFinished();
    this->stream << command << " " << exitCode << "\n";
    return ( exitCode == expectedCode );
}

如果我跑

QString command = "ping";
QStringList args;

args << "localhost";
RunCommand( command, args );

工作正常,返回0;

但是,如果我尝试任何其他Windows实用程序,它返回-2。现在我试图让pnpUtil也工作。

QString command = qgetenv( "WINDIR" ) + "\\System32\\PnPUtil.exe";
QStringList args;

args << "-a";
args << updateDriver;

我有代码打印带有参数的命令给我,如果我手动运行命令它可以工作。但在qt中却没有。

也许我做错了什么。没有QProcess,有没有其他方法可以做到这一点?

我也试过调用静态meathod

QProcess::startDetached

但那也失败了。

1 个答案:

答案 0 :(得分:4)

我相信你的程序是32位并且在64位Windows下运行。当您运行32位程序时,PnPUtil.exe不在c:\windows\system32,这就是QProcess无法启动它的原因。它位于其他地方,例如,我的位于C:\Windows\WinSxS\amd64_microsoft-windows-pnputil_31bf3856ad364e35_6.3.9600.16384_none_ee22229c907e8ce2。您可以在命令提示符中运行c:\windows\system32\PnPUtil.exe,因为cmd.exe是64位程序。

您可以尝试解决方案herehere

更新1

在32位或64位Windows下运行PnPUtil和Ping的示例代码。

#include <QtCore>

void run( QString command, QStringList args )
{
    QProcess *proc = new QProcess();
    //proc->setWorkingDirectory ( "C:\\windows\\" );
    qDebug() << "\n===========================================";
    qDebug() << "Running " << command << args.join(' ');
    qDebug() << (QFile::exists(command) ? "File exists: " : "File may not exist:") << command;
    int exitCode = proc->execute(command, args );
    proc->waitForFinished();
    qDebug() << "\nResult";
    qDebug() << "======";
    qDebug() << "proc->execute()    =" << exitCode;
    qDebug() << "proc->exitCode()   =" << proc->exitCode();
    qDebug() << "proc->exitStatus() =" << proc->exitStatus();    
}

int main(int argc, char *argv[])
{
    QStringList pnpUtilArg("-?");
    QStringList pingArg("google.com");

    run( qgetenv( "WINDIR" ) + "\\sysnative\\pnputil.exe", pnpUtilArg);
    run( qgetenv( "WINDIR" ) + "\\system32\\pnputil.exe", pnpUtilArg);
    run( qgetenv( "WINDIR" ) + "\\system32\\ping.exe", pingArg);
    run( "ping.exe", pingArg);

    getchar();
}