vbscript: Added ScriptDisp::InvokeEx implementation.

This commit is contained in:
Jacek Caban 2012-09-07 15:10:17 +02:00 committed by Alexandre Julliard
parent 40001df45d
commit 11d2dfaea9
1 changed files with 30 additions and 3 deletions

View File

@ -97,7 +97,7 @@ static VARIANT *get_propput_arg(const DISPPARAMS *dp)
return NULL;
}
static HRESULT invoke_variant_prop(vbdisp_t *This, VARIANT *v, WORD flags, DISPPARAMS *dp, VARIANT *res)
static HRESULT invoke_variant_prop(VARIANT *v, WORD flags, DISPPARAMS *dp, VARIANT *res)
{
HRESULT hres;
@ -403,7 +403,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
}
if(id < This->desc->prop_cnt + This->desc->func_cnt)
return invoke_variant_prop(This, This->props+(id-This->desc->func_cnt), wFlags, pdp, pvarRes);
return invoke_variant_prop(This->props+(id-This->desc->func_cnt), wFlags, pdp, pvarRes);
if(This->desc->builtin_prop_cnt) {
unsigned min = 0, max = This->desc->builtin_prop_cnt-1, i;
@ -579,6 +579,11 @@ static inline DISPID ident_to_id(ScriptDisp *This, ident_map_t *ident)
return (ident-This->ident_map)+1;
}
static inline ident_map_t *id_to_ident(ScriptDisp *This, DISPID id)
{
return 0 < id && id <= This->ident_map_cnt ? This->ident_map+id-1 : NULL;
}
static ident_map_t *add_ident(ScriptDisp *This, const WCHAR *name)
{
ident_map_t *ret;
@ -748,8 +753,30 @@ static HRESULT WINAPI ScriptDisp_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
{
ScriptDisp *This = ScriptDisp_from_IDispatchEx(iface);
ident_map_t *ident;
HRESULT hres;
TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
return DISP_E_MEMBERNOTFOUND;
ident = id_to_ident(This, id);
if(!ident)
return DISP_E_MEMBERNOTFOUND;
if(ident->is_var) {
if(ident->u.var->is_const) {
FIXME("const not supported\n");
return E_NOTIMPL;
}
return invoke_variant_prop(&ident->u.var->v, wFlags, pdp, pvarRes);
}
IActiveScriptSite_OnEnterScript(This->ctx->site);
hres = exec_script(This->ctx, ident->u.func, NULL, pdp, pvarRes);
IActiveScriptSite_OnLeaveScript(This->ctx->site);
return hres;
}
static HRESULT WINAPI ScriptDisp_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)