[2/2] oleaut32/tests: Add a test for calling a varargs method using typelib marshaller.
Dmitry Timoshkov
dmitry at baikal.ru
Fri Sep 4 02:24:34 CDT 2015
This test reproduces how an application that I have here calls Run() method
from msscript.ocx and fails due to a bug in the typelib marshaller.
---
dlls/oleaut32/tests/tmarshal.c | 29 +++++++++++++++++++++++++++--
dlls/oleaut32/tests/tmarshal.idl | 3 +++
dlls/oleaut32/tests/tmarshal_dispids.h | 1 +
3 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c
index e8d5e64..1893534 100644
--- a/dlls/oleaut32/tests/tmarshal.c
+++ b/dlls/oleaut32/tests/tmarshal.c
@@ -839,6 +839,13 @@ static HRESULT WINAPI Widget_neg_restrict(IWidget* iface, INT *i)
return S_OK;
}
+static HRESULT WINAPI Widget_VarArg_Run(
+ IWidget *iface, BSTR name, SAFEARRAY *params, VARIANT *result)
+{
+ trace("VarArg_Run(%p,%p,%p)\n", name, params, result);
+ return S_OK;
+}
+
static const struct IWidgetVtbl Widget_VTable =
{
Widget_QueryInterface,
@@ -876,7 +883,8 @@ static const struct IWidgetVtbl Widget_VTable =
Widget_put_prop_opt_arg,
Widget_put_prop_req_arg,
Widget_pos_restrict,
- Widget_neg_restrict
+ Widget_neg_restrict,
+ Widget_VarArg_Run
};
static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject)
@@ -1492,7 +1500,7 @@ static void test_typelibmarshal(void)
dispparams.rgdispidNamedArgs = NULL;
dispparams.rgvarg = vararg;
hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
- ok_ole_success(hr, ITypeInfo_Invoke);
+ ok_ole_success(hr, IDispatch_Invoke);
/* call VarArg, even one (non-optional, non-safearray) named argument is not allowed */
dispidNamed = 0;
@@ -1502,6 +1510,23 @@ static void test_typelibmarshal(void)
ok(hr == DISP_E_NONAMEDARGS, "IDispatch_Invoke should have returned DISP_E_NONAMEDARGS instead of 0x%08x\n", hr);
dispidNamed = DISPID_PROPERTYPUT;
+ /* call VarArg_Run */
+ VariantInit(&vararg[1]);
+ V_VT(&vararg[1]) = VT_BSTR;
+ V_BSTR(&vararg[1]) = SysAllocString(szCat);
+ VariantInit(&vararg[0]);
+ V_VT(&vararg[0]) = VT_BSTR;
+ V_BSTR(&vararg[0]) = SysAllocString(NULL);
+ dispparams.cNamedArgs = 0;
+ dispparams.cArgs = 2;
+ dispparams.rgdispidNamedArgs = NULL;
+ dispparams.rgvarg = vararg;
+ hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG_RUN, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
+todo_wine
+ ok_ole_success(hr, IDispatch_Invoke);
+ SysFreeString(V_BSTR(&vararg[1]));
+ SysFreeString(V_BSTR(&vararg[0]));
+
/* call Error */
dispparams.cNamedArgs = 0;
dispparams.cArgs = 0;
diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl
index 33a4df9..ff9cac3 100644
--- a/dlls/oleaut32/tests/tmarshal.idl
+++ b/dlls/oleaut32/tests/tmarshal.idl
@@ -179,6 +179,9 @@ library TestTypelib
[id(DISPID_TM_NEG_RESTRICTED), restricted]
HRESULT neg_restrict([out, retval] INT *i);
+
+ [id(DISPID_TM_VARARG_RUN), vararg]
+ HRESULT VarArg_Run([in] BSTR name, [in] SAFEARRAY(VARIANT) params, [out, retval] VARIANT *result);
}
[
diff --git a/dlls/oleaut32/tests/tmarshal_dispids.h b/dlls/oleaut32/tests/tmarshal_dispids.h
index 879d974..d603a56 100644
--- a/dlls/oleaut32/tests/tmarshal_dispids.h
+++ b/dlls/oleaut32/tests/tmarshal_dispids.h
@@ -44,6 +44,7 @@
#define DISPID_TM_RESTRICTED 25
#define DISPID_TM_NEG_RESTRICTED -26
#define DISPID_TM_TESTSECONDIFACE 27
+#define DISPID_TM_VARARG_RUN 28
#define DISPID_NOA_BSTRRET 1
#define DISPID_NOA_ERROR 2
--
2.4.8
More information about the wine-patches
mailing list