Jacek Caban : vbscript: Added InvokeEx(DISPATCH_PROPERTYGET) implementation.
Alexandre Julliard
julliard at winehq.org
Wed Apr 30 13:32:52 CDT 2014
Module: wine
Branch: master
Commit: b4d30e92c91febe8658e8b5a18a34cd64570b38d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b4d30e92c91febe8658e8b5a18a34cd64570b38d
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Apr 30 11:31:56 2014 +0200
vbscript: Added InvokeEx(DISPATCH_PROPERTYGET) implementation.
---
dlls/vbscript/tests/run.c | 36 +++++++++++++++++++++++++++++++++++-
dlls/vbscript/vbdisp.c | 9 +++++++++
2 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index fe611ff..53ead45 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -244,7 +244,7 @@ static IServiceProvider caller_sp = { &ServiceProviderVtbl };
static void test_disp(IDispatch *disp)
{
- DISPID id, public_prop_id, public_prop2_id, public_func_id, public_sub_id, defvalget_id;
+ DISPID id, public_prop_id, public_prop2_id, public_func_id, public_sub_id, defvalget_id, gs_getter_id;
DISPID named_args[5] = {DISPID_PROPERTYPUT};
VARIANT v, args[5];
DISPPARAMS dp = {args, named_args};
@@ -443,6 +443,40 @@ static void test_disp(IDispatch *disp)
ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
+ str = a2bstr("gsGetProp");
+ hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &gs_getter_id);
+ SysFreeString(str);
+ ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres);
+ ok(gs_getter_id != -1, "gs_getter_id = -1\n");
+
+ V_VT(args) = VT_BOOL;
+ V_BOOL(args) = VARIANT_TRUE;
+ dp.cNamedArgs = 0;
+ dp.cArgs = 1;
+ V_VT(&v) = VT_I8;
+ hres = IDispatchEx_InvokeEx(dispex, gs_getter_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
+ ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
+ ok(V_VT(&v) == VT_BOOL && V_BOOL(&v), "V_VT(v) = %d\n", V_VT(&v));
+
+ hres = IDispatchEx_InvokeEx(dispex, gs_getter_id, 0, DISPATCH_PROPERTYGET, &dp, NULL, &ei, NULL);
+ ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
+
+ V_VT(args) = VT_BOOL;
+ V_BOOL(args) = VARIANT_FALSE;
+ dp.cArgs = 1;
+ V_VT(&v) = VT_I8;
+ hres = IDispatchEx_InvokeEx(dispex, gs_getter_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
+ ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
+ ok(V_VT(&v) == VT_BOOL && !V_BOOL(&v), "V_VT(v) = %d\n", V_VT(&v));
+
+ V_VT(args) = VT_BOOL;
+ V_BOOL(args) = VARIANT_TRUE;
+ V_VT(&v) = VT_I8;
+ dp.cArgs = 1;
+ hres = IDispatchEx_InvokeEx(dispex, gs_getter_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
+ ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
+ ok(V_VT(&v) == VT_BOOL && V_BOOL(&v), "V_VT(v) = %d\n", V_VT(&v));
+
IDispatchEx_Release(dispex);
}
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index e8fb107..99f975a 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -391,6 +391,15 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
function_t *func;
switch(wFlags) {
+ case DISPATCH_PROPERTYGET:
+ func = This->desc->funcs[id].entries[VBDISP_CALLGET];
+ if(!func || (func->type != FUNC_PROPGET && func->type != FUNC_DEFGET)) {
+ WARN("no getter\n");
+ return DISP_E_MEMBERNOTFOUND;
+ }
+
+ return exec_script(This->desc->ctx, func, This, pdp, pvarRes);
+
case DISPATCH_METHOD:
case DISPATCH_METHOD|DISPATCH_PROPERTYGET:
func = This->desc->funcs[id].entries[VBDISP_CALLGET];
More information about the wine-cvs
mailing list