diff options
author | Nazar Babik <nazar@vikingsoftware.com> | 2019-02-05 16:59:27 +0100 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2019-04-30 11:11:04 +0000 |
commit | e060138205c0a680ddc99237ad0c1b44ba3fe514 (patch) | |
tree | ec603c1b2a7fe63f6c5f035320dbe80e7b4b1e03 | |
parent | 8fb524d9d7abfb159b97cec48eddced867568cb9 (diff) |
Fix QAxBase::dynamicCallHelper check of VT_BYREF
Remember the out-parameters arguments explicitly, because the Invoke
implementation might drop the VT_BYREF bit. Still check the original
and the modified bits to be safe in case the bit is added by Invoke.
Fixes: QTBUG-13845
Change-Id: I701aeb576528aa8a429c56d9caf77db34206cb37
Done-with: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
-rw-r--r-- | src/activeqt/container/qaxbase.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/activeqt/container/qaxbase.cpp b/src/activeqt/container/qaxbase.cpp index 722a389..18c662e 100644 --- a/src/activeqt/container/qaxbase.cpp +++ b/src/activeqt/container/qaxbase.cpp @@ -60,6 +60,7 @@ #include <qhash.h> #include <qset.h> #include <qpair.h> +#include <qbitarray.h> #include <qmetaobject.h> #include <qsettings.h> #include <qdebug.h> @@ -3947,9 +3948,11 @@ bool QAxBase::dynamicCallHelper(const char *name, void *inout, QList<QVariant> & disptype = DISPATCH_PROPERTYGET; } } + QBitArray outArgs; if (varc) { varc = qMin(varc, d->metaobj->numParameter(normFunction)); arg = varc <= QAX_NUM_PARAMS ? staticarg : new VARIANT[varc]; + outArgs = QBitArray(varc); for (int i = 0; i < varc; ++i) { QVariant var(vars.at(i)); VariantInit(arg + (varc - i - 1)); @@ -3972,6 +3975,7 @@ bool QAxBase::dynamicCallHelper(const char *name, void *inout, QList<QVariant> & if (arg[varc - i - 1].vt == VT_EMPTY) QVariantToVARIANT(var, arg[varc - i - 1], paramType, out); + outArgs[i] = out; } } @@ -4004,7 +4008,7 @@ bool QAxBase::dynamicCallHelper(const char *name, void *inout, QList<QVariant> & if (disptype == (DISPATCH_METHOD|DISPATCH_PROPERTYGET) && hres == S_OK && varc) { for (int i = 0; i < varc; ++i) - if (arg[varc-i-1].vt & VT_BYREF) // update out-parameters + if ((arg[varc-i-1].vt & VT_BYREF) || outArgs[i]) // update out-parameters vars[i] = VARIANTToQVariant(arg[varc-i-1], vars.at(i).typeName()); } |