diff options
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | examples/activeqt/webbrowser/main.cpp | 6 | ||||
-rw-r--r-- | src/activeqt/container/qaxbase.cpp | 16 | ||||
-rw-r--r-- | src/activeqt/container/qaxscript.cpp | 22 | ||||
-rw-r--r-- | src/activeqt/container/qaxselect.cpp | 99 | ||||
-rw-r--r-- | src/activeqt/control/qaxfactory.h | 4 | ||||
-rw-r--r-- | src/activeqt/control/qaxserver.cpp | 16 | ||||
-rw-r--r-- | src/activeqt/control/qaxserverbase.cpp | 13 | ||||
-rw-r--r-- | src/activeqt/control/qaxservermain.cpp | 15 | ||||
-rw-r--r-- | src/activeqt/shared/qaxtypes.cpp | 2 | ||||
-rw-r--r-- | src/activeqt/shared/qaxutils.cpp | 3 | ||||
-rw-r--r-- | src/tools/idc/main.cpp | 3 | ||||
-rw-r--r-- | tools/dumpcpp/main.cpp | 5 | ||||
-rw-r--r-- | tools/testcon/ambientproperties.cpp | 16 | ||||
-rw-r--r-- | tools/testcon/main.cpp | 3 | ||||
-rw-r--r-- | tools/testcon/mainwindow.cpp | 64 | ||||
-rw-r--r-- | tools/testcon/mainwindow.h | 2 | ||||
-rw-r--r-- | tools/testcon/mainwindow.ui | 22 |
18 files changed, 226 insertions, 87 deletions
diff --git a/.qmake.conf b/.qmake.conf index fec66b7..b1c22d3 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,3 @@ load(qt_build_config) -MODULE_VERSION = 5.8.1 +MODULE_VERSION = 5.9.0 diff --git a/examples/activeqt/webbrowser/main.cpp b/examples/activeqt/webbrowser/main.cpp index cac2505..869ddfc 100644 --- a/examples/activeqt/webbrowser/main.cpp +++ b/examples/activeqt/webbrowser/main.cpp @@ -78,7 +78,7 @@ static QList<Location> defaultBookmarks() static bool containsAddress(const QList<Location> &locations, const QString &address) { - foreach (const Location &location, locations) { + for (const Location &location : locations) { if (location.address == address) return true; } @@ -195,7 +195,7 @@ MainWindow::MainWindow() QList<Location> bookmarks = readBookMarks(settings); if (bookmarks.isEmpty() || restoredVersion.isEmpty()) bookmarks = defaultBookmarks(); - foreach (const Location &bookmark, bookmarks) + for (const Location &bookmark : qAsConst(bookmarks)) addBookmark(bookmark); } @@ -222,7 +222,7 @@ QAction *MainWindow::addLocation(const Location &location, QMenu *menu) QList<Location> MainWindow::bookmarks() const { QList<Location> result; - foreach (const QAction *action, bookmarkActions) + for (const QAction *action : qAsConst(bookmarkActions)) result.append(locationFromAction(action)); return result; } diff --git a/src/activeqt/container/qaxbase.cpp b/src/activeqt/container/qaxbase.cpp index 4e37b88..4c0bae7 100644 --- a/src/activeqt/container/qaxbase.cpp +++ b/src/activeqt/container/qaxbase.cpp @@ -1000,7 +1000,7 @@ bool QAxBase::setControl(const QString &c) if (search.isEmpty()) { controls.beginGroup(QLatin1String("/CLSID")); const QStringList clsids = controls.childGroups(); - foreach (const QString &clsid, clsids) { + for (const QString &clsid : clsids) { const QString name = controls.value(clsid + QLatin1String("/Default")).toString(); if (name == c) { search = clsid; @@ -1100,8 +1100,8 @@ void QAxBase::disableClassInfo() */ void QAxBase::clear() { - foreach (QAxEventSink *eventSink, d->eventSink) { - if (eventSink) { + for (auto it = d->eventSink.cbegin(), end = d->eventSink.cend(); it != end; ++it) { + if (QAxEventSink *eventSink = it.value()) { eventSink->unadvise(); eventSink->Release(); } @@ -2167,8 +2167,8 @@ void MetaObjectGenerator::readClassInfo() QString tlfile; if (!tlid.isEmpty()) { controls.beginGroup(QLatin1String("/Classes/TypeLib/") + tlid); - QStringList versions = controls.childGroups(); - foreach (const QString &version, versions) { + const QStringList versions = controls.childGroups(); + for (const QString &version : versions) { tlfile = controls.value(QLatin1Char('/') + version + QLatin1String("/0/win32/.")).toString(); if (!tlfile.isEmpty()) break; @@ -2928,7 +2928,7 @@ QMetaObject *MetaObjectGenerator::tryCache() IConnectionPointContainer *cpoints = 0; d->ptr->QueryInterface(IID_IConnectionPointContainer, reinterpret_cast<void **>(&cpoints)); if (cpoints) { - foreach (const QUuid &iid, d->metaobj->connectionInterfaces) { + for (const QUuid &iid : qAsConst(d->metaobj->connectionInterfaces)) { IConnectionPoint *cpoint = 0; cpoints->FindConnectionPoint(iid, &cpoint); if (cpoint) { @@ -3151,8 +3151,8 @@ QMetaObject *MetaObjectGenerator::metaObject(const QMetaObject *parentObject, co if (!cacheKey.isEmpty()) { mo_cache.insert(cacheKey, d->metaobj); d->cachedMetaObject = true; - foreach (QAxEventSink *sink, d->eventSink) { - if (sink) { + for (auto it = d->eventSink.cbegin(), end = d->eventSink.cend(); it != end; ++it) { + if (QAxEventSink *sink = it.value()) { QUuid ciid = sink->connectionInterface(); d->metaobj->connectionInterfaces.append(ciid); diff --git a/src/activeqt/container/qaxscript.cpp b/src/activeqt/container/qaxscript.cpp index 7c84e4b..fef39fa 100644 --- a/src/activeqt/container/qaxscript.cpp +++ b/src/activeqt/container/qaxscript.cpp @@ -713,7 +713,7 @@ bool QAxScript::load(const QString &code, const QString &language) if (code.contains(QLatin1String("End Sub"), Qt::CaseInsensitive)) lang = QLatin1String("VBScript"); - foreach (const QAxEngineDescriptor &engine, engines) { + for (const QAxEngineDescriptor &engine : qAsConst(engines)) { if (!engine.code.isEmpty() && code.contains(engine.code)) { lang = engine.name; break; @@ -939,8 +939,8 @@ QStringList QAxScriptManager::functions(QAxScript::FunctionFlags flags) const { QStringList functions; functions.reserve(d->scriptDict.size()); - foreach (const QAxScript *script, d->scriptDict) - functions.append(script->functions(flags)); + for (auto it = d->scriptDict.cbegin(), end = d->scriptDict.cend(); it != end; ++it) + functions.append(it.value()->functions(flags)); return functions; } @@ -1055,7 +1055,7 @@ QAxScript *QAxScriptManager::load(const QString &file, const QString &name) if (file.endsWith(QLatin1String(".js"))) { language = QLatin1String("JScript"); } else { - foreach (const QAxEngineDescriptor &engine, engines) { + for (const QAxEngineDescriptor &engine : qAsConst(engines)) { if (!engine.extension.isEmpty() && file.endsWith(engine.extension)) { language = engine.name; break; @@ -1178,7 +1178,7 @@ QString QAxScriptManager::scriptFileFilter() QString specialFiles = QLatin1String(";;VBScript Files (*.vbs *.dsm)" ";;JavaScript Files (*.js)"); - foreach (const QAxEngineDescriptor &engine, engines) { + for (const QAxEngineDescriptor &engine : qAsConst(engines)) { if (!engine.extension.isEmpty()) { allFiles += QLatin1String(" *") + engine.extension; specialFiles += QLatin1String(";;") + engine.name @@ -1214,18 +1214,18 @@ QAxScript *QAxScriptManager::scriptForFunction(const QString &function) const { // check full prototypes if included if (function.contains(QLatin1Char('('))) { - foreach (QAxScript *script, d->scriptDict) { - if (script->functions(QAxScript::FunctionSignatures).contains(function)) - return script; + for (auto it = d->scriptDict.cbegin(), end = d->scriptDict.cend(); it != end; ++it) { + if (it.value()->functions(QAxScript::FunctionSignatures).contains(function)) + return it.value(); } } QString funcName = function; funcName.truncate(funcName.indexOf(QLatin1Char('('))); // second try, checking only names, not prototypes - foreach (QAxScript *script, d->scriptDict) { - if (script->functions(QAxScript::FunctionNames).contains(funcName)) - return script; + for (auto it = d->scriptDict.cbegin(), end = d->scriptDict.cend(); it != end; ++it) { + if (it.value()->functions(QAxScript::FunctionNames).contains(funcName)) + return it.value(); } return 0; diff --git a/src/activeqt/container/qaxselect.cpp b/src/activeqt/container/qaxselect.cpp index 0fc7d62..77e0a3c 100644 --- a/src/activeqt/container/qaxselect.cpp +++ b/src/activeqt/container/qaxselect.cpp @@ -42,6 +42,7 @@ #include "ui_qaxselect.h" +#include <QtCore/QFileInfo> #include <QtCore/QSortFilterProxyModel> #include <QtCore/QItemSelectionModel> #include <QtCore/QSysInfo> @@ -57,16 +58,20 @@ QT_BEGIN_NAMESPACE +enum ControlType { InProcessControl, OutOfProcessControl }; + struct Control { - inline Control() : wordSize(0) {} + inline Control() : type(InProcessControl), wordSize(0) {} int compare(const Control &rhs) const; QString toolTip() const; + ControlType type; QString clsid; QString name; QString dll; QString version; + QString rootKey; unsigned wordSize; }; @@ -78,6 +83,8 @@ inline int Control::compare(const Control &rhs) const return -1; if (wordSize < rhs.wordSize) return 1; + if (const int k = rootKey.compare(rhs.rootKey)) + return k; if (const int n = name.compare(rhs.name)) return n; if (const int c = clsid.compare(rhs.clsid)) @@ -89,35 +96,72 @@ inline int Control::compare(const Control &rhs) const return 0; } +static inline QString nonbreakingSpace(QString in) +{ + in.replace(QStringLiteral(" "), QStringLiteral(" ")); + return in; +} + +// The entry for an out of process binary typically looks like: +// "..\foo.exe" -activex +// Extract the actual binary +static QString outOfProcessBinary(const QString &entry) +{ + if (entry.startsWith(QLatin1Char('"'))) { + const int closing = entry.indexOf(QLatin1Char('"'), 1); + if (closing > 1) + return entry.mid(1, closing - 1); + } + const int spacePos = entry.indexOf(QLatin1Char(' ')); + return spacePos > 0 ? entry.left(spacePos) : entry; +} + +// Replace environment variables enclosed in '%' in a string (registry entry) +static QString replaceEnvironmentVariables(QString in) +{ + while (true) { + const int openInPercentPos = in.indexOf(QLatin1Char('%')); + if (openInPercentPos < 0) + break; + const int closingPercentPos = in.indexOf(QLatin1Char('%'), openInPercentPos + 1); + if (closingPercentPos < 0) + break; + const QStringRef varName = in.midRef(openInPercentPos + 1, closingPercentPos - openInPercentPos - 1); + const QString contents = QString::fromLocal8Bit(qgetenv(varName.toLocal8Bit())); + in.replace(openInPercentPos, closingPercentPos - openInPercentPos + 1, contents); + } + return in; +} + QString Control::toolTip() const { QString result; QTextStream str(&result); str << "<html><head/><body><table>" - << "<tr><th>" << QAxSelect::tr("Name:") << "</th><td>" << name << "</td></tr>" + << "<tr><th>" << QAxSelect::tr("Name:") << "</th><td>" << nonbreakingSpace(name) << "</td></tr>" + << "<tr><th>" << QAxSelect::tr("Type:") << "</th><td>" + << (type == InProcessControl ? QAxSelect::tr("In process") : QAxSelect::tr("Out of process")) + << "</td></tr>" << "<tr><th>" << QAxSelect::tr("CLSID:") << "</th><td>" << clsid << "</td></tr>" + << "<tr><th>" << QAxSelect::tr("Key:") << "</th><td>" << rootKey << "</td></tr>" << "<tr><th>" << QAxSelect::tr("Word size:") << "</th><td>" << wordSize << "</td></tr>"; - if (!dll.isEmpty()) - str << "<tr><th>" << QAxSelect::tr("DLL:") << "</th><td>" << dll << "</td></tr>"; + if (!dll.isEmpty()) { + str << "<tr><th>" + << (type == InProcessControl ? QAxSelect::tr("DLL:") : QAxSelect::tr("Binary:")) + << "</th><td"; + if (!QFileInfo(dll).exists()) + str << " style=\"color:red\""; + str << '>' << nonbreakingSpace(dll) << "</td></tr>"; + } if (!version.isEmpty()) str << "<tr><th>" << QAxSelect::tr("Version:") << "</th><td>" << version << "</td></tr>"; str << "</table></body></html>"; - result.replace(QStringLiteral(" "), QStringLiteral(" ")); return result; } inline bool operator<(const Control &c1, const Control &c2) { return c1.compare(c2) < 0; } inline bool operator==(const Control &c1, const Control &c2) { return !c1.compare(c2); } -class FindByClsidPredicate : public std::unary_function<bool, Control> { -public: - explicit FindByClsidPredicate(const QString &clsid) : m_clsid(clsid) {} - inline bool operator()(const Control &c) const { return m_clsid == c.clsid; } - -private: - const QString m_clsid; -}; - static LONG RegistryQueryValue(HKEY hKey, LPCWSTR lpSubKey, LPBYTE lpData, LPDWORD lpcbData) { LONG ret = ERROR_FILE_NOT_FOUND; @@ -151,8 +195,7 @@ static QList<Control> readControls(const wchar_t *rootKey, unsigned wordSize) qErrnoWarning("RegOpenKeyEx failed."); return controls; } - const QString systemRoot = QString::fromLocal8Bit(qgetenv("SystemRoot")); - const QRegExp systemRootPattern(QStringLiteral("%SystemRoot%"), Qt::CaseInsensitive, QRegExp::FixedString); + const QString rootKeyS = QStringLiteral("HKEY_CLASSES_ROOT\\") + QString::fromWCharArray(rootKey); DWORD index = 0; LONG result = 0; wchar_t buffer[256]; @@ -175,11 +218,16 @@ static QList<Control> readControls(const wchar_t *rootKey, unsigned wordSize) control.clsid = clsid; control.wordSize = wordSize; control.name = QString::fromWCharArray(buffer); + control.rootKey = rootKeyS; szBuffer = sizeof(buffer) / sizeof(wchar_t); if (querySubKeyValue(classesKey, clsid + QStringLiteral("\\InprocServer32"), reinterpret_cast<LPBYTE>(buffer), &szBuffer)) { - control.dll = QString::fromWCharArray(buffer); - control.dll.replace(systemRootPattern, systemRoot); + control.type = InProcessControl; + control.dll = replaceEnvironmentVariables(QString::fromWCharArray(buffer)); + } else if (querySubKeyValue(classesKey, clsid + QStringLiteral("\\LocalServer32"), + reinterpret_cast<LPBYTE>(buffer), &szBuffer)) { + control.type = OutOfProcessControl; + control.dll = outOfProcessBinary(replaceEnvironmentVariables(QString::fromWCharArray(buffer))); } szBuffer = sizeof(buffer) / sizeof(wchar_t); if (querySubKeyValue(classesKey, clsid + QStringLiteral("\\VERSION"), @@ -202,12 +250,8 @@ public: : QAbstractListModel(parent) { m_controls = readControls(L"CLSID", unsigned(QSysInfo::WordSize)); - if (QSysInfo::WordSize == 64) { // Append the 32bit controls as disabled items. - foreach (const Control &c, readControls(L"Wow6432Node\\CLSID", 32u)) { - if (std::find_if(m_controls.constBegin(), m_controls.constEnd(), FindByClsidPredicate(c.clsid)) == m_controls.constEnd()) - m_controls.append(c); - } - } + if (QSysInfo::WordSize == 64) // Append the 32bit controls + m_controls += readControls(L"Wow6432Node\\CLSID", 32u); std::sort(m_controls.begin(), m_controls.end()); } @@ -240,8 +284,11 @@ QVariant ControlList::data(const QModelIndex &index, int role) const Qt::ItemFlags ControlList::flags(const QModelIndex &index) const { Qt::ItemFlags result = QAbstractListModel::flags(index); - if (!index.isValid() || m_controls.at(index.row()).wordSize != QSysInfo::WordSize) - result &= ~Qt::ItemIsEnabled; + if (index.isValid()) { + const Control &control = m_controls.at(index.row()); + if (control.type == InProcessControl && control.wordSize != QSysInfo::WordSize) + result &= ~Qt::ItemIsEnabled; + } return result; } diff --git a/src/activeqt/control/qaxfactory.h b/src/activeqt/control/qaxfactory.h index c7444d3..2f7bed1 100644 --- a/src/activeqt/control/qaxfactory.h +++ b/src/activeqt/control/qaxfactory.h @@ -251,7 +251,7 @@ private: factory = new QAxClass<Class>(typeLibID().toString(), appID().toString()); \ qRegisterMetaType<Class*>(#Class"*"); \ keys = factory->featureList(); \ - Q_FOREACH (const QString &key, keys) { \ + for (const QString &key : qAsConst(keys)) { \ factoryKeys += key; \ factories.insert(key, factory); \ creatable.insert(key, true); \ @@ -261,7 +261,7 @@ private: factory = new QAxClass<Class>(typeLibID().toString(), appID().toString()); \ qRegisterMetaType<Class*>(#Class"*"); \ keys = factory->featureList(); \ - Q_FOREACH (const QString &key, keys) { \ + for (const QString &key : qAsConst(keys)) { \ factoryKeys += key; \ factories.insert(key, factory); \ creatable.insert(key, false); \ diff --git a/src/activeqt/control/qaxserver.cpp b/src/activeqt/control/qaxserver.cpp index 35a32dd..b3c11db 100644 --- a/src/activeqt/control/qaxserver.cpp +++ b/src/activeqt/control/qaxserver.cpp @@ -262,8 +262,8 @@ HRESULT UpdateRegistry(BOOL bRegister) settings->setValue(QLatin1String("/AppID/") + module + QLatin1String(".EXE/AppID"), appId); } - QStringList keys = qAxFactory()->featureList(); - foreach (const QString &classNameIn, keys) { + const QStringList keys = qAxFactory()->featureList(); + for (const QString &classNameIn : keys) { QObject *object = qAxFactory()->createObject(classNameIn); const QMetaObject *mo = qAxFactory()->metaObject(classNameIn); const QString classId = qAxFactory()->classID(classNameIn).toString().toUpper(); @@ -368,8 +368,8 @@ HRESULT UpdateRegistry(BOOL bRegister) settings->remove(QLatin1String("/AppID/") + appId + QLatin1String("/.")); settings->remove(QLatin1String("/AppID/") + module + QLatin1String(".EXE")); } - QStringList keys = qAxFactory()->featureList(); - foreach (const QString &classNameIn, keys) { + const QStringList keys = qAxFactory()->featureList(); + for (const QString &classNameIn : keys) { const QMetaObject *mo = qAxFactory()->metaObject(classNameIn); const QString classId = qAxFactory()->classID(classNameIn).toString().toUpper(); const QString className = qax_clean_type(classNameIn, mo); @@ -1160,7 +1160,7 @@ extern "C" HRESULT __stdcall DumpIDL(const QString &outfile, const QString &ver) out << "\timportlib(\"stdole32.tlb\");" << endl; out << "\timportlib(\"stdole2.tlb\");" << endl << endl; - QStringList keys = qAxFactory()->featureList(); + const QStringList keys = qAxFactory()->featureList(); out << "\t/************************************************************************" << endl; out << "\t** If this causes a compile error in MIDL you need to upgrade the" << endl; @@ -1205,7 +1205,7 @@ extern "C" HRESULT __stdcall DumpIDL(const QString &outfile, const QString &ver) out << "\t/* Forward declaration of classes that might be used as parameters */" << endl << endl; int res = S_OK; - foreach (const QString &className, keys) { + for (const QString &className : keys) { const QMetaObject *mo = qAxFactory()->metaObject(className); // We have meta object information for this type. Forward declare it. if (mo) { @@ -1222,7 +1222,7 @@ extern "C" HRESULT __stdcall DumpIDL(const QString &outfile, const QString &ver) } out << endl; - foreach (const QString &className, keys) { + for (const QString &className : keys) { const QMetaObject *mo = qAxFactory()->metaObject(className); // We have meta object information for this type. Define it. if (mo) { @@ -1238,7 +1238,7 @@ extern "C" HRESULT __stdcall DumpIDL(const QString &outfile, const QString &ver) if (res != S_OK) goto ErrorInClass; - foreach (const QString &className, keys) { + for (const QString &className : keys) { QObject *o = qAxFactory()->createObject(className); if (!o) continue; diff --git a/src/activeqt/control/qaxserverbase.cpp b/src/activeqt/control/qaxserverbase.cpp index 663edf1..9b7fab8 100644 --- a/src/activeqt/control/qaxserverbase.cpp +++ b/src/activeqt/control/qaxserverbase.cpp @@ -642,7 +642,7 @@ public: connections = old.connections; that = old.that; iid = old.iid; - foreach (const CONNECTDATA &connection, connections) + for (const CONNECTDATA &connection : qAsConst(connections)) connection.pUnk->AddRef(); } virtual ~QAxConnection() @@ -842,8 +842,8 @@ QClassFactory::QClassFactory(CLSID clsid) InitializeCriticalSection(&refCountSection); // COM only knows the CLSID, but QAxFactory is class name based... - QStringList keys = qAxFactory()->featureList(); - foreach (const QString &key, keys) { + const QStringList keys = qAxFactory()->featureList(); + for (const QString &key : keys) { if (qAxFactory()->classID(key) == clsid) { className = key; break; @@ -1124,9 +1124,8 @@ QAxServerBase::~QAxServerBase() #endif revokeActiveObject(); - - foreach (IConnectionPoint *point, points) { - if (point) + for (auto it = points.cbegin(), end = points.cend(); it != end; ++it) { + if (IConnectionPoint *point = it.value()) point->Release(); } delete aggregatedObject; @@ -1342,7 +1341,7 @@ bool QAxServerBase::internalCreate() if (isWidget) { qt.object->installEventFilter(this); const QWidgetList children = qt.object->findChildren<QWidget*>(); - foreach (QWidget *child, children) + for (QWidget *child : children) child->installEventFilter(this); } return true; diff --git a/src/activeqt/control/qaxservermain.cpp b/src/activeqt/control/qaxservermain.cpp index c54f7ef..e6ddd52 100644 --- a/src/activeqt/control/qaxservermain.cpp +++ b/src/activeqt/control/qaxservermain.cpp @@ -278,6 +278,21 @@ EXTERN_C int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, if (run) { if (SUCCEEDED(CoInitialize(0))) { +#ifdef Q_CC_MINGW + // define GlobalOptions class ID locally for MinGW, since it's missing from the distribution + static const CLSID CLSID_GlobalOptions = + { 0x0000034B, 0x0000, 0x0000, { 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 } }; +#endif + // Disable C++ & SEH exception handling by the COM runtime for out-of-process COM controls. + // Done to prevent silent crashes and enable crash dump generation. + IGlobalOptions *globalOptions = nullptr; + if (SUCCEEDED(CoCreateInstance(CLSID_GlobalOptions, NULL, CLSCTX_INPROC_SERVER, + IID_IGlobalOptions, reinterpret_cast<void **>(&globalOptions)))) { + globalOptions->Set(COMGLB_EXCEPTION_HANDLING, COMGLB_EXCEPTION_DONOT_HANDLE_ANY); + globalOptions->Release(); + globalOptions = nullptr; + } + { Arg args(unprocessed); qAxInit(); diff --git a/src/activeqt/shared/qaxtypes.cpp b/src/activeqt/shared/qaxtypes.cpp index df3b655..99ab4c8 100644 --- a/src/activeqt/shared/qaxtypes.cpp +++ b/src/activeqt/shared/qaxtypes.cpp @@ -1222,7 +1222,7 @@ QVariant VARIANTToQVariant(const VARIANT &arg, const QByteArray &typeName, uint bool allStrings = true; QStringList strings; const QVariantList list(var.toList()); - foreach (const QVariant &variant, list) { + for (const QVariant &variant : list) { if (variant.canConvert(QVariant::String)) strings << variant.toString(); else diff --git a/src/activeqt/shared/qaxutils.cpp b/src/activeqt/shared/qaxutils.cpp index 51c0a1b..fde7dc6 100644 --- a/src/activeqt/shared/qaxutils.cpp +++ b/src/activeqt/shared/qaxutils.cpp @@ -95,7 +95,8 @@ HRGN qaxHrgnFromQRegion(QRegion region, const QWindow *window) addRectToHrgn(hRegion, region.boundingRect()); return hRegion; } - foreach (const QRect &rect, region.rects()) + const QVector<QRect> &rects = region.rects(); + for (const QRect &rect : rects) addRectToHrgn(hRegion, rect); return hRegion; } diff --git a/src/tools/idc/main.cpp b/src/tools/idc/main.cpp index 7d0c888..cceae07 100644 --- a/src/tools/idc/main.cpp +++ b/src/tools/idc/main.cpp @@ -177,9 +177,6 @@ static bool attachTypeLibrary(const QString &applicationName, int resource, cons static HMODULE loadLibraryQt(const QString &input) { const wchar_t *inputC = reinterpret_cast<const wchar_t *>(input.utf16()); - if (QSysInfo::windowsVersion() < QSysInfo::WV_VISTA) - return LoadLibrary(inputC); // fallback for Windows XP and older - // Load DLL with the folder containing the DLL temporarily added to the search path when loading dependencies HMODULE result = LoadLibraryEx(inputC, NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_DEFAULT_DIRS); diff --git a/tools/dumpcpp/main.cpp b/tools/dumpcpp/main.cpp index 145f248..97915c1 100644 --- a/tools/dumpcpp/main.cpp +++ b/tools/dumpcpp/main.cpp @@ -899,7 +899,8 @@ void generateClassImpl(QTextStream &out, const QMetaObject *mo, const QByteArray static void formatCommentBlockFooter(const QString &typeLibFile, QTextStream &str) { str << " generated by dumpcpp v" << QT_VERSION_STR << " using\n**"; - foreach (const QString &arg, QCoreApplication::arguments()) + const QStringList arguments = QCoreApplication::arguments(); + for (const QString &arg : arguments) str << ' ' << arg; str << "\n** from the type library " << typeLibFile << "\n**\n" << "****************************************************************************/\n\n"; @@ -1128,7 +1129,7 @@ bool generateTypeLibrary(QString typeLibFile, QString outname, declOut << '}' << endl << endl; } } - foreach (const QByteArray &opaquePointerType, opaquePointerTypes) + for (const QByteArray &opaquePointerType : qAsConst(opaquePointerTypes)) declOut << "Q_DECLARE_OPAQUE_POINTER(" << opaquePointerType << "*)" << endl; declOut << endl; } diff --git a/tools/testcon/ambientproperties.cpp b/tools/testcon/ambientproperties.cpp index e69b365..ec1311d 100644 --- a/tools/testcon/ambientproperties.cpp +++ b/tools/testcon/ambientproperties.cpp @@ -69,7 +69,8 @@ void AmbientProperties::on_buttonBackground_clicked() p.setColor(container->backgroundRole(), c); container->setPalette(p); - foreach (QWidget *widget, mdiAreaWidgets()) { + const QWidgetList widgets = mdiAreaWidgets(); + for (QWidget *widget : widgets) { p = widget->palette(); p.setColor(widget->backgroundRole(), c); widget->setPalette(p); @@ -88,7 +89,8 @@ void AmbientProperties::on_buttonForeground_clicked() p.setColor(container->foregroundRole(), c); container->setPalette(p); - foreach (QWidget *widget, mdiAreaWidgets()) { + const QWidgetList widgets = mdiAreaWidgets(); + for (QWidget *widget : widgets) { p = widget->palette(); p.setColor(widget->foregroundRole(), c); widget->setPalette(p); @@ -104,7 +106,8 @@ void AmbientProperties::on_buttonFont_clicked() fontSample->setFont( f ); container->setFont( f ); - foreach (QWidget *widget, mdiAreaWidgets()) + const QWidgetList widgets = mdiAreaWidgets(); + for (QWidget *widget : widgets) widget->setFont( f ); } @@ -117,9 +120,12 @@ void AmbientProperties::on_buttonEnabled_toggled(bool on) QWidgetList AmbientProperties::mdiAreaWidgets() const { QWidgetList result; - if (QMdiArea *mdiArea = qobject_cast<QMdiArea*>(container)) - foreach (QMdiSubWindow *subWindow, mdiArea->subWindowList()) + + if (QMdiArea *mdiArea = qobject_cast<QMdiArea*>(container)) { + const QList<QMdiSubWindow *> mdiSubWindows = mdiArea->subWindowList(); + for (const QMdiSubWindow *subWindow : mdiSubWindows) result.push_back(subWindow->widget()); + } return result; } diff --git a/tools/testcon/main.cpp b/tools/testcon/main.cpp index cce315c..2454084 100644 --- a/tools/testcon/main.cpp +++ b/tools/testcon/main.cpp @@ -95,7 +95,8 @@ int main( int argc, char **argv ) qInstallMessageHandler(redirectDebugOutput); MainWindow mw; - foreach (const QString &a, parser.positionalArguments()) { + const QStringList positionalArguments = parser.positionalArguments(); + for (const QString &a : positionalArguments) { if (a.startsWith(QLatin1Char('{')) && a.endsWith(QLatin1Char('}'))) mw.addControlFromClsid(a); else diff --git a/tools/testcon/mainwindow.cpp b/tools/testcon/mainwindow.cpp index bc69264..682c8e5 100644 --- a/tools/testcon/mainwindow.cpp +++ b/tools/testcon/mainwindow.cpp @@ -35,11 +35,14 @@ #include <QtWidgets/QMdiArea> #include <QtWidgets/QMdiSubWindow> +#include <QtWidgets/QDialogButtonBox> #include <QtWidgets/QFileDialog> #include <QtWidgets/QInputDialog> #include <QtWidgets/QMessageBox> #include <QtGui/QCloseEvent> +#include <QtGui/QPixmap> #include <QtCore/QDebug> +#include <QtCore/QLibraryInfo> #include <QtCore/qt_windows.h> #include <ActiveQt/QAxScriptManager> #include <ActiveQt/QAxSelect> @@ -109,7 +112,8 @@ QAxWidget *MainWindow::activeAxWidget() const QList<QAxWidget *> MainWindow::axWidgets() const { QList<QAxWidget *> result; - foreach (const QMdiSubWindow *subWindow, m_mdiArea->subWindowList()) + const QList<QMdiSubWindow *> mdiSubWindows = m_mdiArea->subWindowList(); + for (const QMdiSubWindow *subWindow : mdiSubWindows) if (QAxWidget *axWidget = qobject_cast<QAxWidget *>(subWindow->widget())) result.push_back(axWidget); return result; @@ -126,9 +130,11 @@ bool MainWindow::addControlFromClsid(const QString &clsid) updateGUI(); } else { delete container; - QMessageBox::information(this, - tr("Error Loading Control"), - tr("The control \"%1\" could not be loaded.").arg(clsid)); + logTabWidget->setCurrentIndex(logTabWidget->count() - 1); + const QString message = + tr("The control \"%1\" could not be loaded." + " See the \"Debug log\" tab for details.").arg(clsid); + QMessageBox::information(this, tr("Error Loading Control"), message); } return result; } @@ -395,7 +401,8 @@ bool MainWindow::loadScript(const QString &file) m_scripts->addObject(this); } - foreach (QAxWidget *axWidget, axWidgets()) { + const QList<QAxWidget *> axw = axWidgets(); + for (QAxWidget *axWidget : axw) { QAxBase *ax = axWidget; m_scripts->addObject(ax); } @@ -413,6 +420,50 @@ bool MainWindow::loadScript(const QString &file) #endif } +void MainWindow::on_actionAbout_Qt_triggered() +{ + QApplication::aboutQt(); +} + +class VersionDialog : public QDialog +{ +public: + explicit VersionDialog(QWidget *parent = nullptr); +}; + +const char aboutTextFormat[] = QT_TRANSLATE_NOOP("MainWindow", +"<h3>Testcon - An ActiveX Test Container</h3>\nVersion: %1<br/><br/>\n" +"This application implements a generic test container for ActiveX controls." +"<br/><br/>Copyright (C) %2 The Qt Company Ltd."); + +VersionDialog::VersionDialog(QWidget *parent) : QDialog(parent) +{ + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + setWindowTitle(tr("About Testcon")); + QGridLayout *layout = new QGridLayout(this); + QLabel *logoLabel = new QLabel; + logoLabel->setPixmap(QStringLiteral(":/qt-project.org/qmessagebox/images/qtlogo-64.png")); + const QString aboutText = + tr(aboutTextFormat).arg(QLatin1String(QLibraryInfo::build()), + QStringLiteral("2017")); + QLabel *aboutLabel = new QLabel(aboutText); + aboutLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); + aboutLabel->setWordWrap(true); + aboutLabel->setOpenExternalLinks(true); + + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); + connect(buttonBox , &QDialogButtonBox::rejected, this, &QDialog::reject); + layout->addWidget(logoLabel, 0, 0, 1, 1); + layout->addWidget(aboutLabel, 0, 1, 4, 4); + layout->addWidget(buttonBox, 4, 2, 1, 1); +} + +void MainWindow::on_actionAbout_Testcon_triggered() +{ + VersionDialog versionDialog(this); + versionDialog.exec(); +} + void MainWindow::updateGUI() { QAxWidget *container = activeAxWidget(); @@ -434,7 +485,8 @@ void MainWindow::updateGUI() if (m_dlgProperties) m_dlgProperties->setControl(hasControl ? container : 0); - foreach (QAxWidget *container, axWidgets()) { + const QList<QAxWidget *> axw = axWidgets(); + for (QAxWidget *container : axw) { container->disconnect(SIGNAL(signal(QString,int,void*))); if (actionLogSignals->isChecked()) connect(container, SIGNAL(signal(QString,int,void*)), this, SLOT(logSignal(QString,int,void*))); diff --git a/tools/testcon/mainwindow.h b/tools/testcon/mainwindow.h index 2c8d687..84cd2ce 100644 --- a/tools/testcon/mainwindow.h +++ b/tools/testcon/mainwindow.h @@ -84,6 +84,8 @@ protected slots: void on_actionScriptingRun_triggered(); void on_actionFreeUnusedDLLs_triggered(); + void on_actionAbout_Qt_triggered(); + void on_actionAbout_Testcon_triggered(); private: QAxWidget *activeAxWidget() const; diff --git a/tools/testcon/mainwindow.ui b/tools/testcon/mainwindow.ui index ad3443c..be61cd6 100644 --- a/tools/testcon/mainwindow.ui +++ b/tools/testcon/mainwindow.ui @@ -103,9 +103,9 @@ <enum>Raised</enum> </property> </widget> - <widget class="QTabWidget" name="TabWidget2" > + <widget class="QTabWidget" name="logTabWidget" > <property name="objectName" > - <string notr="true" >TabWidget2</string> + <string notr="true" >logTabWidget</string> </property> <property name="sizePolicy" > <sizepolicy> @@ -366,11 +366,19 @@ <addaction name="LoggingMenu" /> <addaction name="actionFreeUnusedDLLs"/> </widget> + <widget class="QMenu" name="menuHelp"> + <property name="title"> + <string>Help</string> + </property> + <addaction name="actionAbout_Testcon"/> + <addaction name="actionAbout_Qt"/> + </widget> <addaction name="FileMenu" /> <addaction name="ContainerMenu" /> <addaction name="ControlMenu" /> <addaction name="ScriptMenu" /> <addaction name="OptionsMenu" /> + <addaction name="menuHelp" /> </widget> <action name="actionFileExit" > <property name="objectName" > @@ -608,6 +616,16 @@ <string>Free Unused DLLs</string> </property> </action> + <action name="actionAbout_Testcon"> + <property name="text"> + <string>About Testcon</string> + </property> + </action> + <action name="actionAbout_Qt"> + <property name="text"> + <string>About Qt</string> + </property> + </action> <actiongroup name="actionGroupLogging" > <action name="actionLogSignals" > <property name="objectName" > |