summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2017-04-19 11:51:24 +0200
committerJoerg Bornemann <joerg.bornemann@qt.io>2017-04-23 18:10:50 +0000
commitb137734e6b67dc6b9615c1d200e9f9c5a3b8fee7 (patch)
tree815cd8e82c27939e31756770c6ecc485214eef2c
parent3cb4bbfc2644724cfcc0267b84f8979ceb7b08e6 (diff)
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 <thiago.macieira@intel.com>
-rw-r--r--src/corelib/io/qprocess_p.h1
-rw-r--r--src/corelib/io/qprocess_win.cpp29
-rw-r--r--tests/auto/corelib/io/qprocess/tst_qprocess.cpp8
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<wchar_t *>(const_cast<ushort *>(args.utf16())),
+ nullptr, nullptr, false, dwCreationFlags, envPtr,
+ workingDirectory.isEmpty()
+ ? nullptr : reinterpret_cast<const wchar_t *>(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()