summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--examples/activeqt/webbrowser/main.cpp6
-rw-r--r--src/activeqt/container/qaxbase.cpp16
-rw-r--r--src/activeqt/container/qaxscript.cpp22
-rw-r--r--src/activeqt/container/qaxselect.cpp99
-rw-r--r--src/activeqt/control/qaxfactory.h4
-rw-r--r--src/activeqt/control/qaxserver.cpp16
-rw-r--r--src/activeqt/control/qaxserverbase.cpp13
-rw-r--r--src/activeqt/control/qaxservermain.cpp15
-rw-r--r--src/activeqt/shared/qaxtypes.cpp2
-rw-r--r--src/activeqt/shared/qaxutils.cpp3
-rw-r--r--src/tools/idc/main.cpp3
-rw-r--r--tools/dumpcpp/main.cpp5
-rw-r--r--tools/testcon/ambientproperties.cpp16
-rw-r--r--tools/testcon/main.cpp3
-rw-r--r--tools/testcon/mainwindow.cpp64
-rw-r--r--tools/testcon/mainwindow.h2
-rw-r--r--tools/testcon/mainwindow.ui22
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("&nbsp;"));
+ 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&nbsp;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("&nbsp;"));
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" >