Piotr Caban : oleaut32: Fix automatic value getting in ITypeInfo::Invoke.
Alexandre Julliard
julliard at winehq.org
Tue Nov 7 15:30:21 CST 2017
Module: wine
Branch: master
Commit: 61c18632b84e97918b13bebfc0b9dbbd4adb7a2a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=61c18632b84e97918b13bebfc0b9dbbd4adb7a2a
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Nov 7 13:30:14 2017 +0100
oleaut32: Fix automatic value getting in ITypeInfo::Invoke.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/oleaut32/tests/test_reg.idl | 11 ++++
dlls/oleaut32/tests/typelib.c | 116 ++++++++++++++++++++++++++++++++++++++-
dlls/oleaut32/typelib.c | 2 +-
3 files changed, 125 insertions(+), 4 deletions(-)
diff --git a/dlls/oleaut32/tests/test_reg.idl b/dlls/oleaut32/tests/test_reg.idl
index 179d8c5..c9be76b 100644
--- a/dlls/oleaut32/tests/test_reg.idl
+++ b/dlls/oleaut32/tests/test_reg.idl
@@ -131,6 +131,15 @@ library register_test
}
[
+ uuid(fed318b2-c2ed-11e7-abc4-cec278b6b50a)
+ ]
+ interface ICollection : IDispatch
+ {
+ [id(DISPID_VALUE)]
+ HRESULT Item([in] int i, [out, retval] int *p);
+ }
+
+ [
uuid(f1b68c3b-02a3-4110-bc4c-cf9bc7e7f177)
]
interface IInvokeTest : IDispatch
@@ -143,6 +152,8 @@ library register_test
LONG testprop2([in] IUnknown *i);
[id(3)]
HRESULT testfunc([in] int i, [out, retval] int *p);
+ [propget, id(4)]
+ HRESULT testget([out, retval] ICollection **p);
}
/* uuid is same as for test_struct2 in test_tlb.idl, fields are different */
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index bb70164..950ea43 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -98,6 +98,91 @@ static const BOOL abi_supports_stdcall = TRUE;
static const BOOL abi_supports_stdcall = FALSE;
#endif
+static HRESULT WINAPI collection_QueryInterface(ICollection *iface, REFIID riid, void **ret)
+{
+ if (IsEqualIID(riid, &IID_IUnknown) ||
+ IsEqualIID(riid, &IID_IDispatch) ||
+ IsEqualIID(riid, &IID_ICollection))
+ {
+ *ret = iface;
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI collection_AddRef(ICollection *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI collection_Release(ICollection *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI collection_GetTypeInfoCount(ICollection *iface, UINT *cnt)
+{
+ ok(0, "unexpected call\n");
+ *cnt = 0;
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI collection_GetTypeInfo(ICollection *iface, UINT index, LCID lcid, ITypeInfo **ti)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI collection_GetIDsOfNames(ICollection *iface, REFIID riid, LPOLESTR *names,
+ UINT cnt, LCID lcid, DISPID *dispid)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI collection_Invoke(ICollection *iface, DISPID dispid, REFIID riid,
+ LCID lcid, WORD flags, DISPPARAMS *dispparams, VARIANT *res, EXCEPINFO *ei, UINT *argerr)
+{
+ if(dispid != DISPID_VALUE) {
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+ }
+
+ ok(flags == (DISPATCH_METHOD|DISPATCH_PROPERTYGET), "flags = %x\n", flags);
+ ok(dispparams != NULL, "dispparams == NULL\n");
+ ok(!dispparams->rgdispidNamedArgs, "dispparams->rgdispidNamedArgs != NULL\n");
+ ok(dispparams->cArgs == 1, "dispparams->cArgs = %d\n", dispparams->cArgs);
+ ok(!dispparams->cNamedArgs, "dispparams->cNamedArgs = %d\n", dispparams->cNamedArgs);
+ ok(V_VT(dispparams->rgvarg) == VT_I4, "V_VT(dispparams->rgvarg) = %d\n", V_VT(dispparams->rgvarg));
+ ok(V_I4(dispparams->rgvarg) == 7, "V_I4(dispparams->rgvarg) = %d\n", V_I4(dispparams->rgvarg));
+ ok(res != NULL, "res == NULL\n");
+ ok(V_VT(res) == VT_EMPTY, "V_VT(res) = %d\n", V_VT(res));
+
+ V_VT(res) = VT_I4;
+ V_I4(res) = 15;
+ return S_OK;
+}
+
+static HRESULT WINAPI collection_Item(ICollection *iface, int i, int *p)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static const ICollectionVtbl collectionvtbl = {
+ collection_QueryInterface,
+ collection_AddRef,
+ collection_Release,
+ collection_GetTypeInfoCount,
+ collection_GetTypeInfo,
+ collection_GetIDsOfNames,
+ collection_Invoke,
+ collection_Item
+};
+
+static ICollection collection = { &collectionvtbl };
+
static HRESULT WINAPI invoketest_QueryInterface(IInvokeTest *iface, REFIID riid, void **ret)
{
if (IsEqualIID(riid, &IID_IUnknown) ||
@@ -169,6 +254,13 @@ static HRESULT WINAPI invoketest_testfunc(IInvokeTest *iface, int i, int *p)
return S_OK;
}
+static HRESULT WINAPI invoketest_testget(IInvokeTest *iface, ICollection **p)
+{
+ *p = &collection;
+ ICollection_AddRef(&collection);
+ return S_OK;
+}
+
static const IInvokeTestVtbl invoketestvtbl = {
invoketest_QueryInterface,
invoketest_AddRef,
@@ -180,7 +272,8 @@ static const IInvokeTestVtbl invoketestvtbl = {
invoketest_get_test,
invoketest_putref_testprop,
invoketest_putref_testprop2,
- invoketest_testfunc
+ invoketest_testfunc,
+ invoketest_testget
};
static IInvokeTest invoketest = { &invoketestvtbl };
@@ -968,6 +1061,22 @@ static void test_TypeInfo(void)
ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res));
ok(V_I4(&res) == 1, "got %d\n", V_I4(&res));
+ /* call propget with DISPATCH_METHOD|DISPATCH_PROPERTYGET flags */
+ V_VT(&args[0]) = VT_I4;
+ V_I4(&args[0]) = 7;
+
+ dispparams.cArgs = 1;
+ dispparams.rgvarg = args;
+
+ i = 0;
+ V_VT(&res) = VT_EMPTY;
+ V_I4(&res) = 0;
+ hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 4, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dispparams, &res, NULL, &i);
+ ok(hr == S_OK, "got 0x%08x, %d\n", hr, i);
+ ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res));
+ ok(V_I4(&res) == 15, "got %d\n", V_I4(&res));
+
+
/* DISPATCH_PROPERTYPUTREF */
l = 1;
V_VT(&args[0]) = VT_I4|VT_BYREF;
@@ -4837,7 +4946,7 @@ static void test_register_typelib(BOOL system_registration)
{
TYPEKIND kind;
WORD flags;
- } attrs[13] =
+ } attrs[] =
{
{ TKIND_INTERFACE, 0 },
{ TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE },
@@ -4851,6 +4960,7 @@ static void test_register_typelib(BOOL system_registration)
{ TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE },
{ TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE },
{ TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE },
+ { TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE },
{ TKIND_RECORD, 0 }
};
@@ -4886,7 +4996,7 @@ static void test_register_typelib(BOOL system_registration)
ok(hr == S_OK, "got %08x\n", hr);
count = ITypeLib_GetTypeInfoCount(typelib);
- ok(count == 13, "got %d\n", count);
+ ok(count == 14, "got %d\n", count);
for(i = 0; i < count; i++)
{
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 86da3e3..388f108 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -7496,7 +7496,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
* pointer to be valid */
VariantInit(pVarResult);
hres = IDispatch_Invoke(pDispatch, DISPID_VALUE, &IID_NULL,
- GetSystemDefaultLCID(), INVOKE_PROPERTYGET,
+ GetSystemDefaultLCID(), wFlags,
pDispParams, pVarResult, pExcepInfo, pArgErr);
IDispatch_Release(pDispatch);
}
More information about the wine-cvs
mailing list