diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2022-10-20 18:03:30 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-10-21 06:56:15 +0000 |
commit | 9ef3b870c93baef285dd7de6f5490c354c2230b1 (patch) | |
tree | 69e0e8015e504c84aec92d4da6870b3c61dc2cf8 | |
parent | 77e6b8a0189ce1396d644cf4593518b97d58a4ca (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.cpp | 17 |
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()); |