Huw Davies : oleaut32: Interfaces that derive from IDispatch should be marshaled as VT_DISPATCH.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 25 07:28:01 CDT 2007


Module: wine
Branch: master
Commit: 17fca45d41e06a1da2f3b0e7609604fcc2e78f32
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=17fca45d41e06a1da2f3b0e7609604fcc2e78f32

Author: Huw Davies <huw at 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;




More information about the wine-cvs mailing list