more on typelib

Huw D M Davies h.davies1 at physics.ox.ac.uk
Mon Sep 10 05:30:13 CDT 2001


	Huw D M Davies <hdavies at codeweavers.com>
	Load some useful TYPEATTR elements from v1 typelibs.
-------------- next part --------------
Index: dlls/oleaut32/typelib.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/typelib.c,v
retrieving revision 1.44
diff -u -r1.44 typelib.c
--- dlls/oleaut32/typelib.c	2001/09/07 15:27:16	1.44
+++ dlls/oleaut32/typelib.c	2001/09/10 09:17:27
@@ -2334,8 +2334,8 @@
     return (char*)info;
 }
 
-static void SLTG_ProcessCoClass(char *pBlk, ITypeInfoImpl *pTI,
-				char *pNameTable)
+static SLTG_TypeInfoTail *SLTG_ProcessCoClass(char *pBlk, ITypeInfoImpl *pTI,
+					      char *pNameTable)
 {
     SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk;
     SLTG_MemberHeader *pMemHeader;
@@ -2355,12 +2355,12 @@
         pNextItem = SLTG_DoImpls((SLTG_ImplInfo*)pFirstItem, pTI, FALSE);
     }
 
-    return;
+    return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra);
 }
 
 
-static void SLTG_ProcessInterface(char *pBlk, ITypeInfoImpl *pTI,
-				  char *pNameTable)
+static SLTG_TypeInfoTail *SLTG_ProcessInterface(char *pBlk, ITypeInfoImpl *pTI,
+						char *pNameTable)
 {
     SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk;
     SLTG_MemberHeader *pMemHeader;
@@ -2391,7 +2391,7 @@
 	if(pFunc->magic != SLTG_FUNCTION_MAGIC &&
 	   pFunc->magic != SLTG_FUNCTION_WITH_FLAGS_MAGIC) {
 	    FIXME("func magic = %02x\n", pFunc->magic);
-	    return;
+	    return NULL;
 	}
 	*ppFuncDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
 				sizeof(**ppFuncDesc));
@@ -2470,9 +2470,11 @@
     }
     pTI->TypeAttr.cFuncs = num;
     dump_TLBFuncDesc(pTI->funclist);
+    return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra);
 }
 
-static void SLTG_ProcessRecord(char *pBlk, ITypeInfoImpl *pTI, char *pNameTable)
+static SLTG_TypeInfoTail *SLTG_ProcessRecord(char *pBlk, ITypeInfoImpl *pTI,
+					     char *pNameTable)
 {
   SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk;
   SLTG_MemberHeader *pMemHeader;
@@ -2490,7 +2492,7 @@
       pItem = (SLTG_RecordItem *)(pFirstItem + pItem->next), num++) {
       if(pItem->magic != SLTG_RECORD_MAGIC) {
 	  FIXME("record magic = %02x\n", pItem->magic);
-	  return;
+	  return NULL;
       }
       *ppVarDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
 			     sizeof(**ppVarDesc));
@@ -2519,9 +2521,11 @@
       if(pItem->next == 0xffff) break;
   }
   pTI->TypeAttr.cVars = num;
+  return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra);
 }
 
-static void SLTG_ProcessEnum(char *pBlk, ITypeInfoImpl *pTI, char *pNameTable)
+static SLTG_TypeInfoTail *SLTG_ProcessEnum(char *pBlk, ITypeInfoImpl *pTI,
+					   char *pNameTable)
 {
   SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk;
   SLTG_MemberHeader *pMemHeader;
@@ -2537,7 +2541,7 @@
       pItem = (SLTG_EnumItem *)(pFirstItem + pItem->next), num++) {
       if(pItem->magic != SLTG_ENUMITEM_MAGIC) {
 	  FIXME("enumitem magic = %04x\n", pItem->magic);
-	  return;
+	  return NULL;
       }
       *ppVarDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
 			     sizeof(**ppVarDesc));
@@ -2556,6 +2560,7 @@
       if(pItem->next == 0xffff) break;
   }
   pTI->TypeAttr.cVars = num;
