2016-06-14 10 views
1

私のアプリケーションでは、ローカルアプリケーションデータフォルダから分離プロセスを実行します。以下のコードは、ほとんどのケースで機能します。いくつかのテストを実行するQProcess - パスに空白が含まれているプロセスを実行しています

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アカウントのユーザー名、それが動作しないことが分かりました。

どうすれば修正できますか?

---編集:

投稿回答に基づいて、私は少しにコードを変更しました。しかし、私はまだ下のコードからQMessageBoxに「不明なエラー」を取得しています。username内の1つの空白を持つユーザが存在する場合に

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()); 
} 

を強化、それだけで...起こる

+0

私は引用符(「」)を使用して試してみたが、それは両方の言及のため –

答えて

3

QString QDir::absolutePath() const

はシンボリックリンクが含まれることが絶対パス(ドライブ 仕様「/」またはで始まるパス)を返しますが、決して 冗長「 『』 ..」または複数のセパレータが含まれていません。

それは絶対的なフォームへのルートからのパスを変換するために理にかなって:それはパスに含まれるユーザ名であるためのスペースで実行実行できないことを、別の懸念については

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

。 Qtは通常、バックスラッシュの両方を受け入れることができることを

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

マインドを「\」とパスの引数に「/」セパレータをスラッシュ:私たちは、WindowsのCreateProcessを満たすように、引用符でパス全体を囲む必要があります。

+0

良い答えが動作しませんでした「エスケープスラッシュ」への方向を」 "各バックスラッシュをエスケープしなければならない+1 –

+0

スラッシュチップをありがとう。しかし、私はまだあなたのコードに続いて、QDirを使って、process-> errorString()で "Unknown Error"を取得しています... –

+0

パスにexeファイルが存在しますか? – AlexanderVX

2

あなたはパスの解決にQDirを使用しようとすることができます

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

QDirを使用していても、process-> errorString()で "Unknown Error"というコードが次のように表示されています... –

関連する問題