[PATCH] oleaut32: Keep most of typeinfo attributes in TYPEATTR structure

Nikolay Sivov nsivov at codeweavers.com
Tue Aug 23 13:53:06 CDT 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/oleaut32/typelib.c | 539 +++++++++++++++++++++++-------------------------
 1 file changed, 253 insertions(+), 286 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 517e515..6f87279 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -1233,22 +1233,8 @@ typedef struct tagITypeInfoImpl
     BOOL needs_layout;
 
     TLBGuid *guid;
-    LCID lcid;
-    MEMBERID memidConstructor;
-    MEMBERID memidDestructor;
-    LPOLESTR lpstrSchema;
-    ULONG cbSizeInstance;
-    TYPEKIND typekind;
-    WORD cFuncs;
-    WORD cVars;
-    WORD cImplTypes;
-    WORD cbSizeVft;
-    WORD cbAlignment;
-    WORD wTypeFlags;
-    WORD wMajorVerNum;
-    WORD wMinorVerNum;
+    TYPEATTR typeattr;
     TYPEDESC *tdescAlias;
-    IDLDESC idldescType;
 
     ITypeLibImpl * pTypeLib;        /* back pointer to typelib */
     int index;                  /* index in this typelib; */
@@ -1575,15 +1561,15 @@ static void dump_TypeInfo(const ITypeInfoImpl * pty)
     TRACE("%p ref=%u\n", pty, pty->ref);
     TRACE("%s %s\n", debugstr_w(TLB_get_bstr(pty->Name)), debugstr_w(TLB_get_bstr(pty->DocString)));
     TRACE("attr:%s\n", debugstr_guid(TLB_get_guidref(pty->guid)));
-    TRACE("kind:%s\n", typekind_desc[pty->typekind]);
-    TRACE("fct:%u var:%u impl:%u\n", pty->cFuncs, pty->cVars, pty->cImplTypes);
-    TRACE("wTypeFlags: 0x%04x\n", pty->wTypeFlags);
+    TRACE("kind:%s\n", typekind_desc[pty->typeattr.typekind]);
+    TRACE("fct:%u var:%u impl:%u\n", pty->typeattr.cFuncs, pty->typeattr.cVars, pty->typeattr.cImplTypes);
+    TRACE("wTypeFlags: 0x%04x\n", pty->typeattr.wTypeFlags);
     TRACE("parent tlb:%p index in TLB:%u\n",pty->pTypeLib, pty->index);
-    if (pty->typekind == TKIND_MODULE) TRACE("dllname:%s\n", debugstr_w(TLB_get_bstr(pty->DllName)));
+    if (pty->typeattr.typekind == TKIND_MODULE) TRACE("dllname:%s\n", debugstr_w(TLB_get_bstr(pty->DllName)));
     if (TRACE_ON(ole))
-        dump_TLBFuncDesc(pty->funcdescs, pty->cFuncs);
-    dump_TLBVarDesc(pty->vardescs, pty->cVars);
-    dump_TLBImplType(pty->impltypes, pty->cImplTypes);
+        dump_TLBFuncDesc(pty->funcdescs, pty->typeattr.cFuncs);
+    dump_TLBVarDesc(pty->vardescs, pty->typeattr.cVars);
+    dump_TLBImplType(pty->impltypes, pty->typeattr.cImplTypes);
 }
 
 static void dump_VARDESC(const VARDESC *v)
