diff --git a/src/libs/utils/winutils.cpp b/src/libs/utils/winutils.cpp index 4e75d1eeeee..dfdb0cadd95 100644 --- a/src/libs/utils/winutils.cpp +++ b/src/libs/utils/winutils.cpp @@ -172,4 +172,22 @@ QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const QString &binaryIn) #endif } +WindowsCrashDialogBlocker::WindowsCrashDialogBlocker() +#ifdef Q_OS_WIN + : silenceErrorMode(SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS), + originalErrorMode(SetErrorMode(silenceErrorMode)) +#endif +{ +} + +WindowsCrashDialogBlocker::~WindowsCrashDialogBlocker() +{ +#ifdef Q_OS_WIN + unsigned int errorMode = SetErrorMode(originalErrorMode); + // someone else messed with the error mode in between? Better not touch ... + QTC_ASSERT(errorMode == silenceErrorMode, SetErrorMode(errorMode)); +#endif +} + + } // namespace Utils diff --git a/src/libs/utils/winutils.h b/src/libs/utils/winutils.h index 9b5358791a4..4fa59c67ab4 100644 --- a/src/libs/utils/winutils.h +++ b/src/libs/utils/winutils.h @@ -49,6 +49,23 @@ QTCREATOR_UTILS_EXPORT bool is64BitWindowsSystem(); // Check for a 64bit binary. QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const QString &binary); +// +// RAII class to temporarily prevent windows crash messages from popping up using the +// application-global (!) error mode. +// +// Useful primarily for QProcess launching, since the setting will be inherited. +// +class QTCREATOR_UTILS_EXPORT WindowsCrashDialogBlocker { +public: + WindowsCrashDialogBlocker(); + ~WindowsCrashDialogBlocker(); +#ifdef Q_OS_WIN +private: + const unsigned int silenceErrorMode; + const unsigned int originalErrorMode; +#endif // Q_OS_WIN +}; + } // namespace Utils #endif // WINUTILS_H diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 7a405484357..3ded2c6b24b 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -48,6 +48,7 @@ #include #include #include +#include #include #include @@ -1206,6 +1207,9 @@ static QByteArray runQmakeQuery(const FileName &binary, const Environment &env, const int timeOutMS = 30000; // Might be slow on some machines. + // Prevent e.g. qmake 4.x on MinGW to show annoying errors about missing dll's. + WindowsCrashDialogBlocker crashDialogBlocker; + QProcess process; process.setEnvironment(env.toStringList()); process.start(binary.toString(), QStringList(QLatin1String("-query")), QIODevice::ReadOnly);