mshtml: Don't use ITypeInfo for InvokeEx(DISPATCH_PROPERTYPUT) implementation.
This commit is contained in:
parent
c9eed8f987
commit
ba1d4d71d8
|
@ -810,6 +810,54 @@ static HRESULT builtin_propget(DispatchEx *This, func_info_t *func, DISPPARAMS *
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT builtin_propput(DispatchEx *This, func_info_t *func, DISPPARAMS *dp)
|
||||||
|
{
|
||||||
|
VARIANT *v, tmpv;
|
||||||
|
IUnknown *iface;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
if(dp->cArgs != 1 || (dp->cNamedArgs == 1 && *dp->rgdispidNamedArgs != DISPID_PROPERTYPUT)
|
||||||
|
|| dp->cNamedArgs > 1) {
|
||||||
|
FIXME("invalid args\n");
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!func->put_vtbl_off) {
|
||||||
|
FIXME("No setter\n");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = dp->rgvarg;
|
||||||
|
if(func->prop_vt != VT_VARIANT && V_VT(v) != func->prop_vt) {
|
||||||
|
V_VT(&tmpv) = VT_EMPTY;
|
||||||
|
VariantChangeType(&tmpv, v, 0, func->prop_vt);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
|
v = &tmpv;
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = IUnknown_QueryInterface(This->outer, tid_ids[func->tid], (void**)&iface);
|
||||||
|
if(SUCCEEDED(hres)) {
|
||||||
|
switch(func->prop_vt) {
|
||||||
|
#define CASE_VT(vt,type,access) \
|
||||||
|
case vt: \
|
||||||
|
hres = ((HRESULT (WINAPI*)(IUnknown*,type))((void**)iface->lpVtbl)[func->put_vtbl_off])(iface,access(v)); \
|
||||||
|
break
|
||||||
|
BUILTIN_TYPES_SWITCH;
|
||||||
|
#undef CASE_VT
|
||||||
|
default:
|
||||||
|
FIXME("Unimplemented vt %d\n", func->prop_vt);
|
||||||
|
hres = E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
IUnknown_Release(iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(v == &tmpv)
|
||||||
|
VariantClear(v);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp,
|
static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp,
|
||||||
VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
|
VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
|
||||||
{
|
{
|
||||||
|
@ -831,6 +879,11 @@ static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD
|
||||||
return function_invoke(This, func, flags, dp, res, ei);
|
return function_invoke(This, func, flags, dp, res, ei);
|
||||||
|
|
||||||
switch(flags) {
|
switch(flags) {
|
||||||
|
case DISPATCH_PROPERTYPUT:
|
||||||
|
if(res)
|
||||||
|
V_VT(res) = VT_EMPTY;
|
||||||
|
hres = builtin_propput(This, func, dp);
|
||||||
|
break;
|
||||||
case DISPATCH_PROPERTYGET:
|
case DISPATCH_PROPERTYGET:
|
||||||
hres = builtin_propget(This, func, dp, res);
|
hres = builtin_propget(This, func, dp, res);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue