summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2022-10-20 18:03:30 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-10-21 06:56:15 +0000
commit9ef3b870c93baef285dd7de6f5490c354c2230b1 (patch)
tree69e0e8015e504c84aec92d4da6870b3c61dc2cf8
parent77e6b8a0189ce1396d644cf4593518b97d58a4ca (diff)
AxServer: Accept unconventional IDispatch calls from python
The win32com python package calls IDispatch::Invoke for property setters with GET|METHOD flags, but only in-parameters set. Recognize that and add the PUT flag to indicate the special case, which allows us later tolerate such calls when unwrapping the in-parameter. Task-number: QTBUG-106024 Change-Id: Ia49bd0fb575f50a7a8c1f9d5f1bc09b3547256fb Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> (cherry picked from commit 75994086898237cc9199d4619c3cfd2424c28e52) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/activeqt/control/qaxserverbase.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/activeqt/control/qaxserverbase.cpp b/src/activeqt/control/qaxserverbase.cpp
index fdafbd0..1b84b90 100644
--- a/src/activeqt/control/qaxserverbase.cpp
+++ b/src/activeqt/control/qaxserverbase.cpp
@@ -2294,6 +2294,13 @@ HRESULT WINAPI QAxServerBase::Invoke(DISPID dispidMember, REFIID riid,
if (isWidget)
oldSizeHint = qt.widget->sizeHint();
+ if (wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD)
+ && !pvarResult && (pDispParams->cArgs || pDispParams->cNamedArgs)) {
+ // some client language might allow "value = object.bar = 'newvalue'", and
+ // call us with a get|method but without pvarResult set? QTBUG-106024
+ wFlags |= DISPATCH_PROPERTYPUT;
+ }
+
switch (wFlags) {
case DISPATCH_PROPERTYGET|DISPATCH_METHOD:
case DISPATCH_PROPERTYGET:
@@ -2521,6 +2528,7 @@ HRESULT WINAPI QAxServerBase::Invoke(DISPID dispidMember, REFIID riid,
break;
case DISPATCH_PROPERTYPUT:
case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF:
+ case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYGET|DISPATCH_METHOD:
{
if (index == -1) {
index = mo->indexOfProperty(name);
@@ -2535,10 +2543,11 @@ HRESULT WINAPI QAxServerBase::Invoke(DISPID dispidMember, REFIID riid,
return DISP_E_MEMBERNOTFOUND;
if (!pDispParams->cArgs)
return DISP_E_PARAMNOTOPTIONAL;
- if (pDispParams->cArgs != 1 ||
- pDispParams->cNamedArgs != 1 ||
- *pDispParams->rgdispidNamedArgs != DISPID_PROPERTYPUT)
- return DISP_E_BADPARAMCOUNT;
+ if (wFlags != (DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYGET|DISPATCH_METHOD)
+ && (pDispParams->cArgs != 1 || pDispParams->cNamedArgs != 1
+ || *pDispParams->rgdispidNamedArgs != DISPID_PROPERTYPUT)) {
+ return DISP_E_BADPARAMCOUNT;
+ }
QVariant var = VARIANTToQVariant(*pDispParams->rgvarg,
property.typeName(), property.metaType().id());