summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2022-10-20 18:03:30 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2022-10-21 08:44:20 +0200
commit75994086898237cc9199d4619c3cfd2424c28e52 (patch)
tree181358c0e0da84070466a5185fcf2e7aaaec7c06 /src
parent201d40e4daafa7fd6f2d8f4237f393847550052d (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 Pick-to: 6.4 Change-Id: Ia49bd0fb575f50a7a8c1f9d5f1bc09b3547256fb Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'src')
-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 e13a5df..ac52583 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());