Module: wine Branch: master Commit: 17fca45d41e06a1da2f3b0e7609604fcc2e78f32 URL: http://source.winehq.org/git/wine.git/?a=commit;h=17fca45d41e06a1da2f3b0e760...
Author: Huw Davies huw@codeweavers.com Date: Fri Jun 22 14:38:50 2007 +0100
oleaut32: Interfaces that derive from IDispatch should be marshaled as VT_DISPATCH.
---
dlls/oleaut32/tests/tmarshal.c | 24 +++++++++++++++++++++++- dlls/oleaut32/tests/tmarshal.idl | 13 +++++++++++++ dlls/oleaut32/tests/tmarshal_dispids.h | 1 + dlls/oleaut32/typelib.c | 2 +- 4 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index cc2632f..f7400e4 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -515,6 +515,15 @@ HRESULT WINAPI Widget_Error( return E_NOTIMPL; }
+HRESULT WINAPI Widget_CloneInterface( + IWidget __RPC_FAR * iface, + ISomethingFromDispatch **ppVal) +{ + trace("CloneInterface()\n"); + *ppVal = 0; + return S_OK; +} + static const struct IWidgetVtbl Widget_VTable = { Widget_QueryInterface, @@ -540,7 +549,8 @@ static const struct IWidgetVtbl Widget_VTable = Widget_VariantArrayPtr, Widget_Variant, Widget_VarArg, - Widget_Error + Widget_Error, + Widget_CloneInterface };
@@ -914,6 +924,18 @@ static void test_typelibmarshal(void) VariantInit(&varresult); hr = IDispatch_Invoke(pDispatch, DISPID_TM_CLONE, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_PROPERTYGET, &dispparams, &varresult, &excepinfo, NULL); ok_ole_success(hr, IDispatch_Invoke); + ok(V_VT(&varresult) == VT_DISPATCH, "vt %x\n", V_VT(&varresult)); + VariantClear(&varresult); + + /* call CloneInterface */ + dispparams.cNamedArgs = 0; + dispparams.cArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = NULL; + VariantInit(&varresult); + hr = IDispatch_Invoke(pDispatch, DISPID_TM_CLONEINTERFACE, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_PROPERTYGET, &dispparams, &varresult, &excepinfo, NULL); + ok_ole_success(hr, IDispatch_Invoke); + ok(V_VT(&varresult) == VT_DISPATCH, "vt %x\n", V_VT(&varresult)); VariantClear(&varresult);
/* call CloneDispatch with automatic value getting */ diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl index ff7a00a..9b94843 100644 --- a/dlls/oleaut32/tests/tmarshal.idl +++ b/dlls/oleaut32/tests/tmarshal.idl @@ -39,6 +39,15 @@ library TestTypelib
[ odl, + uuid(12345678-1234-4321-1234-121212121212) + ] + interface ISomethingFromDispatch : IDispatch + { + HRESULT anotherfn(void); + } + + [ + odl, uuid(a1f8cae3-c947-4c5f-b57d-c87b9b5f3586), oleautomation, dual @@ -93,6 +102,10 @@ library TestTypelib
[id(DISPID_TM_ERROR)] HRESULT Error(); + + [propget, id(DISPID_TM_CLONEINTERFACE)] + HRESULT CloneInterface([out, retval] ISomethingFromDispatch **ppVal); + }
[ diff --git a/dlls/oleaut32/tests/tmarshal_dispids.h b/dlls/oleaut32/tests/tmarshal_dispids.h index bfeca29..4bf47cd 100644 --- a/dlls/oleaut32/tests/tmarshal_dispids.h +++ b/dlls/oleaut32/tests/tmarshal_dispids.h @@ -31,5 +31,6 @@ #define DISPID_TM_VARIANT 12 #define DISPID_TM_VARARG 13 #define DISPID_TM_ERROR 14 +#define DISPID_TM_CLONEINTERFACE 15
#define DISPID_NOA_BSTRRET 1 diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 5a6fc16..d57a3a2 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -5307,7 +5307,7 @@ static HRESULT userdefined_to_variantvt(ITypeInfo *tinfo, const TYPEDESC *tdesc, break;
case TKIND_INTERFACE: - if (IsEqualIID(&IID_IDispatch, &tattr->guid)) + if (tattr->wTypeFlags & TYPEFLAG_FDISPATCHABLE) *vt |= VT_DISPATCH; else *vt |= VT_UNKNOWN;