diff options
Diffstat (limited to 'src/corelib/plugin')
-rw-r--r-- | src/corelib/plugin/qfactoryloader.cpp | 38 | ||||
-rw-r--r-- | src/corelib/plugin/qlibrary.cpp | 2 | ||||
-rw-r--r-- | src/corelib/plugin/qlibrary_win.cpp | 11 | ||||
-rw-r--r-- | src/corelib/plugin/qplugin.qdoc | 6 |
4 files changed, 25 insertions, 32 deletions
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index c820d53f91..c09dc6c22b 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -56,18 +56,6 @@ QT_BEGIN_NAMESPACE -namespace { - -// avoid duplicate QStringLiteral data: -inline QString iidKeyLiteral() { return QStringLiteral("IID"); } -#ifdef QT_SHARED -inline QString versionKeyLiteral() { return QStringLiteral("version"); } -#endif -inline QString metaDataKeyLiteral() { return QStringLiteral("MetaData"); } -inline QString keysKeyLiteral() { return QStringLiteral("Keys"); } - -} - class QFactoryLoaderPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QFactoryLoader) @@ -167,12 +155,12 @@ void QFactoryLoader::update() QStringList keys; bool metaDataOk = false; - QString iid = library->metaData.value(iidKeyLiteral()).toString(); + QString iid = library->metaData.value(QLatin1String("IID")).toString(); if (iid == QLatin1String(d->iid.constData(), d->iid.size())) { - QJsonObject object = library->metaData.value(metaDataKeyLiteral()).toObject(); + QJsonObject object = library->metaData.value(QLatin1String("MetaData")).toObject(); metaDataOk = true; - QJsonArray k = object.value(keysKeyLiteral()).toArray(); + QJsonArray k = object.value(QLatin1String("Keys")).toArray(); for (int i = 0; i < k.size(); ++i) keys += d->cs ? k.at(i).toString() : k.at(i).toString().toLower(); } @@ -195,9 +183,9 @@ void QFactoryLoader::update() QLibraryPrivate *previous = d->keyMap.value(key); int prev_qt_version = 0; if (previous) { - prev_qt_version = (int)previous->metaData.value(versionKeyLiteral()).toDouble(); + prev_qt_version = (int)previous->metaData.value(QLatin1String("version")).toDouble(); } - int qt_version = (int)library->metaData.value(versionKeyLiteral()).toDouble(); + int qt_version = (int)library->metaData.value(QLatin1String("version")).toDouble(); if (!previous || (prev_qt_version > QT_VERSION && qt_version <= QT_VERSION)) { d->keyMap[key] = library; ++keyUsageCount; @@ -280,7 +268,7 @@ QList<QJsonObject> QFactoryLoader::metaData() const const auto staticPlugins = QPluginLoader::staticPlugins(); for (const QStaticPlugin &plugin : staticPlugins) { const QJsonObject object = plugin.metaData(); - if (object.value(iidKeyLiteral()) != QLatin1String(d->iid.constData(), d->iid.size())) + if (object.value(QLatin1String("IID")) != QLatin1String(d->iid.constData(), d->iid.size())) continue; metaData.append(object); } @@ -314,7 +302,7 @@ QObject *QFactoryLoader::instance(int index) const QVector<QStaticPlugin> staticPlugins = QPluginLoader::staticPlugins(); for (int i = 0; i < staticPlugins.count(); ++i) { const QJsonObject object = staticPlugins.at(i).metaData(); - if (object.value(iidKeyLiteral()) != QLatin1String(d->iid.constData(), d->iid.size())) + if (object.value(QLatin1String("IID")) != QLatin1String(d->iid.constData(), d->iid.size())) continue; if (index == 0) @@ -328,12 +316,10 @@ QObject *QFactoryLoader::instance(int index) const QMultiMap<int, QString> QFactoryLoader::keyMap() const { QMultiMap<int, QString> result; - const QString metaDataKey = metaDataKeyLiteral(); - const QString keysKey = keysKeyLiteral(); const QList<QJsonObject> metaDataList = metaData(); for (int i = 0; i < metaDataList.size(); ++i) { - const QJsonObject metaData = metaDataList.at(i).value(metaDataKey).toObject(); - const QJsonArray keys = metaData.value(keysKey).toArray(); + const QJsonObject metaData = metaDataList.at(i).value(QLatin1String("MetaData")).toObject(); + const QJsonArray keys = metaData.value(QLatin1String("Keys")).toArray(); const int keyCount = keys.size(); for (int k = 0; k < keyCount; ++k) result.insert(i, keys.at(k).toString()); @@ -343,12 +329,10 @@ QMultiMap<int, QString> QFactoryLoader::keyMap() const int QFactoryLoader::indexOf(const QString &needle) const { - const QString metaDataKey = metaDataKeyLiteral(); - const QString keysKey = keysKeyLiteral(); const QList<QJsonObject> metaDataList = metaData(); for (int i = 0; i < metaDataList.size(); ++i) { - const QJsonObject metaData = metaDataList.at(i).value(metaDataKey).toObject(); - const QJsonArray keys = metaData.value(keysKey).toArray(); + const QJsonObject metaData = metaDataList.at(i).value(QLatin1String("MetaData")).toObject(); + const QJsonArray keys = metaData.value(QLatin1String("Keys")).toArray(); const int keyCount = keys.size(); for (int k = 0; k < keyCount; ++k) { if (!keys.at(k).toString().compare(needle, Qt::CaseInsensitive)) diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 9babfa4d91..ff04116705 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -1096,8 +1096,6 @@ QString QLibrary::errorString() const to the library \c shr_64.o in the archive file named \c libGL.a. This is only supported on the AIX platform. - Setting PreventUnloadHint will only apply on Unix platforms. - The interpretation of the load hints is platform dependent, and if you use it you are probably making some assumptions on which platform you are compiling for, so use them only if you understand the consequences diff --git a/src/corelib/plugin/qlibrary_win.cpp b/src/corelib/plugin/qlibrary_win.cpp index 982035b49b..48aa0cdbb6 100644 --- a/src/corelib/plugin/qlibrary_win.cpp +++ b/src/corelib/plugin/qlibrary_win.cpp @@ -134,6 +134,17 @@ bool QLibraryPrivate::load_sys() qualifiedFileName = moduleFileName; else qualifiedFileName = dir.filePath(moduleFileName); + + if (loadHints() & QLibrary::PreventUnloadHint) { + // prevent the unloading of this component + HMODULE hmod; + bool ok = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_PIN | + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, + reinterpret_cast<const wchar_t *>(pHnd), + &hmod); + Q_ASSERT(!ok || hmod == pHnd); + Q_UNUSED(ok); + } #endif // !Q_OS_WINRT } return (pHnd != 0); diff --git a/src/corelib/plugin/qplugin.qdoc b/src/corelib/plugin/qplugin.qdoc index 5dcc14b64b..968fb4820a 100644 --- a/src/corelib/plugin/qplugin.qdoc +++ b/src/corelib/plugin/qplugin.qdoc @@ -44,11 +44,11 @@ to the interface class called \a ClassName. The \a Identifier must be unique. For example: - \snippet plugandpaint/interfaces.h 3 + \snippet plugandpaint/app/interfaces.h 3 This macro is normally used right after the class definition for \a ClassName, in a header file. See the - \l{tools/plugandpaint}{Plug & Paint} example for details. + \l{tools/plugandpaint/app}{Plug & Paint} example for details. If you want to use Q_DECLARE_INTERFACE with interface classes declared in a namespace then you have to make sure the Q_DECLARE_INTERFACE @@ -76,7 +76,7 @@ \snippet code/doc_src_qplugin.cpp 1 - See the \l{tools/plugandpaint}{Plug & Paint} example for details. + See the \l{tools/plugandpaint/app}{Plug & Paint} example for details. Note that the class this macro appears on must be default-constructible. |