Jacek Caban : vbscript: Added ScriptDisp::InvokeEx implementation.
Alexandre Julliard
julliard at winehq.org
Fri Sep 7 13:26:21 CDT 2012
Module: wine
Branch: master
Commit: 11d2dfaea9eb99c3bebfbb47658742de892e28f3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=11d2dfaea9eb99c3bebfbb47658742de892e28f3
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Sep 7 15:10:17 2012 +0200
vbscript: Added ScriptDisp::InvokeEx implementation.
---
dlls/vbscript/vbdisp.c | 33 ++++++++++++++++++++++++++++++---
1 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index 4f473e2..a76660e 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -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)
More information about the wine-cvs
mailing list