From be6067f9fbb88f6cfe40a63c9e8872a3242834bf Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 22 Dec 2015 14:24:12 +0100 Subject: [PATCH] WIP: Extract QAXServerBase from IUnknown for scripting. Reportedly fixes invocation from PyWin32. Task-number: QTBUG-12202 Change-Id: Ifa0161e7d060462c5bc167b67ec42c7404bcefde --- src/activeqt/shared/qaxtypes.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/activeqt/shared/qaxtypes.cpp b/src/activeqt/shared/qaxtypes.cpp index ba11ac2..68211ab 100644 --- a/src/activeqt/shared/qaxtypes.cpp +++ b/src/activeqt/shared/qaxtypes.cpp @@ -730,6 +730,21 @@ bool QVariantToVARIANT(const QVariant &var, VARIANT &arg, const QByteArray &type #undef QVARIANT_TO_VARIANT_POD +static bool serverQueryAxServerBase(IUnknown *disp, const QByteArray &typeName, QVariant *target) +{ + IAxServerBase *iface = Q_NULLPTR; + if (FAILED(disp->QueryInterface(IID_IAxServerBase, (void**)&iface)) || !iface) + return false; + QObject *qObj = iface->qObject(); + iface->Release(); + const QByteArray pointerType = qObj ? QByteArray(qObj->metaObject()->className()) + '*' : typeName; + int pointerTypeId = QMetaType::type(pointerType); + if (!pointerTypeId) + pointerTypeId = qRegisterMetaType(pointerType); + *target = QVariant(pointerTypeId, &qObj); + return true; +} + /*! Returns \a arg as a QVariant of type \a type. @@ -931,17 +946,7 @@ QVariant VARIANTToQVariant(const VARIANT &arg, const QByteArray &typeName, uint } } else { #ifdef QAX_SERVER - IAxServerBase *iface = 0; - if (disp && typeName != "IDispatch*") - disp->QueryInterface(IID_IAxServerBase, (void**)&iface); - if (iface) { - QObject *qObj = iface->qObject(); - iface->Release(); - QByteArray pointerType = qObj ? QByteArray(qObj->metaObject()->className()) + '*' : typeName; - int pointerTypeId = QMetaType::type(pointerType); - if (!pointerTypeId) - pointerTypeId = qRegisterMetaType(pointerType); - var = QVariant(pointerTypeId, &qObj); + if (disp && typeName != "IDispatch*" && serverQueryAxServerBase(disp, typeName, &var)) { } else #endif { @@ -979,6 +984,10 @@ QVariant VARIANTToQVariant(const VARIANT &arg, const QByteArray &typeName, uint unkn = *arg.ppunkVal; else unkn = arg.punkVal; +#ifdef QAX_SERVER + if (unkn && typeName != "IUnknown*" && serverQueryAxServerBase(unkn, typeName, &var)) { + } else +#endif var.setValue(unkn); } break; -- 2.5.0.windows.1