From b137734e6b67dc6b9615c1d200e9f9c5a3b8fee7 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Wed, 19 Apr 2017 11:51:24 +0200 Subject: Support setCreateProcessArgumentsModifier in QProcess:startDetached Factor out both CreateProcess calls into one function that also calls the modifier callback for the CreateProcessArguments struct. Task-number: QTBUG-57687 Change-Id: I9d2ef4f2d7cd077aa4c3eba926ab4dfb9e570291 Reviewed-by: Thiago Macieira --- src/corelib/io/qprocess_p.h | 1 + src/corelib/io/qprocess_win.cpp | 29 ++++++++++++++++--------- tests/auto/corelib/io/qprocess/tst_qprocess.cpp | 8 +++++++ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/corelib/io/qprocess_p.h b/src/corelib/io/qprocess_p.h index 80ac631290..bea54f86da 100644 --- a/src/corelib/io/qprocess_p.h +++ b/src/corelib/io/qprocess_p.h @@ -363,6 +363,7 @@ public: bool waitForDeadChild(); #endif #ifdef Q_OS_WIN + bool callCreateProcess(QProcess::CreateProcessArguments *cpargs); bool drainOutputPipes(); void flushPipeWriter(); qint64 pipeWriterBytesToWrite() const; diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp index cca910bcc0..6643e46bab 100644 --- a/src/corelib/io/qprocess_win.cpp +++ b/src/corelib/io/qprocess_win.cpp @@ -458,6 +458,16 @@ static QByteArray qt_create_environment(const QProcessEnvironmentPrivate::Hash & return envlist; } +bool QProcessPrivate::callCreateProcess(QProcess::CreateProcessArguments *cpargs) +{ + if (modifyCreateProcessArgs) + modifyCreateProcessArgs(cpargs); + return CreateProcess(cpargs->applicationName, cpargs->arguments, cpargs->processAttributes, + cpargs->threadAttributes, cpargs->inheritHandles, cpargs->flags, + cpargs->environment, cpargs->currentDirectory, cpargs->startupInfo, + cpargs->processInformation); +} + void QProcessPrivate::startProcess() { Q_Q(QProcess); @@ -516,12 +526,7 @@ void QProcessPrivate::startProcess() nativeWorkingDirectory.isEmpty() ? Q_NULLPTR : (wchar_t*)nativeWorkingDirectory.utf16(), &startupInfo, pid }; - if (modifyCreateProcessArgs) - modifyCreateProcessArgs(&cpargs); - success = CreateProcess(cpargs.applicationName, cpargs.arguments, cpargs.processAttributes, - cpargs.threadAttributes, cpargs.inheritHandles, cpargs.flags, - cpargs.environment, cpargs.currentDirectory, cpargs.startupInfo, - cpargs.processInformation); + success = callCreateProcess(&cpargs); QString errorString; if (!success) { @@ -886,10 +891,14 @@ bool QProcessPrivate::startDetached(qint64 *pid) (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - success = CreateProcess(0, (wchar_t*)args.utf16(), - 0, 0, FALSE, dwCreationFlags, envPtr, - workingDirectory.isEmpty() ? 0 : (wchar_t*)workingDirectory.utf16(), - &startupInfo, &pinfo); + QProcess::CreateProcessArguments cpargs = { + nullptr, reinterpret_cast(const_cast(args.utf16())), + nullptr, nullptr, false, dwCreationFlags, envPtr, + workingDirectory.isEmpty() + ? nullptr : reinterpret_cast(workingDirectory.utf16()), + &startupInfo, &pinfo + }; + success = callCreateProcess(&cpargs); if (success) { CloseHandle(pinfo.hThread); diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp index 5cd1ad5a8b..f8268f5991 100644 --- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp +++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp @@ -2049,6 +2049,11 @@ void tst_QProcess::detachedProcessParameters() QProcess process; process.setProgram(QDir::currentPath() + QLatin1String("/testDetached/testDetached")); +#ifdef Q_OS_WIN + int modifierCalls = 0; + process.setCreateProcessArgumentsModifier( + [&modifierCalls] (QProcess::CreateProcessArguments *) { modifierCalls++; }); +#endif process.setArguments(QStringList(infoFile.fileName())); process.setWorkingDirectory(workingDir); process.setProcessEnvironment(environment); @@ -2076,6 +2081,9 @@ void tst_QProcess::detachedProcessParameters() QCOMPARE(actualWorkingDir, workingDir); QCOMPARE(actualPid, pid); QCOMPARE(actualEnvVarValue, envVarValue); +#ifdef Q_OS_WIN + QCOMPARE(modifierCalls, 1); +#endif } void tst_QProcess::switchReadChannels() -- cgit v1.2.3