QProcess - 其路径包含空格的运行进程

时间:2016-06-14 20:08:35

标签: windows qt command-line whitespace qprocess

在我的应用程序中,我从Local App Data文件夹运行一个分离的进程。以下代码适用于大多数情况。

void executeApp(const QString &id)
{
    QString program = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
    program = program + "\\..\\Programs\\MyApp.exe";
    QStringList arguments;
    arguments << "--app_id="+id; //it is only one argument
    QProcess* process = new QProcess(this);
    bool success = process->startDetached(program, arguments);
    if (!success) //TODO: Error handling
        qDebug() << "Couldn't start process at " << program << process->errorString();

}

运行一些测试,我发现当Windows帐户用户名中包含空格时它不起作用(Windows实际上允许这样做)。

怎么可以修复?

---编辑:

根据发布的答案,我已经改变了一点代码。但是我仍然得到了#34;未知错误&#34;在下面的代码中的QMessageBox上:

void executeApp(const QString &id)
{
    QString program = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
    program = QDir(program + "/../Programs/MyApp.exe").absolutePath();
    QStringList arguments;
    arguments << "--app_id="+id; //it is only one argument
    QProcess* process = new QProcess(this);
    bool success = process->startDetached(program, arguments);

    if (!success) 
        QMessageBox::critical(NULL, tr("Launching App"), process->errorString());
}

强化,只有当用户在用户名中有一个空格时才会发生......

2 个答案:

答案 0 :(得分:3)

QString QDir::absolutePath() const

  

返回绝对路径(以&#34开头的路径; /&#34;或驱动器   规范),可能包含符号链接,但从不包含   多余&#34;。&#34;,&#34; ..&#34;或多个分隔符。

将路径从根转换为绝对形式是有意义的:

QString dataPath = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
QString exePath = QDir(dataPath + "/../Programs").absolutePath();
qDebug() << "Executable path" << exepath;
qDebug() << "File exists" << QFile(exepath + "/MyApp.exe").exists();

至于另一个问题,即由于路径中包含的用户名中的空格而无法运行可执行文件。我们应该将整个路径括在引号中,以便Windows CreateProcess满意:

process->startDetached(QStringLiteral("\"") + exepath + "/MyApp.exe" + QChar("\""), arguments);

请注意,Qt通常能够接受反斜杠&#39; \&#39;和斜线&#39; /&#39;路径参数的分隔符。

答案 1 :(得分:2)

您可以尝试使用QDir来解析路径:

QDir dataDir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));
QString program = dataDir.absolutePath("../Programs/MyApp.exe");