+  return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra);
 }
 
 /* Because SLTG_OtherTypeInfo is such a painfull struct, we make a more
@@ -2737,6 +2742,7 @@
 	order = pBlkEntry[order].next - 1, i++) {
 
       SLTG_TypeInfoHeader *pTIHeader;
+      SLTG_TypeInfoTail *pTITail;
 
       if(strcmp(pBlkEntry[order].index_string + (char*)pMagic,
 		pOtherTypeInfoBlks[i].index_name)) {
@@ -2777,27 +2783,34 @@
 
       switch(pTIHeader->typekind) {
       case TKIND_ENUM:
-	SLTG_ProcessEnum(pBlk, *ppTypeInfoImpl, pNameTable); 
+	pTITail = SLTG_ProcessEnum(pBlk, *ppTypeInfoImpl, pNameTable); 
 	break;
 
       case TKIND_RECORD:
-	SLTG_ProcessRecord(pBlk, *ppTypeInfoImpl, pNameTable); 
+	pTITail = SLTG_ProcessRecord(pBlk, *ppTypeInfoImpl, pNameTable); 
 	break;
 
       case TKIND_INTERFACE:
-	SLTG_ProcessInterface(pBlk, *ppTypeInfoImpl, pNameTable);
+	pTITail = SLTG_ProcessInterface(pBlk, *ppTypeInfoImpl, pNameTable);
 	break;
 
       case TKIND_COCLASS:
-	SLTG_ProcessCoClass(pBlk, *ppTypeInfoImpl, pNameTable);
+	pTITail = SLTG_ProcessCoClass(pBlk, *ppTypeInfoImpl, pNameTable);
 	break;
 
       default:
 	FIXME("Not processing typekind %d\n", pTIHeader->typekind);
+	pTITail = NULL;
 	break;
 
       }
 
+      if(pTITail) { /* could get cFuncs, cVars and cImplTypes from here
+		       but we've already set those */
+	  (*ppTypeInfoImpl)->TypeAttr.cbAlignment = pTITail->cbAlignment;
+	  (*ppTypeInfoImpl)->TypeAttr.cbSizeInstance = pTITail->cbSizeInstance;
+	  (*ppTypeInfoImpl)->TypeAttr.cbSizeVft = pTITail->cbSizeVft;
+      }
       ppTypeInfoImpl = &((*ppTypeInfoImpl)->next);
       pBlk += pBlkEntry[order].len;
     }
@@ -3030,8 +3043,8 @@
 {
     ICOM_THIS( ITypeLibImpl, iface);
     TRACE("(%p)\n",This);
-    /* FIXME: must do a copy here */
-    *ppTLibAttr=&This->LibAttr;
+    *ppTLibAttr = HeapAlloc(GetProcessHeap(), 0, sizeof(**ppTLibAttr));
+    memcpy(*ppTLibAttr, &This->LibAttr, sizeof(**ppTLibAttr));
     return S_OK;
 }
 
@@ -3226,7 +3239,8 @@
 {
     ICOM_THIS( ITypeLibImpl, iface);
     TRACE("freeing (%p)\n",This);
-    /* nothing to do */
+    HeapFree(GetProcessHeap(),0,pTLibAttr);
+
 }
 
 /* ITypeLib2::GetCustData
Index: dlls/oleaut32/typelib.h
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/typelib.h,v
retrieving revision 1.5
diff -u -r1.5 typelib.h
--- dlls/oleaut32/typelib.h	2001/09/07 15:27:16	1.5
+++ dlls/oleaut32/typelib.h	2001/09/10 09:17:27
@@ -22,7 +22,7 @@
 /*-------------------------FILE STRUCTURES-----------------------------------*/
 
 /* There are two known file formats, those created with ICreateTypeLib
- * have the signature "SLGT" as their first four bytes, while those created
+ * have the signature "SLTG" as their first four bytes, while those created
  * with ICreateTypeLib2 have "MSFT".
  */
 
@@ -374,6 +374,36 @@
 } SLTG_TypeInfoHeader;
 
 #define SLTG_TIHEADER_MAGIC 0x0501
+
+typedef struct {
+/*00*/  WORD cFuncs;
+/*02*/  WORD cVars;
+/*04*/  WORD cImplTypes;
+/*06*/  WORD res06;
+/*08*/  WORD res08;
+/*0a*/  WORD res0a;
+/*0c*/  WORD res0c;
+/*0e*/  WORD res0e;
+/*10*/  WORD res10;
+/*12*/  WORD res12;
+/*14*/  WORD res14;
+/*16*/  WORD res16;
+/*18*/  WORD res18;
+/*1a*/  WORD res1a;
+/*1c*/  WORD res1c;
+/*1e*/  WORD res1e;
+/*20*/  WORD cbSizeInstance;
+/*22*/  WORD cbAlignment;
+/*24*/  WORD res24;
+/*26*/  WORD res26;
+/*28*/  WORD cbSizeVft;
+/*2a*/  WORD res2a;
+/*2c*/  WORD res2c;
+/*2e*/  WORD res2e;
+/*30*/  WORD res30;
+/*32*/  WORD res32;
+/*34*/  WORD res34;
+} SLTG_TypeInfoTail;
 
 typedef struct {
 /*00*/ WORD res00; /* 0x0001 sometimes 0x0003 ?? */


More information about the wine-patches mailing list