@@ -2641,7 +2627,7 @@ static void MSFT_DoImplTypes(TLBContext *pcx, ITypeInfoImpl *pTI, int count,
  * and some structures, and fix the alignment */
 static void TLB_fix_32on64_typeinfo(ITypeInfoImpl *info)
 {
-    if(info->typekind == TKIND_ALIAS){
+    if(info->typeattr.typekind == TKIND_ALIAS){
         switch(info->tdescAlias->vt){
         case VT_BSTR:
         case VT_DISPATCH:
@@ -2650,28 +2636,28 @@ static void TLB_fix_32on64_typeinfo(ITypeInfoImpl *info)
         case VT_SAFEARRAY:
         case VT_LPSTR:
         case VT_LPWSTR:
-            info->cbSizeInstance = sizeof(void*);
-            info->cbAlignment = sizeof(void*);
+            info->typeattr.cbSizeInstance = sizeof(void*);
+            info->typeattr.cbAlignment = sizeof(void*);
             break;
         case VT_CARRAY:
         case VT_USERDEFINED:
-            TLB_size_instance(info, SYS_WIN64, info->tdescAlias, &info->cbSizeInstance, &info->cbAlignment);
+            TLB_size_instance(info, SYS_WIN64, info->tdescAlias, &info->typeattr.cbSizeInstance, &info->typeattr.cbAlignment);
             break;
         case VT_VARIANT:
-            info->cbSizeInstance = sizeof(VARIANT);
-            info->cbAlignment = 8;
+            info->typeattr.cbSizeInstance = sizeof(VARIANT);
+            info->typeattr.cbAlignment = 8;
         default:
-            if(info->cbSizeInstance < sizeof(void*))
-                info->cbAlignment = info->cbSizeInstance;
+            if(info->typeattr.cbSizeInstance < sizeof(void*))
+                info->typeattr.cbAlignment = info->typeattr.cbSizeInstance;
             else
-                info->cbAlignment = sizeof(void*);
+                info->typeattr.cbAlignment = sizeof(void*);
             break;
         }
-    }else if(info->typekind == TKIND_INTERFACE ||
-            info->typekind == TKIND_DISPATCH ||
-            info->typekind == TKIND_COCLASS){
-        info->cbSizeInstance = sizeof(void*);
-        info->cbAlignment = sizeof(void*);
+    }else if(info->typeattr.typekind == TKIND_INTERFACE ||
+            info->typeattr.typekind == TKIND_DISPATCH ||
+            info->typeattr.typekind == TKIND_COCLASS){
+        info->typeattr.cbSizeInstance = sizeof(void*);
+        info->typeattr.cbAlignment = sizeof(void*);
     }
 }
 #endif
@@ -2698,19 +2684,19 @@ static ITypeInfoImpl * MSFT_DoTypeInfo(
     ptiRet->index=count;
 
     ptiRet->guid = MSFT_ReadGuid(tiBase.posguid, pcx);
-    ptiRet->lcid=pLibInfo->set_lcid;   /* FIXME: correct? */
-    ptiRet->lpstrSchema=NULL;              /* reserved */
-    ptiRet->cbSizeInstance=tiBase.size;
-    ptiRet->typekind=tiBase.typekind & 0xF;
-    ptiRet->cFuncs=LOWORD(tiBase.cElement);
-    ptiRet->cVars=HIWORD(tiBase.cElement);
-    ptiRet->cbAlignment=(tiBase.typekind >> 11 )& 0x1F; /* there are more flags there */
-    ptiRet->wTypeFlags=tiBase.flags;
-    ptiRet->wMajorVerNum=LOWORD(tiBase.version);
-    ptiRet->wMinorVerNum=HIWORD(tiBase.version);
-    ptiRet->cImplTypes=tiBase.cImplTypes;
-    ptiRet->cbSizeVft=tiBase.cbSizeVft; /* FIXME: this is only the non inherited part */
-    if(ptiRet->typekind == TKIND_ALIAS){
+    ptiRet->typeattr.lcid = pLibInfo->set_lcid;   /* FIXME: correct? */
+    ptiRet->typeattr.lpstrSchema = NULL;              /* reserved */
+    ptiRet->typeattr.cbSizeInstance = tiBase.size;
+    ptiRet->typeattr.typekind = tiBase.typekind & 0xF;
+    ptiRet->typeattr.cFuncs = LOWORD(tiBase.cElement);
+    ptiRet->typeattr.cVars = HIWORD(tiBase.cElement);
+    ptiRet->typeattr.cbAlignment = (tiBase.typekind >> 11 )& 0x1F; /* there are more flags there */
+    ptiRet->typeattr.wTypeFlags = tiBase.flags;
+    ptiRet->typeattr.wMajorVerNum = LOWORD(tiBase.version);
+    ptiRet->typeattr.wMinorVerNum = HIWORD(tiBase.version);
+    ptiRet->typeattr.cImplTypes = tiBase.cImplTypes;
+    ptiRet->typeattr.cbSizeVft = tiBase.cbSizeVft; /* FIXME: this is only the non inherited part */
+    if (ptiRet->typeattr.typekind == TKIND_ALIAS) {
         TYPEDESC tmp;
         MSFT_GetTdesc(pcx, tiBase.datatype1, &tmp);
         ptiRet->tdescAlias = heap_alloc(TLB_SizeTypeDesc(&tmp, TRUE));
@@ -2729,27 +2715,27 @@ static ITypeInfoImpl * MSFT_DoTypeInfo(
     ptiRet->dwHelpStringContext=tiBase.helpstringcontext;
     ptiRet->dwHelpContext=tiBase.helpcontext;
 
-    if (ptiRet->typekind == TKIND_MODULE)
+    if (ptiRet->typeattr.typekind == TKIND_MODULE)
         ptiRet->DllName = MSFT_ReadString(pcx, tiBase.datatype1);
 
 /* note: InfoType's Help file and HelpStringDll come from the containing
  * library. Further HelpString and Docstring appear to be the same thing :(
  */
     /* functions */
-    if(ptiRet->cFuncs >0 )
-        MSFT_DoFuncs(pcx, ptiRet, ptiRet->cFuncs,
-		    ptiRet->cVars,
+    if(ptiRet->typeattr.cFuncs >0 )
+        MSFT_DoFuncs(pcx, ptiRet, ptiRet->typeattr.cFuncs,
+		    ptiRet->typeattr.cVars,
 		    tiBase.memoffset, &ptiRet->funcdescs);
     /* variables */
-    if(ptiRet->cVars >0 )
-        MSFT_DoVars(pcx, ptiRet, ptiRet->cFuncs,
-		   ptiRet->cVars,
+    if(ptiRet->typeattr.cVars >0 )
+        MSFT_DoVars(pcx, ptiRet, ptiRet->typeattr.cFuncs,
+		   ptiRet->typeattr.cVars,
 		   tiBase.memoffset, &ptiRet->vardescs);
-    if(ptiRet->cImplTypes >0 ) {
-        switch(ptiRet->typekind)
+    if(ptiRet->typeattr.cImplTypes >0 ) {
+        switch(ptiRet->typeattr.typekind)
         {
         case TKIND_COCLASS:
-            MSFT_DoImplTypes(pcx, ptiRet, ptiRet->cImplTypes,
+            MSFT_DoImplTypes(pcx, ptiRet, ptiRet->typeattr.cImplTypes,
                 tiBase.datatype1);
             break;
         case TKIND_DISPATCH:
@@ -2776,7 +2762,7 @@ static ITypeInfoImpl * MSFT_DoTypeInfo(
     TRACE_(typelib)("%s guid: %s kind:%s\n",
        debugstr_w(TLB_get_bstr(ptiRet->Name)),
        debugstr_guid(TLB_get_guidref(ptiRet->guid)),
-       typekind_desc[ptiRet->typekind]);
+       typekind_desc[ptiRet->typeattr.typekind]);
     if (TRACE_ON(typelib))
       dump_TypeInfo(ptiRet);
 
@@ -4023,14 +4009,14 @@ static char *SLTG_DoImpls(char *pBlk, ITypeInfoImpl *pTI,
 
     info = (SLTG_ImplInfo*)pBlk;
     while(1){
-        pTI->cImplTypes++;
+        pTI->typeattr.cImplTypes++;
         if(info->next == 0xffff)
             break;
         info = (SLTG_ImplInfo*)(pBlk + info->next);
     }
 
     info = (SLTG_ImplInfo*)pBlk;
-    pTI->impltypes = TLBImplType_Alloc(pTI->cImplTypes);
+    pTI->impltypes = TLBImplType_Alloc(pTI->typeattr.cImplTypes);
     pImplType = pTI->impltypes;
     while(1) {
 	sltg_get_typelib_ref(ref_lookup, info->ref, &pImplType->hRef);
@@ -4155,7 +4141,7 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign
 
       prevName = pVarDesc->Name;
   }
-  pTI->cVars = cVars;
+  pTI->typeattr.cVars = cVars;
 }
 
 static void SLTG_DoFuncs(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI,
@@ -4262,7 +4248,7 @@ static void SLTG_DoFuncs(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI,
 	    }
 	}
     }
-    pTI->cFuncs = cFuncs;
+    pTI->typeattr.cFuncs = cFuncs;
 }
 
 static void SLTG_ProcessCoClass(char *pBlk, ITypeInfoImpl *pTI,
@@ -4310,7 +4296,7 @@ static void SLTG_ProcessInterface(char *pBlk, ITypeInfoImpl *pTI,
     heap_free(ref_lookup);
 
     if (TRACE_ON(typelib))
-        dump_TLBFuncDesc(pTI->funcdescs, pTI->cFuncs);
+        dump_TLBFuncDesc(pTI->funcdescs, pTI->typeattr.cFuncs);
 }
 
 static void SLTG_ProcessRecord(char *pBlk, ITypeInfoImpl *pTI,
@@ -4369,11 +4355,11 @@ static void SLTG_ProcessDispatch(char *pBlk, ITypeInfoImpl *pTI,
   /* this is necessary to cope with MSFT typelibs that set cFuncs to the number
    * of dispinterface functions including the IDispatch ones, so
    * ITypeInfo::GetFuncDesc takes the real value for cFuncs from cbSizeVft */
-  pTI->cbSizeVft = pTI->cFuncs * pTI->pTypeLib->ptr_size;
+  pTI->typeattr.cbSizeVft = pTI->typeattr.cFuncs * pTI->pTypeLib->ptr_size;
 
   heap_free(ref_lookup);
   if (TRACE_ON(typelib))
-      dump_TLBFuncDesc(pTI->funcdescs, pTI->cFuncs);
+      dump_TLBFuncDesc(pTI->funcdescs, pTI->typeattr.cFuncs);
 }
 
 static void SLTG_ProcessEnum(char *pBlk, ITypeInfoImpl *pTI,
@@ -4614,14 +4600,14 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
       (*ppTypeInfoImpl)->Name = SLTG_ReadName(pNameTable, pOtherTypeInfoBlks[i].name_offs, pTypeLibImpl);
       (*ppTypeInfoImpl)->dwHelpContext = pOtherTypeInfoBlks[i].helpcontext;
       (*ppTypeInfoImpl)->guid = TLB_append_guid(&pTypeLibImpl->guid_list, &pOtherTypeInfoBlks[i].uuid, 2);
-      (*ppTypeInfoImpl)->typekind = pTIHeader->typekind;
-      (*ppTypeInfoImpl)->wMajorVerNum = pTIHeader->major_version;
-      (*ppTypeInfoImpl)->wMinorVerNum = pTIHeader->minor_version;
-      (*ppTypeInfoImpl)->wTypeFlags =
+      (*ppTypeInfoImpl)->typeattr.typekind = pTIHeader->typekind;
+      (*ppTypeInfoImpl)->typeattr.wMajorVerNum = pTIHeader->major_version;
+      (*ppTypeInfoImpl)->typeattr.wMinorVerNum = pTIHeader->minor_version;
+      (*ppTypeInfoImpl)->typeattr.wTypeFlags =
 	(pTIHeader->typeflags1 >> 3) | (pTIHeader->typeflags2 << 5);
 
-      if((*ppTypeInfoImpl)->wTypeFlags & TYPEFLAG_FDUAL)
-	(*ppTypeInfoImpl)->typekind = TKIND_DISPATCH;
+      if((*ppTypeInfoImpl)->typeattr.wTypeFlags & TYPEFLAG_FDUAL)
+	(*ppTypeInfoImpl)->typeattr.typekind = TKIND_DISPATCH;
 
       if((pTIHeader->typeflags1 & 7) != 2)
 	FIXME_(typelib)("typeflags1 = %02x\n", pTIHeader->typeflags1);
@@ -4632,15 +4618,15 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
 	    debugstr_w(TLB_get_bstr((*ppTypeInfoImpl)->Name)),
 	    typekind_desc[pTIHeader->typekind],
 	    debugstr_guid(TLB_get_guidref((*ppTypeInfoImpl)->guid)),
-	    (*ppTypeInfoImpl)->wTypeFlags);
+	    (*ppTypeInfoImpl)->typeattr.wTypeFlags);
 
       pMemHeader = (SLTG_MemberHeader*)((char *)pBlk + pTIHeader->elem_table);
 
       pTITail = (SLTG_TypeInfoTail*)((char *)(pMemHeader + 1) + pMemHeader->cbExtra);
 
-      (*ppTypeInfoImpl)->cbAlignment = pTITail->cbAlignment;
-      (*ppTypeInfoImpl)->cbSizeInstance = pTITail->cbSizeInstance;
-      (*ppTypeInfoImpl)->cbSizeVft = pTITail->cbSizeVft;
+      (*ppTypeInfoImpl)->typeattr.cbAlignment = pTITail->cbAlignment;
+      (*ppTypeInfoImpl)->typeattr.cbSizeInstance = pTITail->cbSizeInstance;
+      (*ppTypeInfoImpl)->typeattr.cbSizeVft = pTITail->cbSizeVft;
 
       switch(pTIHeader->typekind) {
       case TKIND_ENUM:
@@ -4890,7 +4876,7 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfoType(
     if(index >= This->TypeInfoCount)
         return TYPE_E_ELEMENTNOTFOUND;
 
-    *pTKind = This->typeinfos[index]->typekind;
+    *pTKind = This->typeinfos[index]->typeattr.typekind;
 
     return S_OK;
 }
@@ -5082,7 +5068,7 @@ static HRESULT WINAPI ITypeLib2_fnIsName(
     for(tic = 0; tic < This->TypeInfoCount; ++tic){
         ITypeInfoImpl *pTInfo = This->typeinfos[tic];
         if(!TLB_str_memcmp(szNameBuf, pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit;
-        for(fdc = 0; fdc < pTInfo->cFuncs; ++fdc) {
+        for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) {
             TLBFuncDesc *pFInfo = &pTInfo->funcdescs[fdc];
             int pc;
             if(!TLB_str_memcmp(szNameBuf, pFInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit;
@@ -5091,7 +5077,7 @@ static HRESULT WINAPI ITypeLib2_fnIsName(
                     goto ITypeLib2_fnIsName_exit;
             }
         }
-        for(vrc = 0; vrc < pTInfo->cVars; ++vrc){
+        for(vrc = 0; vrc < pTInfo->typeattr.cVars; ++vrc){
             TLBVarDesc *pVInfo = &pTInfo->vardescs[vrc];
             if(!TLB_str_memcmp(szNameBuf, pVInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit;
         }
@@ -5141,7 +5127,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName(
             goto ITypeLib2_fnFindName_exit;
         }
 
-        for(fdc = 0; fdc < pTInfo->cFuncs; ++fdc) {
+        for(fdc = 0; fdc < pTInfo->typeattr.cFuncs; ++fdc) {
             TLBFuncDesc *func = &pTInfo->funcdescs[fdc];
 
             if(!TLB_str_memcmp(name, func->Name, len)) {
@@ -5150,7 +5136,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName(
             }
         }
 
-        var = TLB_get_vardesc_by_name(pTInfo->vardescs, pTInfo->cVars, name);
+        var = TLB_get_vardesc_by_name(pTInfo->vardescs, pTInfo->typeattr.cVars, name);
         if (var) {
             memid[count] = var->vardesc.memid;
             goto ITypeLib2_fnFindName_exit;
@@ -5402,8 +5388,8 @@ static HRESULT WINAPI ITypeLibComp_fnBind(
         /* FIXME: check wFlags here? */
         /* FIXME: we should use a hash table to look this info up using lHash
          * instead of an O(n) search */
-        if ((pTypeInfo->typekind == TKIND_ENUM) ||
-            (pTypeInfo->typekind == TKIND_MODULE))
+        if ((pTypeInfo->typeattr.typekind == TKIND_ENUM) ||
+            (pTypeInfo->typeattr.typekind == TKIND_MODULE))
         {
             if (pTypeInfo->Name && !strcmpW(pTypeInfo->Name->str, szName))
             {
@@ -5415,8 +5401,8 @@ static HRESULT WINAPI ITypeLibComp_fnBind(
             }
         }
 
-        if ((pTypeInfo->typekind == TKIND_MODULE) ||
-            (pTypeInfo->typekind == TKIND_ENUM))
+        if ((pTypeInfo->typeattr.typekind == TKIND_MODULE) ||
+            (pTypeInfo->typeattr.typekind == TKIND_ENUM))
         {
             ITypeComp *pSubTypeComp = &pTypeInfo->ITypeComp_iface;
             HRESULT hr;
@@ -5431,8 +5417,8 @@ static HRESULT WINAPI ITypeLibComp_fnBind(
                 typemismatch = TRUE;
         }
 
-        if ((pTypeInfo->typekind == TKIND_COCLASS) &&
-            (pTypeInfo->wTypeFlags & TYPEFLAG_FAPPOBJECT))
+        if ((pTypeInfo->typeattr.typekind == TKIND_COCLASS) &&
+            (pTypeInfo->typeattr.wTypeFlags & TYPEFLAG_FAPPOBJECT))
         {
             ITypeComp *pSubTypeComp = &pTypeInfo->ITypeComp_iface;
             HRESULT hr;
@@ -5569,8 +5555,8 @@ static ITypeInfoImpl* ITypeInfoImpl_Constructor(void)
       pTypeInfoImpl->ICreateTypeInfo2_iface.lpVtbl = &CreateTypeInfo2Vtbl;
       pTypeInfoImpl->ref = 0;
       pTypeInfoImpl->hreftype = -1;
-      pTypeInfoImpl->memidConstructor = MEMBERID_NIL;
-      pTypeInfoImpl->memidDestructor = MEMBERID_NIL;
+      pTypeInfoImpl->typeattr.memidConstructor = MEMBERID_NIL;
+      pTypeInfoImpl->typeattr.memidDestructor = MEMBERID_NIL;
       pTypeInfoImpl->pcustdata_list = &pTypeInfoImpl->custdata_list;
       list_init(pTypeInfoImpl->pcustdata_list);
     }
@@ -5628,7 +5614,7 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This)
 
     TRACE("destroying ITypeInfo(%p)\n",This);
 
-    for (i = 0; i < This->cFuncs; ++i)
+    for (i = 0; i < This->typeattr.cFuncs; ++i)
     {
         int j;
         TLBFuncDesc *pFInfo = &This->funcdescs[i];
@@ -5645,7 +5631,7 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This)
     }
     heap_free(This->funcdescs);
 
-    for(i = 0; i < This->cVars; ++i)
+    for(i = 0; i < This->typeattr.cVars; ++i)
     {
         TLBVarDesc *pVInfo = &This->vardescs[i];
         if (pVInfo->vardesc_create) {
@@ -5659,7 +5645,7 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This)
     heap_free(This->vardescs);
 
     if(This->impltypes){
-        for (i = 0; i < This->cImplTypes; ++i){
+        for (i = 0; i < This->typeattr.cImplTypes; ++i){
             TLBImplType *pImpl = &This->impltypes[i];
             TLB_FreeCustData(&pImpl->custdata_list);
         }
@@ -5707,37 +5693,18 @@ static HRESULT WINAPI ITypeInfo_fnGetTypeAttr( ITypeInfo2 *iface,
     TRACE("(%p)\n",This);
 
     size = sizeof(**ppTypeAttr);
-    if (This->typekind == TKIND_ALIAS && This->tdescAlias)
+    if (This->typeattr.typekind == TKIND_ALIAS && This->tdescAlias)
         size += TLB_SizeTypeDesc(This->tdescAlias, FALSE);
 
     *ppTypeAttr = heap_alloc(size);
     if (!*ppTypeAttr)
         return E_OUTOFMEMORY;
 
+    **ppTypeAttr = This->typeattr;
     (*ppTypeAttr)->guid = *TLB_get_guid_null(This->guid);
-    (*ppTypeAttr)->lcid = This->lcid;
-    (*ppTypeAttr)->memidConstructor = This->memidConstructor;
-    (*ppTypeAttr)->memidDestructor = This->memidDestructor;
-    (*ppTypeAttr)->lpstrSchema = This->lpstrSchema;
-    (*ppTypeAttr)->cbSizeInstance = This->cbSizeInstance;
-    (*ppTypeAttr)->typekind = This->typekind;
-    (*ppTypeAttr)->cFuncs = This->cFuncs;
-    (*ppTypeAttr)->cVars = This->cVars;
-    (*ppTypeAttr)->cImplTypes = This->cImplTypes;
-    (*ppTypeAttr)->cbSizeVft = This->cbSizeVft;
-    (*ppTypeAttr)->cbAlignment = This->cbAlignment;
-    (*ppTypeAttr)->wTypeFlags = This->wTypeFlags;
-    (*ppTypeAttr)->wMajorVerNum = This->wMajorVerNum;
-    (*ppTypeAttr)->wMinorVerNum = This->wMinorVerNum;
-    (*ppTypeAttr)->idldescType = This->idldescType;
 
     if (This->tdescAlias)
-        TLB_CopyTypeDesc(&(*ppTypeAttr)->tdescAlias,
-            This->tdescAlias, *ppTypeAttr + 1);
-    else{
-        (*ppTypeAttr)->tdescAlias.vt = VT_EMPTY;
-        (*ppTypeAttr)->tdescAlias.u.lptdesc = NULL;
-    }
+        TLB_CopyTypeDesc(&(*ppTypeAttr)->tdescAlias, This->tdescAlias, *ppTypeAttr + 1);
 
     if((*ppTypeAttr)->typekind == TKIND_DISPATCH) {
         /* This should include all the inherited funcs */
@@ -5931,7 +5898,7 @@ HRESULT ITypeInfoImpl_GetInternalFuncDesc( ITypeInfo *iface, UINT index, const F
 {
     ITypeInfoImpl *This = impl_from_ITypeInfo(iface);
 
-    if (index >= This->cFuncs)
+    if (index >= This->typeattr.cFuncs)
         return TYPE_E_ELEMENTNOTFOUND;
 
     *ppFuncDesc = &This->funcdescs[index].funcdesc;
@@ -5973,7 +5940,7 @@ static HRESULT ITypeInfoImpl_GetInternalDispatchFuncDesc( ITypeInfo *iface,
     }
 
     if (funcs)
-        *funcs = implemented_funcs + This->cFuncs;
+        *funcs = implemented_funcs + This->typeattr.cFuncs;
     else
         *hrefoffset = 0;
     
@@ -6036,7 +6003,7 @@ static HRESULT WINAPI ITypeInfo_fnGetFuncDesc( ITypeInfo2 *iface, UINT index,
     if (This->needs_layout)
         ICreateTypeInfo2_LayOut(&This->ICreateTypeInfo2_iface);
 
-    if (This->typekind == TKIND_DISPATCH)
+    if (This->typeattr.typekind == TKIND_DISPATCH)
         hr = ITypeInfoImpl_GetInternalDispatchFuncDesc((ITypeInfo *)iface, index,
                                                        &internal_funcdesc, NULL,
                                                        &hrefoffset);
@@ -6052,9 +6019,9 @@ static HRESULT WINAPI ITypeInfo_fnGetFuncDesc( ITypeInfo2 *iface, UINT index,
     hr = TLB_AllocAndInitFuncDesc(
         internal_funcdesc,
         ppFuncDesc,
-        This->typekind == TKIND_DISPATCH);
+        This->typeattr.typekind == TKIND_DISPATCH);
 
-    if ((This->typekind == TKIND_DISPATCH) && hrefoffset)
+    if ((This->typeattr.typekind == TKIND_DISPATCH) && hrefoffset)
         ITypeInfoImpl_FuncDescAddHrefOffset(*ppFuncDesc, hrefoffset);
 
     TRACE("-- 0x%08x\n", hr);
@@ -6127,7 +6094,7 @@ static HRESULT WINAPI ITypeInfo_fnGetVarDesc( ITypeInfo2 *iface, UINT index,
 
     TRACE("(%p) index %d\n", This, index);
 
-    if(index >= This->cVars)
+    if(index >= This->typeattr.cVars)
         return TYPE_E_ELEMENTNOTFOUND;
 
     if (This->needs_layout)
@@ -6156,7 +6123,7 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid,
 
     *pcNames = 0;
 
-    pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->cFuncs, memid);
+    pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid);
     if(pFDesc)
     {
         if(!cMaxNames || !pFDesc->Name)
@@ -6174,7 +6141,7 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid,
         return S_OK;
     }
 
-    pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->cVars, memid);
+    pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid);
     if(pVDesc)
     {
       *rgBstrNames=SysAllocString(TLB_get_bstr(pVDesc->Name));
@@ -6183,7 +6150,7 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid,
     else
     {
         if(This->impltypes &&
-	   (This->typekind==TKIND_INTERFACE || This->typekind==TKIND_DISPATCH)) {
+	   (This->typeattr.typekind == TKIND_INTERFACE || This->typeattr.typekind == TKIND_DISPATCH)) {
           /* recursive search */
           ITypeInfo *pTInfo;
           HRESULT result;
@@ -6232,7 +6199,7 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeOfImplType(
          retrieve the associated TKIND_INTERFACE handle for the current TKIND_DISPATCH
       */
 
-      if (This->wTypeFlags & TYPEFLAG_FDUAL)
+      if (This->typeattr.wTypeFlags & TYPEFLAG_FDUAL)
       {
           *pRefType = -2;
       }
@@ -6241,18 +6208,18 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeOfImplType(
         hr = TYPE_E_ELEMENTNOTFOUND;
       }
     }
-    else if(index == 0 && This->typekind == TKIND_DISPATCH)
+    else if(index == 0 && This->typeattr.typekind == TKIND_DISPATCH)
     {
       /* All TKIND_DISPATCHs are made to look like they inherit from IDispatch */
       *pRefType = This->pTypeLib->dispatch_href;
     }
     else
     {
-        if(index >= This->cImplTypes)
+        if(index >= This->typeattr.cImplTypes)
             hr = TYPE_E_ELEMENTNOTFOUND;
         else{
             *pRefType = This->impltypes[index].hRef;
-            if(This->typekind == TKIND_INTERFACE)
+            if (This->typeattr.typekind == TKIND_INTERFACE)
                 *pRefType |= 0x2;
         }
     }
@@ -6283,12 +6250,12 @@ static HRESULT WINAPI ITypeInfo_fnGetImplTypeFlags( ITypeInfo2 *iface,
     if(!pImplTypeFlags)
         return E_INVALIDARG;
 
-    if(This->typekind == TKIND_DISPATCH && index == 0){
+    if(This->typeattr.typekind == TKIND_DISPATCH && index == 0){
         *pImplTypeFlags = 0;
         return S_OK;
     }
 
-    if(index >= This->cImplTypes)
+    if(index >= This->typeattr.cImplTypes)
         return TYPE_E_ELEMENTNOTFOUND;
 
     *pImplTypeFlags = This->impltypes[index].implflags;
@@ -6315,7 +6282,7 @@ static HRESULT WINAPI ITypeInfo_fnGetIDsOfNames( ITypeInfo2 *iface,
     for (i = 0; i < cNames; i++)
         pMemId[i] = MEMBERID_NIL;
 
-    for (fdc = 0; fdc < This->cFuncs; ++fdc) {
+    for (fdc = 0; fdc < This->typeattr.cFuncs; ++fdc) {
         int j;
         const TLBFuncDesc *pFDesc = &This->funcdescs[fdc];
         if(!lstrcmpiW(*rgszNames, TLB_get_bstr(pFDesc->Name))) {
@@ -6333,7 +6300,7 @@ static HRESULT WINAPI ITypeInfo_fnGetIDsOfNames( ITypeInfo2 *iface,
             return ret;
         }
     }
-    pVDesc = TLB_get_vardesc_by_name(This->vardescs, This->cVars, *rgszNames);
+    pVDesc = TLB_get_vardesc_by_name(This->vardescs, This->typeattr.cVars, *rgszNames);
     if(pVDesc){
         if(cNames)
             *pMemId = pVDesc->vardesc.memid;
@@ -6911,7 +6878,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
       This,pIUnk,memid,wFlags,pDispParams,pVarResult,pExcepInfo,pArgErr
     );
 
-    if( This->wTypeFlags & TYPEFLAG_FRESTRICTED )
+    if( This->typeattr.wTypeFlags & TYPEFLAG_FRESTRICTED )
         return DISP_E_MEMBERNOTFOUND;
 
     if (!pDispParams)
@@ -6931,7 +6898,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
 
     /* we do this instead of using GetFuncDesc since it will return a fake
      * FUNCDESC for dispinterfaces and we want the real function description */
-    for (fdc = 0; fdc < This->cFuncs; ++fdc){
+    for (fdc = 0; fdc < This->typeattr.cFuncs; ++fdc){
         pFuncInfo = &This->funcdescs[fdc];
         if ((memid == pFuncInfo->funcdesc.memid) &&
             (wFlags & pFuncInfo->funcdesc.invkind) &&
@@ -6939,7 +6906,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
             break;
     }
 
-    if (fdc < This->cFuncs) {
+    if (fdc < This->typeattr.cFuncs) {
         const FUNCDESC *func_desc = &pFuncInfo->funcdesc;
 
         if (TRACE_ON(ole))
@@ -7444,7 +7411,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface,
             *pBstrHelpFile=SysAllocString(TLB_get_bstr(This->pTypeLib->HelpFile));
         return S_OK;
     }else {/* for a member */
-        pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->cFuncs, memid);
+        pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid);
         if(pFDesc){
             if(pBstrName)
               *pBstrName = SysAllocString(TLB_get_bstr(pFDesc->Name));
@@ -7456,7 +7423,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface,
               *pBstrHelpFile = SysAllocString(TLB_get_bstr(This->pTypeLib->HelpFile));
             return S_OK;
         }
-        pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->cVars, memid);
+        pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid);
         if(pVDesc){
             if(pBstrName)
               *pBstrName = SysAllocString(TLB_get_bstr(pVDesc->Name));
@@ -7471,7 +7438,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface,
     }
 
     if(This->impltypes &&
-       (This->typekind==TKIND_INTERFACE || This->typekind==TKIND_DISPATCH)) {
+       (This->typeattr.typekind == TKIND_INTERFACE || This->typeattr.typekind == TKIND_DISPATCH)) {
         /* recursive search */
         ITypeInfo *pTInfo;
         HRESULT result;
@@ -7507,10 +7474,10 @@ static HRESULT WINAPI ITypeInfo_fnGetDllEntry( ITypeInfo2 *iface, MEMBERID memid
     if (pBstrName) *pBstrName = NULL;
     if (pwOrdinal) *pwOrdinal = 0;
 
-    if (This->typekind != TKIND_MODULE)
+    if (This->typeattr.typekind != TKIND_MODULE)
         return TYPE_E_BADMODULEKIND;
 
-    pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->cFuncs, memid);
+    pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid);
     if(pFDesc){
 	    dump_TypeInfo(This);
 	    if (TRACE_ON(ole))
@@ -7625,9 +7592,9 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeInfo(
     if ((INT)hRefType < 0) {
         ITypeInfoImpl *pTypeInfoImpl;
 
-        if (!(This->wTypeFlags & TYPEFLAG_FDUAL) ||
-                !(This->typekind == TKIND_INTERFACE ||
-                    This->typekind == TKIND_DISPATCH))
+        if (!(This->typeattr.wTypeFlags & TYPEFLAG_FDUAL) ||
+                !(This->typeattr.typekind == TKIND_INTERFACE ||
+                    This->typeattr.typekind == TKIND_DISPATCH))
             return TYPE_E_ELEMENTNOTFOUND;
 
         /* when we meet a DUAL typeinfo, we must create the alternate
@@ -7639,10 +7606,10 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeInfo(
         pTypeInfoImpl->ref = 0;
         list_init(&pTypeInfoImpl->custdata_list);
 
-        if (This->typekind == TKIND_INTERFACE)
-            pTypeInfoImpl->typekind = TKIND_DISPATCH;
+        if (This->typeattr.typekind == TKIND_INTERFACE)
+            pTypeInfoImpl->typeattr.typekind = TKIND_DISPATCH;
         else
-            pTypeInfoImpl->typekind = TKIND_INTERFACE;
+            pTypeInfoImpl->typeattr.typekind = TKIND_INTERFACE;
 
         *ppTInfo = (ITypeInfo *)&pTypeInfoImpl->ITypeInfo2_iface;
         /* the AddRef implicitly adds a reference to the parent typelib, which
@@ -7655,7 +7622,7 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeInfo(
 
         result = S_OK;
     } else if ((hRefType & DISPATCH_HREF_MASK) &&
-        (This->typekind   == TKIND_DISPATCH))
+        (This->typeattr.typekind == TKIND_DISPATCH))
     {
         HREFTYPE href_dispatch = hRefType;
         result = ITypeInfoImpl_GetDispatchRefTypeInfo((ITypeInfo *)iface, &href_dispatch, ppTInfo);
@@ -7956,7 +7923,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetTypeKind( ITypeInfo2 * iface,
     TYPEKIND *pTypeKind)
 {
     ITypeInfoImpl *This = impl_from_ITypeInfo2(iface);
-    *pTypeKind=This->typekind;
+    *pTypeKind = This->typeattr.typekind;
     TRACE("(%p) type 0x%0x\n", This,*pTypeKind);
     return S_OK;
 }
@@ -7971,7 +7938,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetTypeKind( ITypeInfo2 * iface,
 static HRESULT WINAPI ITypeInfo2_fnGetTypeFlags( ITypeInfo2 *iface, ULONG *pTypeFlags)
 {
     ITypeInfoImpl *This = impl_from_ITypeInfo2(iface);
-    *pTypeFlags=This->wTypeFlags;
+    *pTypeFlags=This->typeattr.wTypeFlags;
     TRACE("(%p) flags 0x%x\n", This,*pTypeFlags);
     return S_OK;
 }
@@ -7988,12 +7955,12 @@ static HRESULT WINAPI ITypeInfo2_fnGetFuncIndexOfMemId( ITypeInfo2 * iface,
     UINT fdc;
     HRESULT result;
 
-    for (fdc = 0; fdc < This->cFuncs; ++fdc){
+    for (fdc = 0; fdc < This->typeattr.cFuncs; ++fdc){
         const TLBFuncDesc *pFuncInfo = &This->funcdescs[fdc];
         if(memid == pFuncInfo->funcdesc.memid && (invKind & pFuncInfo->funcdesc.invkind))
             break;
     }
-    if(fdc < This->cFuncs) {
+    if(fdc < This->typeattr.cFuncs) {
         *pFuncIndex = fdc;
         result = S_OK;
     } else
@@ -8018,7 +7985,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetVarIndexOfMemId( ITypeInfo2 * iface,
 
     TRACE("%p %d %p\n", iface, memid, pVarIndex);
 
-    pVarInfo = TLB_get_vardesc_by_memberid(This->vardescs, This->cVars, memid);
+    pVarInfo = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid);
     if(!pVarInfo)
         return TYPE_E_ELEMENTNOTFOUND;
 
@@ -8070,7 +8037,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetFuncCustData(
 
     TRACE("%p %u %s %p\n", This, index, debugstr_guid(guid), pVarVal);
 
-    if(index >= This->cFuncs)
+    if(index >= This->typeattr.cFuncs)
         return TYPE_E_ELEMENTNOTFOUND;
 
     pCData = TLB_get_custdata_by_guid(&pFDesc->custdata_list, guid);
@@ -8101,7 +8068,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetParamCustData(
     TRACE("%p %u %u %s %p\n", This, indexFunc, indexParam,
             debugstr_guid(guid), pVarVal);
 
-    if(indexFunc >= This->cFuncs)
+    if(indexFunc >= This->typeattr.cFuncs)
         return TYPE_E_ELEMENTNOTFOUND;
 
     if(indexParam >= pFDesc->funcdesc.cParams)
@@ -8133,7 +8100,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetVarCustData(
 
     TRACE("%p %s %p\n", This, debugstr_guid(guid), pVarVal);
 
-    if(index >= This->cVars)
+    if(index >= This->typeattr.cVars)
         return TYPE_E_ELEMENTNOTFOUND;
 
     pCData = TLB_get_custdata_by_guid(&pVDesc->custdata_list, guid);
@@ -8162,7 +8129,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetImplTypeCustData(
 
     TRACE("%p %u %s %p\n", This, index, debugstr_guid(guid), pVarVal);
 
-    if(index >= This->cImplTypes)
+    if(index >= This->typeattr.cImplTypes)
         return TYPE_E_ELEMENTNOTFOUND;
 
     pCData = TLB_get_custdata_by_guid(&pRDesc->custdata_list, guid);
@@ -8211,7 +8178,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetDocumentation2(
                 SysAllocString(TLB_get_bstr(This->pTypeLib->HelpStringDll));/* FIXME */
         return S_OK;
     }else {/* for a member */
-        pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->cFuncs, memid);
+        pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid);
         if(pFDesc){
             if(pbstrHelpString)
                 *pbstrHelpString=SysAllocString(TLB_get_bstr(pFDesc->HelpString));
@@ -8222,7 +8189,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetDocumentation2(
                     SysAllocString(TLB_get_bstr(This->pTypeLib->HelpStringDll));/* FIXME */
             return S_OK;
         }
-        pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->cVars, memid);
+        pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid);
         if(pVDesc){
             if(pbstrHelpString)
                 *pbstrHelpString=SysAllocString(TLB_get_bstr(pVDesc->HelpString));
@@ -8268,7 +8235,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetAllFuncCustData(
 
     TRACE("%p %u %p\n", This, index, pCustData);
 
-    if(index >= This->cFuncs)
+    if(index >= This->typeattr.cFuncs)
         return TYPE_E_ELEMENTNOTFOUND;
 
     return TLB_copy_all_custdata(&pFDesc->custdata_list, pCustData);
@@ -8287,7 +8254,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetAllParamCustData( ITypeInfo2 * iface,
 
     TRACE("%p %u %u %p\n", This, indexFunc, indexParam, pCustData);
 
-    if(indexFunc >= This->cFuncs)
+    if(indexFunc >= This->typeattr.cFuncs)
         return TYPE_E_ELEMENTNOTFOUND;
 
     if(indexParam >= pFDesc->funcdesc.cParams)
@@ -8309,7 +8276,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetAllVarCustData( ITypeInfo2 * iface,
 
     TRACE("%p %u %p\n", This, index, pCustData);
 
-    if(index >= This->cVars)
+    if(index >= This->typeattr.cVars)
         return TYPE_E_ELEMENTNOTFOUND;
 
     return TLB_copy_all_custdata(&pVDesc->custdata_list, pCustData);
@@ -8330,7 +8297,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetAllImplTypeCustData(
 
     TRACE("%p %u %p\n", This, index, pCustData);
 
-    if(index >= This->cImplTypes)
+    if(index >= This->typeattr.cImplTypes)
         return TYPE_E_ELEMENTNOTFOUND;
 
     return TLB_copy_all_custdata(&pRDesc->custdata_list, pCustData);
@@ -8418,17 +8385,17 @@ HRESULT WINAPI CreateDispTypeInfo(
     pTIIface->Name = NULL;
     pTIIface->dwHelpContext = -1;
     pTIIface->guid = NULL;
-    pTIIface->lcid = lcid;
-    pTIIface->typekind = TKIND_INTERFACE;
-    pTIIface->wMajorVerNum = 0;
-    pTIIface->wMinorVerNum = 0;
-    pTIIface->cbAlignment = 2;
-    pTIIface->cbSizeInstance = -1;
-    pTIIface->cbSizeVft = -1;
-    pTIIface->cFuncs = 0;
-    pTIIface->cImplTypes = 0;
-    pTIIface->cVars = 0;
-    pTIIface->wTypeFlags = 0;
+    pTIIface->typeattr.lcid = lcid;
+    pTIIface->typeattr.typekind = TKIND_INTERFACE;
+    pTIIface->typeattr.wMajorVerNum = 0;
+    pTIIface->typeattr.wMinorVerNum = 0;
+    pTIIface->typeattr.cbAlignment = 2;
+    pTIIface->typeattr.cbSizeInstance = -1;
+    pTIIface->typeattr.cbSizeVft = -1;
+    pTIIface->typeattr.cFuncs = 0;
+    pTIIface->typeattr.cImplTypes = 0;
+    pTIIface->typeattr.cVars = 0;
+    pTIIface->typeattr.wTypeFlags = 0;
     pTIIface->hreftype = 0;
 
     pTIIface->funcdescs = TLBFuncDesc_Alloc(pidata->cMembers);
@@ -8461,7 +8428,7 @@ HRESULT WINAPI CreateDispTypeInfo(
         pFuncDesc->HelpString = NULL;
         pFuncDesc->Entry = NULL;
         list_init(&pFuncDesc->custdata_list);
-        pTIIface->cFuncs++;
+        pTIIface->typeattr.cFuncs++;
         ++pFuncDesc;
     }
 
@@ -8473,17 +8440,17 @@ HRESULT WINAPI CreateDispTypeInfo(
     pTIClass->Name = NULL;
     pTIClass->dwHelpContext = -1;
     pTIClass->guid = NULL;
-    pTIClass->lcid = lcid;
-    pTIClass->typekind = TKIND_COCLASS;
-    pTIClass->wMajorVerNum = 0;
-    pTIClass->wMinorVerNum = 0;
-    pTIClass->cbAlignment = 2;
-    pTIClass->cbSizeInstance = -1;
-    pTIClass->cbSizeVft = -1;
-    pTIClass->cFuncs = 0;
-    pTIClass->cImplTypes = 1;
-    pTIClass->cVars = 0;
-    pTIClass->wTypeFlags = 0;
+    pTIClass->typeattr.lcid = lcid;
+    pTIClass->typeattr.typekind = TKIND_COCLASS;
+    pTIClass->typeattr.wMajorVerNum = 0;
+    pTIClass->typeattr.wMinorVerNum = 0;
+    pTIClass->typeattr.cbAlignment = 2;
+    pTIClass->typeattr.cbSizeInstance = -1;
+    pTIClass->typeattr.cbSizeVft = -1;
+    pTIClass->typeattr.cFuncs = 0;
+    pTIClass->typeattr.cImplTypes = 1;
+    pTIClass->typeattr.cVars = 0;
+    pTIClass->typeattr.wTypeFlags = 0;
     pTIClass->hreftype = sizeof(MSFT_TypeInfoBase);
 
     pTIClass->impltypes = TLBImplType_Alloc(1);
@@ -8545,7 +8512,7 @@ static HRESULT WINAPI ITypeComp_fnBind(
     pBindPtr->lpfuncdesc = NULL;
     *ppTInfo = NULL;
 
-    for(fdc = 0; fdc < This->cFuncs; ++fdc){
+    for(fdc = 0; fdc < This->typeattr.cFuncs; ++fdc){
         pFDesc = &This->funcdescs[fdc];
         if (!lstrcmpiW(TLB_get_bstr(pFDesc->Name), szName)) {
             if (!wFlags || (pFDesc->funcdesc.invkind & wFlags))
@@ -8556,12 +8523,12 @@ static HRESULT WINAPI ITypeComp_fnBind(
         }
     }
 
-    if (fdc < This->cFuncs)
+    if (fdc < This->typeattr.cFuncs)
     {
         HRESULT hr = TLB_AllocAndInitFuncDesc(
             &pFDesc->funcdesc,
             &pBindPtr->lpfuncdesc,
-            This->typekind == TKIND_DISPATCH);
+            This->typeattr.typekind == TKIND_DISPATCH);
         if (FAILED(hr))
             return hr;
         *pDescKind = DESCKIND_FUNCDESC;
@@ -8569,7 +8536,7 @@ static HRESULT WINAPI ITypeComp_fnBind(
         ITypeInfo_AddRef(*ppTInfo);
         return S_OK;
     } else {
-        pVDesc = TLB_get_vardesc_by_name(This->vardescs, This->cVars, szName);
+        pVDesc = TLB_get_vardesc_by_name(This->vardescs, This->typeattr.cVars, szName);
         if(pVDesc){
             HRESULT hr = TLB_AllocAndInitVarDesc(&pVDesc->vardesc, &pBindPtr->lpvardesc);
             if (FAILED(hr))
@@ -8597,7 +8564,7 @@ static HRESULT WINAPI ITypeComp_fnBind(
             hr = ITypeComp_Bind(pTComp, szName, lHash, wFlags, ppTInfo, pDescKind, pBindPtr);
             ITypeComp_Release(pTComp);
             if (SUCCEEDED(hr) && *pDescKind == DESCKIND_FUNCDESC &&
-                    This->typekind == TKIND_DISPATCH)
+                    This->typeattr.typekind == TKIND_DISPATCH)
             {
                 FUNCDESC *tmp = pBindPtr->lpfuncdesc;
                 hr = TLB_AllocAndInitFuncDesc(tmp, &pBindPtr->lpfuncdesc, TRUE);
@@ -8724,29 +8691,29 @@ static HRESULT WINAPI ICreateTypeLib2_fnCreateTypeInfo(ICreateTypeLib2 *iface,
     info->pTypeLib = This;
     info->Name = TLB_append_str(&This->name_list, name);
     info->index = This->TypeInfoCount;
-    info->typekind = kind;
-    info->cbAlignment = 4;
+    info->typeattr.typekind = kind;
+    info->typeattr.cbAlignment = 4;
 
-    switch(info->typekind) {
+    switch (info->typeattr.typekind) {
     case TKIND_ENUM:
     case TKIND_INTERFACE:
     case TKIND_DISPATCH:
     case TKIND_COCLASS:
-        info->cbSizeInstance = This->ptr_size;
+        info->typeattr.cbSizeInstance = This->ptr_size;
         break;
     case TKIND_RECORD:
     case TKIND_UNION:
-        info->cbSizeInstance = 0;
+        info->typeattr.cbSizeInstance = 0;
         break;
     case TKIND_MODULE:
-        info->cbSizeInstance = 2;
+        info->typeattr.cbSizeInstance = 2;
         break;
     case TKIND_ALIAS:
-        info->cbSizeInstance = -0x75;
+        info->typeattr.cbSizeInstance = -0x75;
         break;
     default:
-        FIXME("unrecognized typekind %d\n", info->typekind);
-        info->cbSizeInstance = 0xdeadbeef;
+        FIXME("unrecognized typekind %d\n", info->typeattr.typekind);
+        info->typeattr.cbSizeInstance = 0xdeadbeef;
         break;
     }
 
@@ -9319,7 +9286,7 @@ static DWORD WMSFT_compile_typeinfo_aux(ITypeInfoImpl *info,
     MEMBERID *memid;
     DWORD *name, *offsets, offs;
 
-    for(i = 0; i < info->cFuncs; ++i){
+    for(i = 0; i < info->typeattr.cFuncs; ++i){
         TLBFuncDesc *desc = &info->funcdescs[i];
 
         recorded_size += 6 * sizeof(INT); /* mandatory fields */
@@ -9350,7 +9317,7 @@ static DWORD WMSFT_compile_typeinfo_aux(ITypeInfoImpl *info,
         extra_size += 2 * sizeof(INT); /* memberid, name offs */
     }
 
-    for(i = 0; i < info->cVars; ++i){
+    for(i = 0; i < info->typeattr.cVars; ++i){
         TLBVarDesc *desc = &info->vardescs[i];
 
         recorded_size += 5 * sizeof(INT); /* mandatory fields */
@@ -9376,7 +9343,7 @@ static DWORD WMSFT_compile_typeinfo_aux(ITypeInfoImpl *info,
 
     aux_seg->len += recorded_size + extra_size;
 
-    aux_seg->len += sizeof(INT) * (info->cVars + info->cFuncs); /* offsets at the end */
+    aux_seg->len += sizeof(INT) * (info->typeattr.cVars + info->typeattr.cFuncs); /* offsets at the end */
 
     if(aux_seg->data)
         aux_seg->data = heap_realloc(aux_seg->data, aux_seg->len);
@@ -9389,7 +9356,7 @@ static DWORD WMSFT_compile_typeinfo_aux(ITypeInfoImpl *info,
     offs = 0;
 
     funcrecord = (MSFT_FuncRecord*)(((char *)aux_seg->data) + ret + sizeof(INT));
-    for(i = 0; i < info->cFuncs; ++i){
+    for(i = 0; i < info->typeattr.cFuncs; ++i){
         TLBFuncDesc *desc = &info->funcdescs[i];
         DWORD size = 6 * sizeof(INT), paramdefault_size = 0, *paramdefault;
 
@@ -9519,7 +9486,7 @@ static DWORD WMSFT_compile_typeinfo_aux(ITypeInfoImpl *info,
     }
 
     varrecord = (MSFT_VarRecord*)funcrecord;
-    for(i = 0; i < info->cVars; ++i){
+    for(i = 0; i < info->typeattr.cVars; ++i){
         TLBVarDesc *desc = &info->vardescs[i];
         DWORD size = 5 * sizeof(INT);
 
@@ -9576,19 +9543,19 @@ static DWORD WMSFT_compile_typeinfo_aux(ITypeInfoImpl *info,
     }
 
     memid = (MEMBERID*)varrecord;
-    for(i = 0; i < info->cFuncs; ++i){
+    for(i = 0; i < info->typeattr.cFuncs; ++i){
         TLBFuncDesc *desc = &info->funcdescs[i];
         *memid = desc->funcdesc.memid;
         ++memid;
     }
-    for(i = 0; i < info->cVars; ++i){
+    for(i = 0; i < info->typeattr.cVars; ++i){
         TLBVarDesc *desc = &info->vardescs[i];
         *memid = desc->vardesc.memid;
         ++memid;
     }
 
     name = (UINT*)memid;
-    for(i = 0; i < info->cFuncs; ++i){
+    for(i = 0; i < info->typeattr.cFuncs; ++i){
         TLBFuncDesc *desc = &info->funcdescs[i];
         if(desc->Name)
             *name = desc->Name->offset;
@@ -9596,7 +9563,7 @@ static DWORD WMSFT_compile_typeinfo_aux(ITypeInfoImpl *info,
             *name = -1;
         ++name;
     }
-    for(i = 0; i < info->cVars; ++i){
+    for(i = 0; i < info->typeattr.cVars; ++i){
         TLBVarDesc *desc = &info->vardescs[i];
         if(desc->Name)
             *name = desc->Name->offset;
@@ -9620,7 +9587,7 @@ static DWORD WMSFT_compile_typeinfo_ref(ITypeInfoImpl *info, WMSFT_TLBFile *file
     DWORD offs = file->ref_seg.len, i;
     WMSFT_RefChunk *chunk;
 
-    file->ref_seg.len += info->cImplTypes * sizeof(WMSFT_RefChunk);
+    file->ref_seg.len += info->typeattr.cImplTypes * sizeof(WMSFT_RefChunk);
     if(!file->ref_seg.data)
         file->ref_seg.data = heap_alloc(file->ref_seg.len);
     else
@@ -9628,11 +9595,11 @@ static DWORD WMSFT_compile_typeinfo_ref(ITypeInfoImpl *info, WMSFT_TLBFile *file
 
     chunk = (WMSFT_RefChunk*)((char*)file->ref_seg.data + offs);
 
-    for(i = 0; i < info->cImplTypes; ++i){
+    for(i = 0; i < info->typeattr.cImplTypes; ++i){
         chunk->href = info->impltypes[i].hRef;
         chunk->res04 = info->impltypes[i].implflags;
         chunk->res08 = -1;
-        if(i < info->cImplTypes - 1)
+        if(i < info->typeattr.cImplTypes - 1)
             chunk->next = offs + sizeof(WMSFT_RefChunk) * (i + 1);
         else
             chunk->next = -1;
@@ -9650,18 +9617,18 @@ static DWORD WMSFT_compile_typeinfo(ITypeInfoImpl *info, INT16 index, WMSFT_TLBF
 
     if(data){
         MSFT_TypeInfoBase *base = (MSFT_TypeInfoBase*)data;
-        if(info->wTypeFlags & TYPEFLAG_FDUAL)
+        if(info->typeattr.wTypeFlags & TYPEFLAG_FDUAL)
             base->typekind = TKIND_DISPATCH;
         else
-            base->typekind = info->typekind;
+            base->typekind = info->typeattr.typekind;
         base->typekind |= index << 16; /* TODO: There are some other flags here */
-        base->typekind |= (info->cbAlignment << 11) | (info->cbAlignment << 6);
+        base->typekind |= (info->typeattr.cbAlignment << 11) | (info->typeattr.cbAlignment << 6);
         base->memoffset = WMSFT_compile_typeinfo_aux(info, file);
         base->res2 = 0;
         base->res3 = 0;
         base->res4 = 3;
         base->res5 = 0;
-        base->cElement = (info->cVars << 16) | info->cFuncs;
+        base->cElement = (info->typeattr.cVars << 16) | info->typeattr.cFuncs;
         base->res7 = 0;
         base->res8 = 0;
         base->res9 = 0;
@@ -9670,7 +9637,7 @@ static DWORD WMSFT_compile_typeinfo(ITypeInfoImpl *info, INT16 index, WMSFT_TLBF
             base->posguid = info->guid->offset;
         else
             base->posguid = -1;
-        base->flags = info->wTypeFlags;
+        base->flags = info->typeattr.wTypeFlags;
         if(info->Name) {
             base->NameOffset = info->Name->offset;
 
@@ -9679,7 +9646,7 @@ static DWORD WMSFT_compile_typeinfo(ITypeInfoImpl *info, INT16 index, WMSFT_TLBF
         }else {
             base->NameOffset = -1;
         }
-        base->version = (info->wMinorVerNum << 16) | info->wMajorVerNum;
+        base->version = (info->typeattr.wMinorVerNum << 16) | info->typeattr.wMajorVerNum;
         if(info->DocString)
             base->docstringoffs = info->DocString->offset;
         else
@@ -9687,20 +9654,20 @@ static DWORD WMSFT_compile_typeinfo(ITypeInfoImpl *info, INT16 index, WMSFT_TLBF
         base->helpstringcontext = info->dwHelpStringContext;
         base->helpcontext = info->dwHelpContext;
         base->oCustData = WMSFT_compile_custdata(info->pcustdata_list, file);
-        base->cImplTypes = info->cImplTypes;
-        base->cbSizeVft = info->cbSizeVft;
-        base->size = info->cbSizeInstance;
-        if(info->typekind == TKIND_COCLASS){
+        base->cImplTypes = info->typeattr.cImplTypes;
+        base->cbSizeVft = info->typeattr.cbSizeVft;
+        base->size = info->typeattr.cbSizeInstance;
+        if(info->typeattr.typekind == TKIND_COCLASS){
             base->datatype1 = WMSFT_compile_typeinfo_ref(info, file);
-        }else if(info->typekind == TKIND_ALIAS){
+        }else if(info->typeattr.typekind == TKIND_ALIAS){
             base->datatype1 = WMSFT_append_typedesc(info->tdescAlias, file, NULL, NULL);
-        }else if(info->typekind == TKIND_MODULE){
+        }else if(info->typeattr.typekind == TKIND_MODULE){
             if(info->DllName)
                 base->datatype1 = info->DllName->offset;
             else
                 base->datatype1 = -1;
         }else{
-            if(info->cImplTypes > 0)
+            if(info->typeattr.cImplTypes > 0)
                 base->datatype1 = info->impltypes[0].hRef;
             else
                 base->datatype1 = -1;
@@ -10253,12 +10220,12 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetTypeFlags(ICreateTypeInfo2 *iface,
             return hres;
     }
 
-    old_flags = This->wTypeFlags;
-    This->wTypeFlags = typeFlags;
+    old_flags = This->typeattr.wTypeFlags;
+    This->typeattr.wTypeFlags = typeFlags;
 
     hres = ICreateTypeInfo2_LayOut(iface);
     if (FAILED(hres)) {
-        This->wTypeFlags = old_flags;
+        This->typeattr.wTypeFlags = old_flags;
         return hres;
     }
 
@@ -10299,8 +10266,8 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetVersion(ICreateTypeInfo2 *iface,
 
     TRACE("%p %d %d\n", This, majorVerNum, minorVerNum);
 
-    This->wMajorVerNum = majorVerNum;
-    This->wMinorVerNum = minorVerNum;
+    This->typeattr.wMajorVerNum = majorVerNum;
+    This->typeattr.wMinorVerNum = minorVerNum;
 
     return S_OK;
 }
@@ -10427,7 +10394,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(ICreateTypeInfo2 *iface,
     if (!funcDesc || funcDesc->oVft & 3)
         return E_INVALIDARG;
 
-    switch (This->typekind) {
+    switch (This->typeattr.typekind) {
     case TKIND_MODULE:
         if (funcDesc->funckind != FUNC_STATIC)
             return TYPE_E_BADMODULEKIND;
@@ -10441,7 +10408,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(ICreateTypeInfo2 *iface,
             return TYPE_E_BADMODULEKIND;
     }
 
-    if (index > This->cFuncs)
+    if (index > This->typeattr.cFuncs)
         return TYPE_E_ELEMENTNOTFOUND;
 
     if (funcDesc->invkind & (INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF) &&
@@ -10507,17 +10474,17 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(ICreateTypeInfo2 *iface,
 
     if (This->funcdescs) {
         This->funcdescs = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->funcdescs,
-                sizeof(TLBFuncDesc) * (This->cFuncs + 1));
+                sizeof(TLBFuncDesc) * (This->typeattr.cFuncs + 1));
 
-        if (index < This->cFuncs) {
+        if (index < This->typeattr.cFuncs) {
             memmove(This->funcdescs + index + 1, This->funcdescs + index,
-                    (This->cFuncs - index) * sizeof(TLBFuncDesc));
+                    (This->typeattr.cFuncs - index) * sizeof(TLBFuncDesc));
             func_desc = This->funcdescs + index;
         } else
-            func_desc = This->funcdescs + This->cFuncs;
+            func_desc = This->funcdescs + This->typeattr.cFuncs;
 
         /* move custdata lists to the new memory location */
-        for(i = 0; i < This->cFuncs + 1; ++i){
+        for(i = 0; i < This->typeattr.cFuncs + 1; ++i){
             if(index != i){
                 TLBFuncDesc *fd = &This->funcdescs[i];
                 if(fd->custdata_list.prev == fd->custdata_list.next)
@@ -10534,7 +10501,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(ICreateTypeInfo2 *iface,
     memcpy(func_desc, &tmp_func_desc, sizeof(tmp_func_desc));
     list_init(&func_desc->custdata_list);
 
-    ++This->cFuncs;
+    ++This->typeattr.cFuncs;
 
     This->needs_layout = TRUE;
 
@@ -10550,25 +10517,25 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddImplType(ICreateTypeInfo2 *iface,
 
     TRACE("%p %u %d\n", This, index, refType);
 
-    switch(This->typekind){
+    switch(This->typeattr.typekind){
         case TKIND_COCLASS: {
             if (index == -1) {
                 FIXME("Unhandled index: -1\n");
                 return E_NOTIMPL;
             }
 
-            if(index != This->cImplTypes)
+            if(index != This->typeattr.cImplTypes)
                 return TYPE_E_ELEMENTNOTFOUND;
 
             break;
         }
         case TKIND_INTERFACE:
         case TKIND_DISPATCH:
-            if (index != 0 || This->cImplTypes)
+            if (index != 0 || This->typeattr.cImplTypes)
                 return TYPE_E_ELEMENTNOTFOUND;
             break;
         default:
-            FIXME("Unimplemented typekind: %d\n", This->typekind);
+            FIXME("Unimplemented typekind: %d\n", This->typeattr.typekind);
             return E_NOTIMPL;
     }
 
@@ -10576,17 +10543,17 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddImplType(ICreateTypeInfo2 *iface,
         UINT i;
 
         This->impltypes = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->impltypes,
-                sizeof(TLBImplType) * (This->cImplTypes + 1));
+                sizeof(TLBImplType) * (This->typeattr.cImplTypes + 1));
 
-        if (index < This->cImplTypes) {
+        if (index < This->typeattr.cImplTypes) {
             memmove(This->impltypes + index + 1, This->impltypes + index,
-                    (This->cImplTypes - index) * sizeof(TLBImplType));
+                    (This->typeattr.cImplTypes - index) * sizeof(TLBImplType));
             impl_type = This->impltypes + index;
         } else
-            impl_type = This->impltypes + This->cImplTypes;
+            impl_type = This->impltypes + This->typeattr.cImplTypes;
 
         /* move custdata lists to the new memory location */
-        for(i = 0; i < This->cImplTypes + 1; ++i){
+        for(i = 0; i < This->typeattr.cImplTypes + 1; ++i){
             if(index != i){
                 TLBImplType *it = &This->impltypes[i];
                 if(it->custdata_list.prev == it->custdata_list.next)
@@ -10604,10 +10571,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddImplType(ICreateTypeInfo2 *iface,
     TLBImplType_Constructor(impl_type);
     impl_type->hRef = refType;
 
-    ++This->cImplTypes;
+    ++This->typeattr.cImplTypes;
 
     if((refType & (~0x3)) == (This->pTypeLib->dispatch_href & (~0x3)))
-        This->wTypeFlags |= TYPEFLAG_FDISPATCHABLE;
+        This->typeattr.wTypeFlags |= TYPEFLAG_FDISPATCHABLE;
 
     hres = ICreateTypeInfo2_LayOut(iface);
     if (FAILED(hres))
@@ -10624,10 +10591,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetImplTypeFlags(ICreateTypeInfo2 *ifac
 
     TRACE("%p %u %x\n", This, index, implTypeFlags);
 
-    if (This->typekind != TKIND_COCLASS)
+    if (This->typeattr.typekind != TKIND_COCLASS)
         return TYPE_E_BADMODULEKIND;
 
-    if (index >= This->cImplTypes)
+    if (index >= This->typeattr.cImplTypes)
         return TYPE_E_ELEMENTNOTFOUND;
 
     impl_type->implflags = implTypeFlags;
@@ -10642,7 +10609,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetAlignment(ICreateTypeInfo2 *iface,
 
     TRACE("%p %d\n", This, alignment);
 
-    This->cbAlignment = alignment;
+    This->typeattr.cbAlignment = alignment;
 
     return S_OK;
 }
@@ -10659,7 +10626,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetSchema(ICreateTypeInfo2 *iface,
 
     This->Schema = TLB_append_str(&This->pTypeLib->string_list, schema);
 
-    This->lpstrSchema = This->Schema->str;
+    This->typeattr.lpstrSchema = This->Schema->str;
 
     return S_OK;
 }
@@ -10676,17 +10643,17 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(ICreateTypeInfo2 *iface,
         UINT i;
 
         This->vardescs = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->vardescs,
-                sizeof(TLBVarDesc) * (This->cVars + 1));
+                sizeof(TLBVarDesc) * (This->typeattr.cVars + 1));
 
-        if (index < This->cVars) {
+        if (index < This->typeattr.cVars) {
             memmove(This->vardescs + index + 1, This->vardescs + index,
-                    (This->cVars - index) * sizeof(TLBVarDesc));
+                    (This->typeattr.cVars - index) * sizeof(TLBVarDesc));
             var_desc = This->vardescs + index;
         } else
-            var_desc = This->vardescs + This->cVars;
+            var_desc = This->vardescs + This->typeattr.cVars;
 
         /* move custdata lists to the new memory location */
-        for(i = 0; i < This->cVars + 1; ++i){
+        for(i = 0; i < This->typeattr.cVars + 1; ++i){
             if(index != i){
                 TLBVarDesc *var = &This->vardescs[i];
                 if(var->custdata_list.prev == var->custdata_list.next)
@@ -10704,7 +10671,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(ICreateTypeInfo2 *iface,
     TLB_AllocAndInitVarDesc(varDesc, &var_desc->vardesc_create);
     var_desc->vardesc = *var_desc->vardesc_create;
 
-    ++This->cVars;
+    ++This->typeattr.cVars;
 
     This->needs_layout = TRUE;
 
@@ -10723,7 +10690,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncAndParamNames(ICreateTypeInfo2 *
     if (!names)
         return E_INVALIDARG;
 
-    if (index >= This->cFuncs || numNames == 0)
+    if (index >= This->typeattr.cFuncs || numNames == 0)
         return TYPE_E_ELEMENTNOTFOUND;
 
     if (func_desc->funcdesc.invkind & (INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF)){
@@ -10733,7 +10700,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncAndParamNames(ICreateTypeInfo2 *
         if(numNames > func_desc->funcdesc.cParams + 1)
             return TYPE_E_ELEMENTNOTFOUND;
 
-    for(i = 0; i < This->cFuncs; ++i) {
+    for(i = 0; i < This->typeattr.cFuncs; ++i) {
         TLBFuncDesc *iter = &This->funcdescs[i];
         if (iter->Name && !strcmpW(TLB_get_bstr(iter->Name), *names)) {
             if (iter->funcdesc.invkind & (INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF | INVOKE_PROPERTYGET) &&
@@ -10764,7 +10731,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetVarName(ICreateTypeInfo2 *iface,
     if(!name)
         return E_INVALIDARG;
 
-    if(index >= This->cVars)
+    if(index >= This->typeattr.cVars)
         return TYPE_E_ELEMENTNOTFOUND;
 
     This->vardescs[index].Name = TLB_append_str(&This->pTypeLib->name_list, name);
@@ -10782,10 +10749,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetTypeDescAlias(ICreateTypeInfo2 *ifac
     if(!tdescAlias)
         return E_INVALIDARG;
 
-    if(This->typekind != TKIND_ALIAS)
+    if(This->typeattr.typekind != TKIND_ALIAS)
         return TYPE_E_BADMODULEKIND;
 
-    hr = TLB_size_instance(This, This->pTypeLib->syskind, tdescAlias, &This->cbSizeInstance, &This->cbAlignment);
+    hr = TLB_size_instance(This, This->pTypeLib->syskind, tdescAlias, &This->typeattr.cbSizeInstance, &This->typeattr.cbAlignment);
     if(FAILED(hr))
         return hr;
 
@@ -10815,7 +10782,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncDocString(ICreateTypeInfo2 *ifac
     if(!docString)
         return E_INVALIDARG;
 
-    if(index >= This->cFuncs)
+    if(index >= This->typeattr.cFuncs)
         return TYPE_E_ELEMENTNOTFOUND;
 
     func_desc->HelpString = TLB_append_str(&This->pTypeLib->string_list, docString);
@@ -10834,7 +10801,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetVarDocString(ICreateTypeInfo2 *iface
     if(!docString)
         return E_INVALIDARG;
 
-    if(index >= This->cVars)
+    if(index >= This->typeattr.cVars)
         return TYPE_E_ELEMENTNOTFOUND;
 
     var_desc->HelpString = TLB_append_str(&This->pTypeLib->string_list, docString);
@@ -10850,7 +10817,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncHelpContext(ICreateTypeInfo2 *if
 
     TRACE("%p %u %d\n", This, index, helpContext);
 
-    if(index >= This->cFuncs)
+    if(index >= This->typeattr.cFuncs)
         return TYPE_E_ELEMENTNOTFOUND;
 
     func_desc->helpcontext = helpContext;
@@ -10866,7 +10833,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetVarHelpContext(ICreateTypeInfo2 *ifa
 
     TRACE("%p %u %d\n", This, index, helpContext);
 
-    if(index >= This->cVars)
+    if(index >= This->typeattr.cVars)
         return TYPE_E_ELEMENTNOTFOUND;
 
     var_desc->HelpContext = helpContext;
@@ -10892,8 +10859,8 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetTypeIdldesc(ICreateTypeInfo2 *iface,
     if (!idlDesc)
         return E_INVALIDARG;
 
-    This->idldescType.dwReserved = idlDesc->dwReserved;
-    This->idldescType.wIDLFlags = idlDesc->wIDLFlags;
+    This->typeattr.idldescType.dwReserved = idlDesc->dwReserved;
+    This->typeattr.idldescType.wIDLFlags = idlDesc->wIDLFlags;
 
     return S_OK;
 }
@@ -10914,7 +10881,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(ICreateTypeInfo2 *iface)
     if (FAILED(hres))
         return hres;
 
-    if (This->typekind == TKIND_INTERFACE) {
+    if (This->typeattr.typekind == TKIND_INTERFACE) {
         ITypeInfo *inh;
         TYPEATTR *attr;
         HREFTYPE inh_href;
@@ -10931,7 +10898,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(ICreateTypeInfo2 *iface)
                     ITypeInfo_Release(tinfo);
                     return hres;
                 }
-                This->cbSizeVft = attr->cbSizeVft;
+                This->typeattr.cbSizeVft = attr->cbSizeVft;
                 ITypeInfo_ReleaseTypeAttr(inh, attr);
 
                 do{
@@ -10950,34 +10917,34 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(ICreateTypeInfo2 *iface)
 
                 ITypeInfo_Release(inh);
             } else if (hres == TYPE_E_ELEMENTNOTFOUND) {
-                This->cbSizeVft = 0;
+                This->typeattr.cbSizeVft = 0;
                 hres = S_OK;
             } else {
                 ITypeInfo_Release(tinfo);
                 return hres;
             }
         } else if (hres == TYPE_E_ELEMENTNOTFOUND) {
-            This->cbSizeVft = 0;
+            This->typeattr.cbSizeVft = 0;
             hres = S_OK;
         } else {
             ITypeInfo_Release(tinfo);
             return hres;
         }
-    } else if (This->typekind == TKIND_DISPATCH)
-        This->cbSizeVft = 7 * This->pTypeLib->ptr_size;
+    } else if (This->typeattr.typekind == TKIND_DISPATCH)
+        This->typeattr.cbSizeVft = 7 * This->pTypeLib->ptr_size;
     else
-        This->cbSizeVft = 0;
+        This->typeattr.cbSizeVft = 0;
 
     func_desc = This->funcdescs;
     i = 0;
-    while (i < This->cFuncs) {
+    while (i < This->typeattr.cFuncs) {
         if (!(func_desc->funcdesc.oVft & 0x1))
-            func_desc->funcdesc.oVft = This->cbSizeVft;
+            func_desc->funcdesc.oVft = This->typeattr.cbSizeVft;
 
         if ((func_desc->funcdesc.oVft & 0xFFFC) > user_vft)
             user_vft = func_desc->funcdesc.oVft & 0xFFFC;
 
-        This->cbSizeVft += This->pTypeLib->ptr_size;
+        This->typeattr.cbSizeVft += This->pTypeLib->ptr_size;
 
         if (func_desc->funcdesc.memid == MEMBERID_NIL) {
             TLBFuncDesc *iter;
@@ -10987,10 +10954,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(ICreateTypeInfo2 *iface)
             func_desc->funcdesc.memid = 0x60000000 + (depth << 16) + i;
 
             iter = This->funcdescs;
-            while (j < This->cFuncs) {
+            while (j < This->typeattr.cFuncs) {
                 if (iter != func_desc && iter->funcdesc.memid == func_desc->funcdesc.memid) {
                     if (!reset) {
-                        func_desc->funcdesc.memid = 0x60000000 + (depth << 16) + This->cFuncs;
+                        func_desc->funcdesc.memid = 0x60000000 + (depth << 16) + This->typeattr.cFuncs;
                         reset = TRUE;
                     } else
                         ++func_desc->funcdesc.memid;
@@ -11007,10 +10974,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(ICreateTypeInfo2 *iface)
         ++i;
     }
 
-    if (user_vft > This->cbSizeVft)
-        This->cbSizeVft = user_vft + This->pTypeLib->ptr_size;
+    if (user_vft > This->typeattr.cbSizeVft)
+        This->typeattr.cbSizeVft = user_vft + This->pTypeLib->ptr_size;
 
-    for(i = 0; i < This->cVars; ++i){
+    for(i = 0; i < This->typeattr.cVars; ++i){
         TLBVarDesc *var_desc = &This->vardescs[i];
         if(var_desc->vardesc.memid == MEMBERID_NIL){
             UINT j = 0;
@@ -11020,10 +10987,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(ICreateTypeInfo2 *iface)
             var_desc->vardesc.memid = 0x40000000 + (depth << 16) + i;
 
             iter = This->vardescs;
-            while (j < This->cVars) {
+            while (j < This->typeattr.cVars) {
                 if (iter != var_desc && iter->vardesc.memid == var_desc->vardesc.memid) {
                     if (!reset) {
-                        var_desc->vardesc.memid = 0x40000000 + (depth << 16) + This->cVars;
+                        var_desc->vardesc.memid = 0x40000000 + (depth << 16) + This->typeattr.cVars;
                         reset = TRUE;
                     } else
                         ++var_desc->vardesc.memid;
-- 
2.9.3




More information about the wine-patches mailing list