Jacek Caban : vbscript: Don't use IDispatchEx for internal calls.

Alexandre Julliard julliard at winehq.org
Thu Oct 17 16:01:26 CDT 2019


Module: wine
Branch: master
Commit: be253c1dc9cbf9e48c2413ae73012feb27eaf280
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=be253c1dc9cbf9e48c2413ae73012feb27eaf280

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Oct 17 22:46:17 2019 +0200

vbscript: Don't use IDispatchEx for internal calls.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/vbscript/tests/run.c |  2 --
 dlls/vbscript/vbdisp.c    | 17 ++++++++++++++---
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index 2791244ac7..f323a1ec85 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -1610,9 +1610,7 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
         memset(&ei, 0, sizeof(ei));
         hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_METHOD, &dp, &v, &ei, pspCaller);
         ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
-        todo_wine
         CHECK_CALLED(OnEnterScript);
-        todo_wine
         CHECK_CALLED(OnLeaveScript);
         ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
         ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v));
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index 60ca5c8b0e..1c0911a637 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -266,7 +266,7 @@ static HRESULT invoke_vbdisp(vbdisp_t *This, DISPID id, DWORD flags, BOOL extern
                 return DISP_E_MEMBERNOTFOUND;
             }
 
-            return exec_script(This->desc->ctx, FALSE, func, This, params, res);
+            return exec_script(This->desc->ctx, extern_caller, func, This, params, res);
 
         case DISPATCH_METHOD:
         case DISPATCH_METHOD|DISPATCH_PROPERTYGET:
@@ -276,7 +276,8 @@ static HRESULT invoke_vbdisp(vbdisp_t *This, DISPID id, DWORD flags, BOOL extern
                 return DISP_E_MEMBERNOTFOUND;
             }
 
-            return exec_script(This->desc->ctx, FALSE, func, This, params, res);
+            return exec_script(This->desc->ctx, extern_caller, func, This, params, res);
+
         case DISPATCH_PROPERTYPUT:
         case DISPATCH_PROPERTYPUTREF:
         case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF: {
@@ -301,7 +302,7 @@ static HRESULT invoke_vbdisp(vbdisp_t *This, DISPID id, DWORD flags, BOOL extern
                 return DISP_E_MEMBERNOTFOUND;
             }
 
-            hres = exec_script(This->desc->ctx, FALSE, func, This, &dp, NULL);
+            hres = exec_script(This->desc->ctx, extern_caller, func, This, &dp, NULL);
             if(needs_release)
                 VariantClear(&put_val);
             return hres;
@@ -1078,6 +1079,7 @@ HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id, DISPPARAMS *dp,
 {
     const WORD flags = DISPATCH_METHOD|(retv ? DISPATCH_PROPERTYGET : 0);
     IDispatchEx *dispex;
+    vbdisp_t *vbdisp;
     EXCEPINFO ei;
     HRESULT hres;
 
@@ -1085,6 +1087,10 @@ HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id, DISPPARAMS *dp,
     if(retv)
         V_VT(retv) = VT_EMPTY;
 
+    vbdisp = unsafe_impl_from_IDispatch(disp);
+    if(vbdisp && vbdisp->desc && vbdisp->desc->ctx == ctx)
+        return invoke_vbdisp(vbdisp, id, flags, FALSE, dp, retv);
+
     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
     if(FAILED(hres)) {
         UINT err = 0;
@@ -1107,9 +1113,14 @@ HRESULT get_disp_value(script_ctx_t *ctx, IDispatch *disp, VARIANT *v)
 HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD flags, DISPPARAMS *dp)
 {
     IDispatchEx *dispex;
+    vbdisp_t *vbdisp;
     EXCEPINFO ei = {0};
     HRESULT hres;
 
+    vbdisp = unsafe_impl_from_IDispatch(disp);
+    if(vbdisp && vbdisp->desc && vbdisp->desc->ctx == ctx)
+        return invoke_vbdisp(vbdisp, id, flags, FALSE, dp, NULL);
+
     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
     if(SUCCEEDED(hres)) {
         hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, NULL, &ei, NULL /* FIXME! */);




More information about the wine-cvs mailing list