我正在用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的情况下,还有其他方法吗?我也尝试调用静态方法
QProcess::startDetached
我相信你的程序是32位的,在64位的Windows下运行。当您运行32位程序时,PnPUtil.exe
不在c:windowssystem32
中,这就是QProcess
无法启动的原因。它在别的地方,例如,我的位于C:WindowsWinSxSamd64_microsoft-windows-pnputil_31bf3856ad364e35_6.3.9600.16384_none_ee22229c907e8ce2
。因为cmd.exe
是64位程序,所以可以在命令提示符中运行c:windowssystem32PnPUtil.exe
。
你可以在这里或这里尝试解决方案。
更新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();
}