From a450862150ba8b51bf3aabea76fb3d46e678aaf1 Mon Sep 17 00:00:00 2001 From: lordmulder Date: Thu, 1 Mar 2012 23:14:41 +0100 Subject: [PATCH] Patched Qt's QProcess class to pass the CREATE_BREAKAWAY_FROM_JOB flag when creating a new process. This is required, because Windows (Vista and later) will add our child processes to the PCA (Program Compatibility Assistant) job object automatically! And then we cannot add the child processes to our own job object, as a process can be assigned to only one job object. With the CREATE_BREAKAWAY_FROM_JOB flag, we ensure that our child processes does NOT get added to the PCA job object automatically and we can add it to our own job object again. Unfortunately QProcess does NOT provide a way to pass process creation flags yet, so we have to patch Qt for now. Passing the CREATE_BREAKAWAY_FROM_JOB flag may not always be desired though... --- ...t-v4.8.0-QProcess-BreakawayFromJob.V1.diff | 21 +++++++++++++++++++ src/Config.h | 2 +- src/Tool_Abstract.cpp | 4 ++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 etc/Patches/Qt-v4.8.0-QProcess-BreakawayFromJob.V1.diff diff --git a/etc/Patches/Qt-v4.8.0-QProcess-BreakawayFromJob.V1.diff b/etc/Patches/Qt-v4.8.0-QProcess-BreakawayFromJob.V1.diff new file mode 100644 index 00000000..bbc0dbca --- /dev/null +++ b/etc/Patches/Qt-v4.8.0-QProcess-BreakawayFromJob.V1.diff @@ -0,0 +1,21 @@ +diff --git "a/E:\\QtSDK\\QtSources\\4.8.0\\src\\corelib\\io\\qprocess_win.old" "b/E:\\QtSDK\\QtSources\\4.8.0\\src\\corelib\\io\\qprocess_win.cpp" +index 510f723..e82bbec 100644 +--- "a/E:\\QtSDK\\QtSources\\4.8.0\\src\\corelib\\io\\qprocess_win.old" ++++ "b/E:\\QtSDK\\QtSources\\4.8.0\\src\\corelib\\io\\qprocess_win.cpp" +@@ -413,6 +413,7 @@ void QProcessPrivate::startProcess() + #else + DWORD dwCreationFlags = CREATE_NO_WINDOW; + dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT; ++ dwCreationFlags |= CREATE_BREAKAWAY_FROM_JOB; + STARTUPINFOW startupInfo = { sizeof( STARTUPINFO ), 0, 0, 0, + (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT, + (ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT, +@@ -858,7 +859,7 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + success = CreateProcess(0, (wchar_t*)args.utf16(), +- 0, 0, FALSE, CREATE_UNICODE_ENVIRONMENT | CREATE_NEW_CONSOLE, 0, ++ 0, 0, FALSE, CREATE_UNICODE_ENVIRONMENT | CREATE_NEW_CONSOLE | CREATE_BREAKAWAY_FROM_JOB, 0, + workingDir.isEmpty() ? 0 : (wchar_t*)workingDir.utf16(), + &startupInfo, &pinfo); + #endif // Q_OS_WINCE diff --git a/src/Config.h b/src/Config.h index 297f26e8..384a1062 100644 --- a/src/Config.h +++ b/src/Config.h @@ -30,7 +30,7 @@ #define VER_LAMEXP_MINOR_LO 4 #define VER_LAMEXP_TYPE Beta #define VER_LAMEXP_PATCH 3 -#define VER_LAMEXP_BUILD 897 +#define VER_LAMEXP_BUILD 898 /////////////////////////////////////////////////////////////////////////////// // Tool versions (minimum expected versions!) diff --git a/src/Tool_Abstract.cpp b/src/Tool_Abstract.cpp index 78353f6a..46dbf9f4 100644 --- a/src/Tool_Abstract.cpp +++ b/src/Tool_Abstract.cpp @@ -94,6 +94,10 @@ AbstractTool::AbstractTool(void) CloseHandle(jobObject); } } + else + { + qWarning("Failed to create the job object!"); + } } } else