C++ 运行自定义可执行文件,QProcess立即退出,退出代码为1

C++ 运行自定义可执行文件,QProcess立即退出,退出代码为1,c++,qt,qprocess,C++,Qt,Qprocess,我需要在我的应用程序中运行自定义可执行文件。我有以下代码来运行我的进程: QFileInfo fiUpdator(updatorLocation); if(!fiUpdator.isExecutable()) { qWarning() << "Maintenance Tool is not an executable"; return; } qDebug() << "Starting updator app"; QString pid = QString

我需要在我的应用程序中运行自定义可执行文件。我有以下代码来运行我的进程:

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);
它会短暂打开一个带有编码输出的新CMD窗口,或者打开
CMD.exe
并运行

C:\Path\To\AwesomeConsoleApp.exe
在同一
cmd
窗口中显示输出到
stdout

过程信号如下所示:

  • stateChanged启动
  • stateChanged正在运行
  • QProcess::已启动
  • stateChanged NotRunning
  • QProcess::finished
    :输出
    退出[1]0
  • 我尝试将要启动的
    .exe
    替换为
    C:\Windows\System32\calc.exe
    ,它启动时没有问题

    这是否意味着我的自定义可执行文件有问题?

    考虑删除该问题,但如果可能有用,我将发布一个答案,这可能对将来的人有所帮助

    问题不在调用的应用程序代码或被调用的应用程序代码中(即
    MaintenanceTool
    ,如上所示)。相反,这是
    MaintenanceTool
    权限的问题

    因此,我的
    MaintenanceTool
    需要管理权限才能执行。我的呼叫应用程序不使用管理提供程序运行,但我的
    维护工具运行。为此,我使用来帮助启动
    MaintenanceTool
    应用程序

    注意:为了获得行政特权,我用它来激励我的工作

    我尝试了以下与
    QProcess
    的组合,注意,这些组合都不适用于以管理员身份运行应用程序

    QProcess::startDeteched("cmd.exe", QStringList() << "/C" << "/path/to/mtool.exe -arg1 -arg2");
    
    QProcess::startDeteched("cmd.exe", QStringList() << "/C" << "/path/to/mtool.exe -arg1 -arg2");
    
    QProcess::startDeteched("start.exe", QStringList() << "" << "/path/to/mtool.exe -arg1 -arg2");
    
    QProcess::startDeteched("C:\Windows\System32\cmd.exe", QStringList() << "/C" << "/path/to/mtool.exe -arg1 -arg2");
    
    QProcess::startDeteched("C:\Windows\System32\cmd.exe", QStringList() << "/C" << "/path/to/mtool.exe -arg1 -arg2");
    
    QProcess::startDeteched("/path/to/mtool.exe", QStringList() << "" << "-arg1" << "-arg2");
    

    QProcess::StartDetected(“cmd.exe”,QStringList()QProcess::ExitStatus 0表示进程正常退出。可能是可执行的,它正在对退出代码为1的参数作出反应。请尝试打印所有参数并手动运行可执行文件。@uni已解决此问题,请参阅发布的答案。
    
    QProcess::startDeteched("cmd.exe", QStringList() << "/C" << "/path/to/mtool.exe -arg1 -arg2");
    
    QProcess::startDeteched("cmd.exe", QStringList() << "/C" << "/path/to/mtool.exe -arg1 -arg2");
    
    QProcess::startDeteched("start.exe", QStringList() << "" << "/path/to/mtool.exe -arg1 -arg2");
    
    QProcess::startDeteched("C:\Windows\System32\cmd.exe", QStringList() << "/C" << "/path/to/mtool.exe -arg1 -arg2");
    
    QProcess::startDeteched("C:\Windows\System32\cmd.exe", QStringList() << "/C" << "/path/to/mtool.exe -arg1 -arg2");
    
    QProcess::startDeteched("/path/to/mtool.exe", QStringList() << "" << "-arg1" << "-arg2");