diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp index 7d577a4ba49..1222322c16e 100644 --- a/src/corelib/io/qprocess_win.cpp +++ b/src/corelib/io/qprocess_win.cpp @@ -513,6 +513,12 @@ bool QProcessPrivate::callCreateProcess(QProcess::CreateProcessArguments *cpargs cpargs->inheritHandles, cpargs->flags, cpargs->environment, cpargs->currentDirectory, cpargs->startupInfo, cpargs->processInformation); + if (!success) { + // don't CloseHandle here (we'll do that in cleanup()) so GetLastError() + // remains unmodified + return false; + } + if (stdinChannel.pipe[0] != INVALID_Q_PIPE) { CloseHandle(stdinChannel.pipe[0]); stdinChannel.pipe[0] = INVALID_Q_PIPE; @@ -576,9 +582,10 @@ void QProcessPrivate::startProcess() if (!callCreateProcess(&cpargs)) { // Capture the error string before we do CloseHandle below - QString errorString = QProcess::tr("Process failed to start: %1").arg(qt_error_string()); + QString errorString = qt_error_string(); cleanup(); - setErrorAndEmit(QProcess::FailedToStart, errorString); + setErrorAndEmit(QProcess::FailedToStart, + QProcess::tr("Process failed to start: %1").arg(errorString)); return; } @@ -946,7 +953,9 @@ bool QProcessPrivate::startDetached(qint64 *pid) if (!success) { if (pid) *pid = -1; - setErrorAndEmit(QProcess::FailedToStart); + QString errorString = qt_error_string(); + setErrorAndEmit(QProcess::FailedToStart, + QProcess::tr("Process failed to start: %1").arg(errorString)); } closeChannels(); diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp index 5352c625146..8a36c9929a3 100644 --- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp +++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp @@ -25,6 +25,9 @@ # include # include #endif +#ifdef Q_OS_WIN +# include +#endif #include @@ -424,8 +427,13 @@ void tst_QProcess::simpleStartFail() #ifdef Q_OS_UNIX QVERIFY2(process.errorString().contains(": execve: "), process.errorString().toLocal8Bit()); - QVERIFY2(process.errorString().contains(qt_error_string(ENOENT)), process.errorString().toLocal8Bit()); + int errorcode = ENOENT; +#else + // value happens to match ENOENT, but that's a coincidence + int errorcode = ERROR_FILE_NOT_FOUND; #endif + QVERIFY2(process.errorString().contains(qt_error_string(errorcode)), + process.errorString().toLocal8Bit()); } void tst_QProcess::readFromProcess() @@ -2940,8 +2948,12 @@ void tst_QProcess::setNonExistentWorkingDirectory() #ifdef Q_OS_UNIX QVERIFY2(process.errorString().contains(": chdir: "), process.errorString().toLocal8Bit()); - QVERIFY2(process.errorString().contains(qt_error_string(ENOENT)), process.errorString().toLocal8Bit()); + int errorcode = ENOENT; +#else + int errorcode = ERROR_DIRECTORY; #endif + QVERIFY2(process.errorString().contains(qt_error_string(errorcode)), + process.errorString().toLocal8Bit()); } void tst_QProcess::startFinishStartFinish()