Robert Shearman : oleaut32: Fix ITypeInfo:: GetFuncDesc to return the correct information for dual dispinterfaces.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Oct 2 15:00:58 CDT 2006


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

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon Oct  2 18:25:32 2006 +0100

oleaut32: Fix ITypeInfo::GetFuncDesc to return the correct information for dual dispinterfaces.

---

 dlls/oleaut32/typelib.c |   56 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 55 insertions(+), 1 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index c714f62..52ce8b4 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -4547,6 +4547,51 @@ HRESULT ITypeInfoImpl_GetInternalFuncDes
     return E_INVALIDARG;
 }
 
+/* internal function to make the inherited interfaces' methods appear
+ * part of the interface */
+static HRESULT ITypeInfoImpl_GetInternalDispatchFuncDesc( ITypeInfo *iface,
+    UINT index, const FUNCDESC **ppFuncDesc, UINT *funcs)
+{
+    ITypeInfoImpl *This = (ITypeInfoImpl *)iface;
+    HRESULT hr;
+    UINT i;
+    UINT implemented_funcs = 0;
+
+    if (funcs)
+        *funcs = 0;
+
+    for (i = 0; i < This->TypeAttr.cImplTypes; i++)
+    {
+        HREFTYPE href;
+        ITypeInfo *pSubTypeInfo;
+        UINT sub_funcs;
+
+        hr = ITypeInfo_GetRefTypeOfImplType(iface, i, &href);
+        if (FAILED(hr))
+            return hr;
+        hr = ITypeInfo_GetRefTypeInfo(iface, href, &pSubTypeInfo);
+        if (FAILED(hr))
+            return hr;
+
+        hr = ITypeInfoImpl_GetInternalDispatchFuncDesc(pSubTypeInfo,
+                                                       index,
+                                                       ppFuncDesc,
+                                                       &sub_funcs);
+        implemented_funcs += sub_funcs;
+        ITypeInfo_Release(pSubTypeInfo);
+        if (SUCCEEDED(hr))
+            return hr;
+    }
+
+    if (funcs)
+        *funcs = implemented_funcs + This->TypeAttr.cFuncs;
+    
+    if (index < implemented_funcs)
+        return E_INVALIDARG;
+    return ITypeInfoImpl_GetInternalFuncDesc(iface, index - implemented_funcs,
+                                             ppFuncDesc);
+}
+
 /* ITypeInfo::GetFuncDesc
  *
  * Retrieves the FUNCDESC structure that contains information about a
@@ -4562,9 +4607,18 @@ static HRESULT WINAPI ITypeInfo_fnGetFun
 
     TRACE("(%p) index %d\n", This, index);
 
-    hr = ITypeInfoImpl_GetInternalFuncDesc((ITypeInfo *)iface, index, &internal_funcdesc);
+    if ((This->TypeAttr.typekind == TKIND_DISPATCH) &&
+        (This->TypeAttr.wTypeFlags & TYPEFLAG_FDUAL))
+        hr = ITypeInfoImpl_GetInternalDispatchFuncDesc((ITypeInfo *)iface, index,
+                                                       &internal_funcdesc, NULL);
+    else
+        hr = ITypeInfoImpl_GetInternalFuncDesc((ITypeInfo *)iface, index,
+                                               &internal_funcdesc);
     if (FAILED(hr))
+    {
+        WARN("description for function %d not found\n", index);
         return hr;
+    }
 
     return TLB_AllocAndInitFuncDesc(
         internal_funcdesc,




More information about the wine-cvs mailing list