From: Francis De Brabandere <francisdb@gmail.com> When a named item (REF_OBJ) is called with arguments, invoke its default property (DISPID_VALUE) instead of returning E_NOTIMPL. This is needed for patterns like PlayerScores(0).SetValue(1000) where PlayerScores is a named IDispatch object with a default indexed property. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53889 --- dlls/vbscript/interp.c | 7 +++-- dlls/vbscript/tests/lang.vbs | 4 +++ dlls/vbscript/tests/run.c | 53 ++++++++++++++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index 127fcc2c05e..6e165cc43db 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -650,8 +650,11 @@ static HRESULT do_icall(exec_ctx_t *ctx, VARIANT *res, BSTR identifier, unsigned break; case REF_OBJ: if(arg_cnt) { - FIXME("arguments on object\n"); - return E_NOTIMPL; + vbstack_to_dp(ctx, arg_cnt, FALSE, &dp); + hres = disp_call(ctx->script, ref.u.obj, DISPID_VALUE, &dp, res); + if(FAILED(hres)) + return hres; + break; } if(res) { diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 12d91a16548..73d9d65d431 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -2295,4 +2295,8 @@ f1 not 1 = 0 arr (0) = 2 xor -2 +' Test calling a named item object with arguments (DISPID_VALUE) +Call ok(indexedObj(3) = 6, "indexedObj(3) = " & indexedObj(3)) +Call ok(indexedObj(0) = 0, "indexedObj(0) = " & indexedObj(0)) + reportSuccess() diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c index 8aaafbedf54..5041961e6d3 100644 --- a/dlls/vbscript/tests/run.c +++ b/dlls/vbscript/tests/run.c @@ -1105,6 +1105,45 @@ static IDispatchExVtbl collectionObjVtbl = { static IDispatchEx collectionObj = { &collectionObjVtbl }; +static HRESULT WINAPI indexedObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + switch(id) { + case DISPID_VALUE: + ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags); + ok(pdp != NULL, "pdp == NULL\n"); + ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); + ok(pvarRes != NULL, "pvarRes == NULL\n"); + + V_VT(pvarRes) = VT_I2; + V_I2(pvarRes) = V_I2(pdp->rgvarg) * 2; + return S_OK; + } + + ok(0, "unexpected call %ld\n", id); + return E_NOTIMPL; +} + +static IDispatchExVtbl indexedObjVtbl = { + DispatchEx_QueryInterface, + DispatchEx_AddRef, + DispatchEx_Release, + DispatchEx_GetTypeInfoCount, + DispatchEx_GetTypeInfo, + DispatchEx_GetIDsOfNames, + DispatchEx_Invoke, + DispatchEx_GetDispID, + indexedObj_InvokeEx, + DispatchEx_DeleteMemberByName, + DispatchEx_DeleteMemberByDispID, + DispatchEx_GetMemberProperties, + DispatchEx_GetMemberName, + DispatchEx_GetNextDispID, + DispatchEx_GetNameSpaceParent +}; + +static IDispatchEx indexedObj = { &indexedObjVtbl }; + static ULONG refobj_ref; static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface) @@ -1935,10 +1974,16 @@ static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPC ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %lx\n", dwReturnMask); ok(!ppti, "ppti != NULL\n"); - if(lstrcmpW(pstrName, L"test")) + if(!lstrcmpW(pstrName, L"test")) { + *ppiunkItem = (IUnknown*)&Global; + }else if(!lstrcmpW(pstrName, L"indexedObj")) { + *ppiunkItem = (IUnknown*)&indexedObj; + }else { ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName)); + *ppiunkItem = NULL; + return E_FAIL; + } - *ppiunkItem = (IUnknown*)&Global; IUnknown_AddRef(*ppiunkItem); return S_OK; } @@ -2062,6 +2107,10 @@ static IActiveScript *create_and_init_script(DWORD flags, BOOL start) SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags); ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres); + hres = IActiveScript_AddNamedItem(engine, L"indexedObj", + SCRIPTITEM_ISVISIBLE); + ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres); + if (start) { hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10367