summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNazar Babik <nazar@vikingsoftware.com>2019-02-05 16:59:27 +0100
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2019-04-30 11:11:04 +0000
commite060138205c0a680ddc99237ad0c1b44ba3fe514 (patch)
treeec603c1b2a7fe63f6c5f035320dbe80e7b4b1e03
parent8fb524d9d7abfb159b97cec48eddced867568cb9 (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.cpp6
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());
}