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