Jacek Caban : vbscript: Support DISP_E_EXCEPTION Invoke[Ex] return value.

Alexandre Julliard julliard at winehq.org
Thu Oct 31 17:39:29 CDT 2019


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Oct 31 19:16:29 2019 +0100

vbscript: Support DISP_E_EXCEPTION Invoke[Ex] return value.

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

---

 dlls/vbscript/tests/error.vbs | 16 ++++++++++++++++
 dlls/vbscript/tests/run.c     | 11 ++++++++++-
 dlls/vbscript/vbdisp.c        | 19 +++++++++++++++----
 3 files changed, 41 insertions(+), 5 deletions(-)

diff --git a/dlls/vbscript/tests/error.vbs b/dlls/vbscript/tests/error.vbs
index 13f9a2072e..1853f6c4bf 100644
--- a/dlls/vbscript/tests/error.vbs
+++ b/dlls/vbscript/tests/error.vbs
@@ -457,4 +457,20 @@ end sub
 
 call testVBErrorCodes
 
+on error resume next
+
+throwWithDesc
+ok err.number = &hdeadbeef&, "err.number = " & hex(err.number)
+ok err.description = "test", "err.description = " & err.description
+ok err.helpcontext = 10, "err.helpcontext = " & err.helpcontext
+ok err.helpfile = "test.chm", "err.helpfile = " & err.helpfile
+
+throwWithDesc = 1
+ok err.number = &hdeadbeef&, "err.number = " & hex(err.number)
+ok err.description = "test", "err.description = " & err.description
+ok err.helpcontext = 10, "err.helpcontext = " & err.helpcontext
+ok err.helpfile = "test.chm", "err.helpfile = " & err.helpfile
+
+on error goto 0
+
 call reportSuccess()
diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index b7a204f919..9354cae309 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -139,6 +139,7 @@ DEFINE_EXPECT(OnLeaveScript);
 #define DISPID_GLOBAL_WEEKSTARTDAY  1021
 #define DISPID_GLOBAL_GLOBALCALLBACK  1022
 #define DISPID_GLOBAL_TESTERROROBJECT 1023
+#define DISPID_GLOBAL_THROWWITHDESC   1024
 
 #define DISPID_TESTOBJ_PROPGET      2000
 #define DISPID_TESTOBJ_PROPPUT      2001
@@ -1105,7 +1106,8 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
         { L"testArray",       DISPID_GLOBAL_TESTARRAY },
         { L"throwInt",        DISPID_GLOBAL_THROWINT },
         { L"testOptionalArg", DISPID_GLOBAL_TESTOPTIONALARG },
-        { L"testErrorObject", DISPID_GLOBAL_TESTERROROBJECT }
+        { L"testErrorObject", DISPID_GLOBAL_TESTERROROBJECT },
+        { L"throwWithDesc",   DISPID_GLOBAL_THROWWITHDESC }
     };
 
     test_grfdex(grfdex, fdexNameCaseInsensitive);
@@ -1463,6 +1465,13 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
         }
 
         return hres;
+
+    case DISPID_GLOBAL_THROWWITHDESC:
+        pei->scode = 0xdeadbeef;
+        pei->bstrDescription = SysAllocString(L"test");
+        pei->bstrHelpFile = SysAllocString(L"test.chm");
+        pei->dwHelpContext = 10;
+        return DISP_E_EXCEPTION;
     }
 
     case DISPID_GLOBAL_TESTOPTIONALARG: {
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index 1dd6d4ed05..25a80fc89d 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -952,15 +952,21 @@ HRESULT disp_call(script_ctx_t *ctx, IDispatch *disp, DISPID id, DISPPARAMS *dp,
         return invoke_vbdisp(vbdisp, id, flags, FALSE, dp, retv);
 
     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
-    if(FAILED(hres)) {
+    if(SUCCEEDED(hres)) {
+        hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, retv, &ei, NULL /* CALLER_FIXME */);
+        IDispatchEx_Release(dispex);
+    }else {
         UINT err = 0;
 
         TRACE("using IDispatch\n");
-        return IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, retv, &ei, &err);
+        hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, retv, &ei, &err);
     }
 
-    hres = IDispatchEx_InvokeEx(dispex, id, ctx->lcid, flags, dp, retv, &ei, NULL /* CALLER_FIXME */);
-    IDispatchEx_Release(dispex);
+    if(hres == DISP_E_EXCEPTION) {
+        clear_ei(&ctx->ei);
+        ctx->ei = ei;
+        hres = SCRIPT_E_RECORDED;
+    }
     return hres;
 }
 
@@ -994,5 +1000,10 @@ HRESULT disp_propput(script_ctx_t *ctx, IDispatch *disp, DISPID id, WORD flags,
         hres = IDispatch_Invoke(disp, id, &IID_NULL, ctx->lcid, flags, dp, NULL, &ei, &err);
     }
 
+    if(hres == DISP_E_EXCEPTION) {
+        clear_ei(&ctx->ei);
+        ctx->ei = ei;
+        hres = SCRIPT_E_RECORDED;
+    }
     return hres;
 }




More information about the wine-cvs mailing list