Robert Shearman : oleaut32: Resolve referenced types for return values as well as parameters in MSFT typelibs .

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 31 08:56:40 CDT 2006


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

Author: Robert Shearman <rob at codeweavers.com>
Date:   Wed May 31 12:20:31 2006 +0100

oleaut32: Resolve referenced types for return values as well as parameters in MSFT typelibs.

---

 dlls/oleaut32/typelib.c |   57 +++++++++++++++++++++++++----------------------
 1 files changed, 30 insertions(+), 27 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 27cfdd5..25a5354 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -1643,6 +1643,34 @@ static void MSFT_GetTdesc(TLBContext *pc
     TRACE_(typelib)("vt type = %X\n", pTd->vt);
 }
 
+static void MSFT_ResolveReferencedTypes(TLBContext *pcx, ITypeInfoImpl *pTI, TYPEDESC *lpTypeDesc)
+{
+    /* resolve referenced type if any */
+    while (lpTypeDesc)
+    {
+        switch (lpTypeDesc->vt)
+        {
+        case VT_PTR:
+            lpTypeDesc = lpTypeDesc->u.lptdesc;
+            break;
+
+        case VT_CARRAY:
+            lpTypeDesc = & (lpTypeDesc->u.lpadesc->tdescElem);
+            break;
+
+        case VT_USERDEFINED:
+            MSFT_DoRefType(pcx, pTI,
+                           lpTypeDesc->u.hreftype);
+
+            lpTypeDesc = NULL;
+            break;
+
+        default:
+            lpTypeDesc = NULL;
+        }
+    }
+}
+
 static void
 MSFT_DoFuncs(TLBContext*     pcx,
 	    ITypeInfoImpl*  pTI,
@@ -1764,6 +1792,7 @@ MSFT_DoFuncs(TLBContext*     pcx,
 		      pFuncRec->DataType,
 		      &(*pptfd)->funcdesc.elemdescFunc.tdesc,
 		      pTI);
+        MSFT_ResolveReferencedTypes(pcx, pTI, &(*pptfd)->funcdesc.elemdescFunc.tdesc);
 
         /* do the parameters/arguments */
         if(pFuncRec->nrargs)
@@ -1782,7 +1811,6 @@ MSFT_DoFuncs(TLBContext*     pcx,
 
             for ( j = 0 ; j < pFuncRec->nrargs ; j++ )
             {
-                TYPEDESC *lpArgTypeDesc;
                 ELEMDESC *elemdesc = &(*pptfd)->funcdesc.lprgelemdescParam[j];
 
                 MSFT_GetTdesc(pcx,
@@ -1803,32 +1831,7 @@ MSFT_DoFuncs(TLBContext*     pcx,
                         MSFT_ReadName( pcx, paraminfo.oName );
                 TRACE_(typelib)("param[%d] = %s\n", j, debugstr_w((*pptfd)->pParamDesc[j].Name));
 
-                lpArgTypeDesc = &elemdesc->tdesc;
-
-                /* resolve referenced type if any */
-                while ( lpArgTypeDesc != NULL )
-                {
-                    switch ( lpArgTypeDesc->vt )
-                    {
-                    case VT_PTR:
-                        lpArgTypeDesc = lpArgTypeDesc->u.lptdesc;
-                        break;
-
-                    case VT_CARRAY:
-                        lpArgTypeDesc = & (lpArgTypeDesc->u.lpadesc->tdescElem);
-                        break;
-
-                    case VT_USERDEFINED:
-                        MSFT_DoRefType(pcx, pTI,
-				       lpArgTypeDesc->u.hreftype);
-
-                        lpArgTypeDesc = NULL;
-                        break;
-
-                    default:
-                        lpArgTypeDesc = NULL;
-                    }
-                }
+                MSFT_ResolveReferencedTypes(pcx, pTI, &elemdesc->tdesc);
 
                 /* default value */
                 if ( (elemdesc->u.paramdesc.wParamFlags & PARAMFLAG_FHASDEFAULT) &&




More information about the wine-cvs mailing list