【发布时间】:2019-10-23 12:20:54
【问题描述】:
我需要在我的应用程序中运行自定义可执行文件。我有以下代码来运行我的进程:
QFileInfo fiUpdator(updatorLocation);
if(!fiUpdator.isExecutable()) {
qWarning() << "Maintenance Tool is not an executable";
return;
}
qDebug() << "Starting updator app";
QString pid = QString::number(qApp->applicationPid());
QString appName = qApp->applicationName();
QProcess *p = new QProcess;
connect(p, &QProcess::started, this, [this](){
qDebug() << "Updator Process Started";
});
connect(p, &QProcess::errorOccurred, this, [this](QProcess::ProcessError error){
qDebug() << "Error Occurred : " << error;
});
connect(p, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this, p](){
qDebug() << "Finished Updator Process";
QString str("Exit [" + QString::number(p->exitCode()) + "] " + p->exitStatus());
qDebug() << str;
});
connect(p, &QProcess::readyReadStandardError, this, [this, p](){
QByteArray ba = p->readAllStandardError();
qDebug() << "Error:\n" << QString::fromUtf8(ba);
});
connect(p, &QProcess::readyReadStandardOutput, this, [this, p](){
QByteArray ba = p->readAllStandardOutput();
qDebug() << "Output:\n" << QString::fromUtf8(ba);
});
connect(p, &QProcess::stateChanged, this, [this](QProcess::ProcessState newState){
qDebug() << "State Changed : " << newState;
});
p->start(
updatorLocation,
QStringList()
<< pid
<< appName
<< newFilePath
<< oldFilePath);
应用程序(一个 qt 控制台应用程序)按预期运行,使用
start "" "C:\Path\To\AwesomeConsoleApp.exe"
它会短暂打开一个带有编码输出的新 CMD 窗口,或者打开 cmd.exe 并运行
C:\Path\To\AwesomeConsoleApp.exe
在同一 cmd 窗口中将输出显示到 stdout。
进程信号触发如下:
stateChanged StartingstateChanged RunningQProcess::startedstateChanged NotRunning-
QProcess::finished:输出Exit[1] 0
我尝试用C:\Windows\System32\calc.exe 替换.exe 来启动,它启动时没有问题。
这是否意味着我的自定义可执行文件有问题?
【问题讨论】:
-
QProcess::ExitStatus 0 表示进程正常退出。可能是可执行文件对带有退出代码 1 的参数做出反应。尝试打印所有参数并手动运行它们。
-
@uni 已解决,请参阅发布的答案。