2016-06-14 5 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가 실제로 수)가 포함되어있는 경우 작동하지 않는 것을 발견.

어떻게 수정 될 수 있습니까?

--- 편집 : 게시 된 답변을 바탕으로

, 나는 조금에게 코드를 변경했습니다. 그러나 나는 아직도 아래 코드에서 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()); 
} 

이 강화, 그것은 단지 ... 일

+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); 

마음과 경로 인수 '/'구분을 슬래시 : 우리는 윈도우 CreateProcess를 만족하도록 따옴표로 전체 경로를 묶어야한다.

+0

좋은 대답을 작동하지 않았다 "탈출 슬래시"로 방향을 " "각 백 슬래시를 벗어나야 함 +1 –

+0

슬래시 팁을 보내 주셔서 감사합니다. 그러나, 나는 여전히 "알 수없는 오류"프로세스 -> errorString(), QDir, 귀하의 코드에 따라 점점 ... –

+0

exe ​​파일이 경로에 존재합니까? – AlexanderVX

2

당신은 경로를 해결하기 위해 QDir을 사용하려고 할 수 있습니다 : 나는 따옴표 ("")를 사용하여 시도했다

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

프로세스 -> errorString()에서 여전히 "알 수없는 오류"가 발생합니다. QDir에서도 코드를 따르고 있습니다 ... –