diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-10-17 15:15:50 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-10-19 08:21:35 +0000 |
commit | e2edd90ab131ed01f749ac493edaf52590cc212c (patch) | |
tree | 60382db98e8304fe9c391fa9e31d8cd0c3f78d79 | |
parent | c81aba034c8144618efc4ca1a88fc31f24a50f21 (diff) |
AxServer: Fix retrieving IID_IAxServerBase from IUnknown
As suggested in report, do the same for VT_UNKNOWN.
Fixes: QTBUG-106014
Change-Id: I09ecd5895a0caa409eed237e551af2a1fafdad00
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
(cherry picked from commit f735057e8b5b92f8b744a1d8d22e2c5e355ee20f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/activeqt/shared/qaxtypes.cpp | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/src/activeqt/shared/qaxtypes.cpp b/src/activeqt/shared/qaxtypes.cpp index 1733f09..83845b9 100644 --- a/src/activeqt/shared/qaxtypes.cpp +++ b/src/activeqt/shared/qaxtypes.cpp @@ -702,6 +702,25 @@ bool QVariantToVARIANT(const QVariant &var, VARIANT &arg, const QByteArray &type return true; } +#ifdef QAX_SERVER +static QVariant axServer(IUnknown *unknown, const QByteArray &typeName) +{ + IAxServerBase *iface = nullptr; + if (unknown && typeName != "IDispatch*" && typeName != "IUnknown*") + unknown->QueryInterface(IID_IAxServerBase, reinterpret_cast<void**>(&iface)); + if (iface == nullptr) + return {}; + + auto *qObj = iface->qObject(); + iface->Release(); + QByteArray pointerType = qObj ? QByteArray(qObj->metaObject()->className()) + '*' : typeName; + QMetaType pointerMetaType = QMetaType::fromName(pointerType); + if (pointerMetaType.id() == QMetaType::UnknownType) + pointerMetaType = QMetaType(qRegisterMetaType<QObject *>(pointerType)); + return QVariant(pointerMetaType, &qObj); +} +#endif // QAX_SERVER + #undef QVARIANT_TO_VARIANT_POD /* @@ -913,17 +932,8 @@ QVariant VARIANTToQVariant(const VARIANT &arg, const QByteArray &typeName, int t } } else { #ifdef QAX_SERVER - IAxServerBase *iface = 0; - if (disp && typeName != "IDispatch*") - disp->QueryInterface(IID_IAxServerBase, reinterpret_cast<void**>(&iface)); - if (iface) { - QObject *qObj = iface->qObject(); - iface->Release(); - QByteArray pointerType = qObj ? QByteArray(qObj->metaObject()->className()) + '*' : typeName; - QMetaType pointerMetaType = QMetaType::fromName(pointerType); - if (pointerMetaType.id() == QMetaType::UnknownType) - pointerMetaType = QMetaType(qRegisterMetaType<QObject *>(pointerType)); - var = QVariant(pointerMetaType, &qObj); + if (auto axs = axServer(disp, typeName); axs.isValid()) { + var = axs; } else #endif { @@ -967,6 +977,10 @@ QVariant VARIANTToQVariant(const VARIANT &arg, const QByteArray &typeName, int t else unkn = arg.punkVal; var.setValue(unkn); +#ifdef QAX_SERVER + if (auto axs = axServer(unkn, typeName); axs.isValid()) + var = axs; +#endif } break; case VT_ARRAY|VT_VARIANT: |