oleaut32: Always use DISPID_PROPERTYPUT to fill in the last argument.
This commit is contained in:
parent
33b45cf98d
commit
5893f3227c
|
@ -594,6 +594,15 @@ static HRESULT WINAPI Widget_ByRefUInt(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI Widget_put_prop_opt_arg(
|
||||||
|
IWidget* iface, INT opt, INT i)
|
||||||
|
{
|
||||||
|
trace("put_prop_opt_arg(%08x, %08x)\n", opt, i);
|
||||||
|
todo_wine ok(opt == 0, "got opt=%08x\n", opt);
|
||||||
|
ok(i == 0xcafe, "got i=%08x\n", i);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct IWidgetVtbl Widget_VTable =
|
static const struct IWidgetVtbl Widget_VTable =
|
||||||
{
|
{
|
||||||
Widget_QueryInterface,
|
Widget_QueryInterface,
|
||||||
|
@ -627,6 +636,7 @@ static const struct IWidgetVtbl Widget_VTable =
|
||||||
Widget_get_prop_int,
|
Widget_get_prop_int,
|
||||||
Widget_get_prop_uint,
|
Widget_get_prop_uint,
|
||||||
Widget_ByRefUInt,
|
Widget_ByRefUInt,
|
||||||
|
Widget_put_prop_opt_arg,
|
||||||
};
|
};
|
||||||
|
|
||||||
static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject)
|
static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject)
|
||||||
|
@ -1387,6 +1397,19 @@ static void test_typelibmarshal(void)
|
||||||
VariantClear(&varresult);
|
VariantClear(&varresult);
|
||||||
VariantClear(&vararg[0]);
|
VariantClear(&vararg[0]);
|
||||||
|
|
||||||
|
/* test propput with optional argument. */
|
||||||
|
VariantInit(&vararg[0]);
|
||||||
|
V_VT(&vararg[0]) = VT_I4;
|
||||||
|
V_I4(&vararg[0]) = 0xcafe;
|
||||||
|
dispparams.cNamedArgs = 1;
|
||||||
|
dispparams.rgdispidNamedArgs = &dispidNamed;
|
||||||
|
dispparams.cArgs = 1;
|
||||||
|
dispparams.rgvarg = vararg;
|
||||||
|
VariantInit(&varresult);
|
||||||
|
hr = IDispatch_Invoke(pDispatch, DISPID_TM_PROP_OPT_ARG, &IID_NULL, 0x40c, DISPATCH_PROPERTYPUT, &dispparams, &varresult, &excepinfo, NULL);
|
||||||
|
ok_ole_success(hr, ITypeInfo_Invoke);
|
||||||
|
VariantClear(&varresult);
|
||||||
|
|
||||||
IDispatch_Release(pDispatch);
|
IDispatch_Release(pDispatch);
|
||||||
IWidget_Release(pWidget);
|
IWidget_Release(pWidget);
|
||||||
|
|
||||||
|
|
|
@ -140,6 +140,9 @@ library TestTypelib
|
||||||
|
|
||||||
[id(DISPID_TM_BYREF_UINT)]
|
[id(DISPID_TM_BYREF_UINT)]
|
||||||
HRESULT ByRefUInt([in, out] UINT *i);
|
HRESULT ByRefUInt([in, out] UINT *i);
|
||||||
|
|
||||||
|
[id(DISPID_TM_PROP_OPT_ARG), propput]
|
||||||
|
HRESULT prop_opt_arg([in,optional] INT opt, [in] INT i);
|
||||||
}
|
}
|
||||||
|
|
||||||
[
|
[
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#define DISPID_TM_PROP_INT 19
|
#define DISPID_TM_PROP_INT 19
|
||||||
#define DISPID_TM_PROP_UINT 20
|
#define DISPID_TM_PROP_UINT 20
|
||||||
#define DISPID_TM_BYREF_UINT 21
|
#define DISPID_TM_BYREF_UINT 21
|
||||||
|
#define DISPID_TM_PROP_OPT_ARG 22
|
||||||
|
|
||||||
#define DISPID_NOA_BSTRRET 1
|
#define DISPID_NOA_BSTRRET 1
|
||||||
#define DISPID_NOA_ERROR 2
|
#define DISPID_NOA_ERROR 2
|
||||||
|
|
|
@ -6065,9 +6065,6 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
|
||||||
hres = DISP_E_PARAMNOTFOUND;
|
hres = DISP_E_PARAMNOTFOUND;
|
||||||
goto func_fail;
|
goto func_fail;
|
||||||
}
|
}
|
||||||
/* ignore the DISPID_PROPERTYPUT named argument from now on */
|
|
||||||
cNamedArgs--;
|
|
||||||
rgdispidNamedArgs++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (func_desc->cParamsOpt < 0 && cNamedArgs)
|
if (func_desc->cParamsOpt < 0 && cNamedArgs)
|
||||||
|
@ -6105,7 +6102,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
|
||||||
USHORT j;
|
USHORT j;
|
||||||
src_arg = NULL;
|
src_arg = NULL;
|
||||||
for (j = 0; j < cNamedArgs; j++)
|
for (j = 0; j < cNamedArgs; j++)
|
||||||
if (rgdispidNamedArgs[j] == i)
|
if (rgdispidNamedArgs[j] == i || (i == func_desc->cParams-1 && rgdispidNamedArgs[j] == DISPID_PROPERTYPUT))
|
||||||
{
|
{
|
||||||
src_arg = &pDispParams->rgvarg[j];
|
src_arg = &pDispParams->rgvarg[j];
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue