[PATCH 5/5] oleaut32: Store all GUIDs in typelibs

Andrew Eikum aeikum at codeweavers.com
Thu May 30 16:43:27 CDT 2013


---
 dlls/oleaut32/typelib.c | 169 ++++++++++++++++++++++++++++++++++--------------
 1 file changed, 119 insertions(+), 50 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 1a94ab6..b6f2e92 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -955,9 +955,15 @@ HRESULT WINAPI UnRegisterTypeLibForUser(
 
 /*======================= ITypeLib implementation =======================*/
 
+typedef struct tagTLBGuid {
+    GUID guid;
+    UINT offset;
+    struct list entry;
+} TLBGuid;
+
 typedef struct tagTLBCustData
 {
-    GUID guid;
+    TLBGuid *guid;
     VARIANT data;
     struct list entry;
 } TLBCustData;
@@ -969,7 +975,7 @@ typedef struct tagTLBImpLib
 				   offset in nametable (SLTG)
 				   just used to identify library while reading
 				   data from file */
-    GUID guid;                  /* libid */
+    TLBGuid *guid;                  /* libid */
     BSTR name;                  /* name */
 
     LCID lcid;                  /* lcid of imported typelib */
@@ -995,7 +1001,7 @@ typedef struct tagITypeLibImpl
     ITypeComp ITypeComp_iface;
     ICreateTypeLib2 ICreateTypeLib2_iface;
     LONG ref;
-    GUID guid;
+    TLBGuid *guid;
     LCID lcid;
     SYSKIND syskind;
     WORD ver_major;
@@ -1008,6 +1014,7 @@ typedef struct tagITypeLibImpl
      */
     struct list string_list;
     struct list name_list;
+    struct list guid_list;
 
     const TLBString *Name;
     const TLBString *DocString;
@@ -1070,7 +1077,7 @@ typedef struct tagTLBRefType
 			       use guid */
 
     TYPEKIND tkind;
-    GUID guid;              /* guid of the referenced type */
+    TLBGuid *guid;              /* guid of the referenced type */
                             /* if index == TLB_REF_USE_GUID */
 
     HREFTYPE reference;     /* The href of this ref */
@@ -1135,7 +1142,7 @@ typedef struct tagITypeInfoImpl
     BOOL not_attached_to_typelib;
     BOOL needs_layout;
 
-    GUID guid;
+    TLBGuid *guid;
     LCID lcid;
     MEMBERID memidConstructor;
     MEMBERID memidDestructor;
@@ -1230,6 +1237,16 @@ static inline int TLB_str_memcmp(void *left, const TLBString *str, DWORD len)
     return memcmp(left, str->str, len);
 }
 
+static inline const GUID *TLB_get_guidref(const TLBGuid *guid)
+{
+    return guid != NULL ? &guid->guid : NULL;
+}
+
+static inline const GUID *TLB_get_guid_null(const TLBGuid *guid)
+{
+    return guid != NULL ? &guid->guid : &GUID_NULL;
+}
+
 /*
  debug
 */
@@ -1391,7 +1408,7 @@ static void dump_TLBVarDesc(const TLBVarDesc * pvd, UINT n)
 
 static void dump_TLBImpLib(const TLBImpLib *import)
 {
-    TRACE_(typelib)("%s %s\n", debugstr_guid(&(import->guid)),
+    TRACE_(typelib)("%s %s\n", debugstr_guid(TLB_get_guidref(import->guid)),
 		    debugstr_w(import->name));
     TRACE_(typelib)("v%d.%d lcid=%x offset=%x\n", import->wVersionMajor,
 		    import->wVersionMinor, import->lcid, import->offset);
@@ -1405,7 +1422,7 @@ static void dump_TLBRefType(const ITypeLibImpl *pTL)
     {
         TRACE_(typelib)("href:0x%08x\n", ref->reference);
         if(ref->index == -1)
-	    TRACE_(typelib)("%s\n", debugstr_guid(&(ref->guid)));
+	    TRACE_(typelib)("%s\n", debugstr_guid(TLB_get_guidref(ref->guid)));
         else
 	    TRACE_(typelib)("type no: %d\n", ref->index);
 
@@ -1509,7 +1526,7 @@ 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(&(pty->guid)));
+    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);
@@ -1700,7 +1717,7 @@ static inline TLBCustData *TLB_get_custdata_by_guid(struct list *custdata_list,
 {
     TLBCustData *cust_data;
     LIST_FOR_EACH_ENTRY(cust_data, custdata_list, TLBCustData, entry)
-        if(IsEqualIID(&cust_data->guid, guid))
+        if(IsEqualIID(TLB_get_guid_null(cust_data->guid), guid))
             return cust_data;
     return NULL;
 }
@@ -1791,7 +1808,27 @@ static TLBImplType *TLBImplType_Alloc(UINT n)
     return ret;
 }
 
-static HRESULT TLB_set_custdata(struct list *custdata_list, REFGUID guid, VARIANT *var)
+static TLBGuid *TLB_append_guid(struct list *guid_list, const GUID *new_guid)
+{
+    TLBGuid *guid;
+
+    LIST_FOR_EACH_ENTRY(guid, guid_list, TLBGuid, entry) {
+        if (IsEqualGUID(&guid->guid, new_guid))
+            return guid;
+    }
+
+    guid = heap_alloc(sizeof(TLBGuid));
+    if (!guid)
+        return NULL;
+
+    memcpy(&guid->guid, new_guid, sizeof(GUID));
+
+    list_add_tail(guid_list, &guid->entry);
+
+    return guid;
+}
+
+static HRESULT TLB_set_custdata(struct list *custdata_list, TLBGuid *tlbguid, VARIANT *var)
 {
     TLBCustData *cust_data;
 
@@ -1808,14 +1845,14 @@ static HRESULT TLB_set_custdata(struct list *custdata_list, REFGUID guid, VARIAN
         return DISP_E_BADVARTYPE;
     }
 
-    cust_data = TLB_get_custdata_by_guid(custdata_list, guid);
+    cust_data = TLB_get_custdata_by_guid(custdata_list, TLB_get_guid_null(tlbguid));
 
     if (!cust_data) {
         cust_data = heap_alloc(sizeof(TLBCustData));
         if (!cust_data)
             return E_OUTOFMEMORY;
 
-        cust_data->guid = *guid;
+        cust_data->guid = tlbguid;
         VariantInit(&cust_data->data);
 
         list_add_tail(custdata_list, &cust_data->entry);
@@ -1908,17 +1945,42 @@ static DWORD MSFT_ReadLEWords(void *buffer,  DWORD count, TLBContext *pcx,
   return ret;
 }
 
-static void MSFT_ReadGuid( GUID *pGuid, int offset, TLBContext *pcx)
+static HRESULT MSFT_ReadAllGuids(TLBContext *pcx)
 {
-    if(offset<0 || pcx->pTblDir->pGuidTab.offset <0){
-        memset(pGuid,0, sizeof(GUID));
-        return;
+    TLBGuid *guid;
+    MSFT_GuidEntry entry;
+    int offs = 0;
+
+    MSFT_Seek(pcx, pcx->pTblDir->pGuidTab.offset);
+    while (1) {
+        if (offs >= pcx->pTblDir->pGuidTab.length)
+            return S_OK;
+
+        MSFT_ReadLEWords(&entry, sizeof(MSFT_GuidEntry), pcx, DO_NOT_SEEK);
+
+        guid = heap_alloc(sizeof(TLBGuid));
+
+        guid->offset = offs;
+        guid->guid = entry.guid;
+
+        list_add_tail(&pcx->pLibInfo->guid_list, &guid->entry);
+
+        offs += sizeof(MSFT_GuidEntry);
     }
-    MSFT_Read(pGuid, sizeof(GUID), pcx, pcx->pTblDir->pGuidTab.offset+offset );
-    pGuid->Data1 = FromLEDWord(pGuid->Data1);
-    pGuid->Data2 = FromLEWord(pGuid->Data2);
-    pGuid->Data3 = FromLEWord(pGuid->Data3);
-    TRACE_(typelib)("%s\n", debugstr_guid(pGuid));
+}
+
+static TLBGuid *MSFT_ReadGuid( int offset, TLBContext *pcx)
+{
+    TLBGuid *ret;
+
+    LIST_FOR_EACH_ENTRY(ret, &pcx->pLibInfo->guid_list, TLBGuid, entry){
+        if(ret->offset == offset){
+            TRACE_(typelib)("%s\n", debugstr_guid(&ret->guid));
+            return ret;
+        }
+    }
+
+    return NULL;
 }
 
 static HREFTYPE MSFT_ReadHreftype( TLBContext *pcx, int offset )
@@ -2123,7 +2185,7 @@ static int MSFT_CustData( TLBContext *pcx, int offset, struct list *custdata_lis
         count++;
         pNew=heap_alloc_zero(sizeof(TLBCustData));
         MSFT_ReadLEDWords(&entry, sizeof(entry), pcx, pcx->pTblDir->pCDGuids.offset+offset);
-        MSFT_ReadGuid(&(pNew->guid), entry.GuidOffset , pcx);
+        pNew->guid = MSFT_ReadGuid(entry.GuidOffset, pcx);
         MSFT_ReadValue(&(pNew->data), entry.DataOffset, pcx);
         list_add_head(custdata_list, &pNew->entry);
         offset = entry.next;
@@ -2470,8 +2532,8 @@ static void MSFT_DoRefType(TLBContext *pcx, ITypeLibImpl *pTL,
             ref->reference = offset & (~0x3);
             ref->pImpTLInfo = pImpLib;
             if(impinfo.flags & MSFT_IMPINFO_OFFSET_IS_GUID) {
-                MSFT_ReadGuid(&ref->guid, impinfo.oGuid, pcx);
-                TRACE("importing by guid %s\n", debugstr_guid(&ref->guid));
+                ref->guid = MSFT_ReadGuid(impinfo.oGuid, pcx);
+                TRACE("importing by guid %s\n", debugstr_guid(TLB_get_guidref(ref->guid)));
                 ref->index = TLB_REF_USE_GUID;
             } else
                 ref->index = impinfo.oGuid;
@@ -2532,7 +2594,7 @@ static ITypeInfoImpl * MSFT_DoTypeInfo(
     ptiRet->pTypeLib = pLibInfo;
     ptiRet->index=count;
 
-    MSFT_ReadGuid(&ptiRet->guid, tiBase.posguid, pcx);
+    ptiRet->guid = MSFT_ReadGuid(tiBase.posguid, pcx);
     ptiRet->lcid=pLibInfo->set_lcid;   /* FIXME: correct? */
     ptiRet->lpstrSchema=NULL;              /* reserved */
     ptiRet->cbSizeInstance=tiBase.size;
@@ -2609,7 +2671,7 @@ static ITypeInfoImpl * MSFT_DoTypeInfo(
 
     TRACE_(typelib)("%s guid: %s kind:%s\n",
        debugstr_w(TLB_get_bstr(ptiRet->Name)),
-       debugstr_guid(&ptiRet->guid),
+       debugstr_guid(TLB_get_guidref(ptiRet->guid)),
        typekind_desc[ptiRet->typekind]);
     if (TRACE_ON(typelib))
       dump_TypeInfo(ptiRet);
@@ -3233,6 +3295,7 @@ static ITypeLibImpl* TypeLibImpl_Constructor(void)
     list_init(&pTypeLibImpl->custdata_list);
     list_init(&pTypeLibImpl->name_list);
     list_init(&pTypeLibImpl->string_list);
+    list_init(&pTypeLibImpl->guid_list);
     list_init(&pTypeLibImpl->ref_list);
     pTypeLibImpl->dispatch_href = -1;
 
@@ -3294,10 +3357,11 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength)
 
     MSFT_ReadAllNames(&cx);
     MSFT_ReadAllStrings(&cx);
+    MSFT_ReadAllGuids(&cx);
 
     /* now fill our internal data */
     /* TLIBATTR fields */
-    MSFT_ReadGuid(&pTypeLibImpl->guid, tlbHeader.posguid, &cx);
+    pTypeLibImpl->guid = MSFT_ReadGuid(tlbHeader.posguid, &cx);
 
     pTypeLibImpl->syskind = tlbHeader.varflags & 0x0f; /* check the mask */
     pTypeLibImpl->ver_major = LOWORD(tlbHeader.version);
@@ -3419,7 +3483,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength)
             pImpLib->name = TLB_MultiByteToBSTR(name);
             heap_free(name);
 
-            MSFT_ReadGuid(&pImpLib->guid, oGuid, &cx);
+            pImpLib->guid = MSFT_ReadGuid(oGuid, &cx);
             offset = (offset + sizeof(INT) + sizeof(DWORD) + sizeof(LCID) + sizeof(UINT16) + size + 3) & ~3;
 
             list_add_tail(&pTypeLibImpl->implib_list, &pImpLib->entry);
@@ -3568,7 +3632,7 @@ static DWORD SLTG_ReadLibBlk(LPVOID pLibBlk, ITypeLibImpl *pTypeLibImpl)
     pTypeLibImpl->ver_minor = *(WORD*)ptr;
     ptr += 2;
 
-    memcpy(&pTypeLibImpl->guid, ptr, sizeof(GUID));
+    pTypeLibImpl->guid = TLB_append_guid(&pTypeLibImpl->guid_list, (GUID*)ptr);
     ptr += sizeof(GUID);
 
     return ptr - (char*)pLibBlk;
@@ -3721,11 +3785,12 @@ static sltg_ref_lookup_t *SLTG_DoRefs(SLTG_RefInfo *pRef, ITypeLibImpl *pTL,
             if(&import->entry == &pTL->implib_list) {
 	        char fname[MAX_PATH+1];
 		int len;
+                GUID tmpguid;
 
 		import = heap_alloc_zero(sizeof(*import));
 		import->offset = lib_offs;
-		TLB_GUIDFromString( pNameTable + lib_offs + 4,
-				    &import->guid);
+		TLB_GUIDFromString( pNameTable + lib_offs + 4, &tmpguid);
+                import->guid = TLB_append_guid(&pTL->guid_list, &tmpguid);
 		if(sscanf(pNameTable + lib_offs + 40, "}#%hd.%hd#%x#%s",
 			  &import->wVersionMajor,
 			  &import->wVersionMinor,
@@ -3743,7 +3808,7 @@ static sltg_ref_lookup_t *SLTG_DoRefs(SLTG_RefInfo *pRef, ITypeLibImpl *pTL,
 	    ref_type->pImpTLInfo = import;
 
             /* Store a reference to IDispatch */
-            if(pTL->dispatch_href == -1 && IsEqualGUID(&import->guid, &IID_StdOle) && type_num == 4)
+            if(pTL->dispatch_href == -1 && IsEqualGUID(&import->guid->guid, &IID_StdOle) && type_num == 4)
                 pTL->dispatch_href = typelib_ref;
 
 	} else { /* internal ref */
@@ -4366,7 +4431,7 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
       (*ppTypeInfoImpl)->index = i;
       (*ppTypeInfoImpl)->Name = SLTG_ReadName(pNameTable, pOtherTypeInfoBlks[i].name_offs, pTypeLibImpl);
       (*ppTypeInfoImpl)->dwHelpContext = pOtherTypeInfoBlks[i].helpcontext;
-      (*ppTypeInfoImpl)->guid = pOtherTypeInfoBlks[i].uuid;
+      (*ppTypeInfoImpl)->guid = TLB_append_guid(&pTypeLibImpl->guid_list, &pOtherTypeInfoBlks[i].uuid);
       (*ppTypeInfoImpl)->typekind = pTIHeader->typekind;
       (*ppTypeInfoImpl)->wMajorVerNum = pTIHeader->major_version;
       (*ppTypeInfoImpl)->wMinorVerNum = pTIHeader->minor_version;
@@ -4384,7 +4449,7 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength)
       TRACE_(typelib)("TypeInfo %s of kind %s guid %s typeflags %04x\n",
 	    debugstr_w(TLB_get_bstr((*ppTypeInfoImpl)->Name)),
 	    typekind_desc[pTIHeader->typekind],
-	    debugstr_guid(&(*ppTypeInfoImpl)->guid),
+	    debugstr_guid(TLB_get_guidref((*ppTypeInfoImpl)->guid)),
 	    (*ppTypeInfoImpl)->wTypeFlags);
 
       pMemHeader = (SLTG_MemberHeader*)((char *)pBlk + pTIHeader->elem_table);
@@ -4654,7 +4719,7 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfoOfGuid(
     TRACE("%p %s %p\n", This, debugstr_guid(guid), ppTInfo);
 
     for(i = 0; i < This->TypeInfoCount; ++i){
-        if(IsEqualIID(&This->typeinfos[i]->guid, guid)){
+        if(IsEqualIID(TLB_get_guid_null(This->typeinfos[i]->guid), guid)){
             *ppTInfo = (ITypeInfo*)This->typeinfos[i];
             ITypeInfo_AddRef(*ppTInfo);
             return S_OK;
@@ -4682,7 +4747,7 @@ static HRESULT WINAPI ITypeLib2_fnGetLibAttr(
     *attr = heap_alloc(sizeof(**attr));
     if (!*attr) return E_OUTOFMEMORY;
 
-    (*attr)->guid = This->guid;
+    (*attr)->guid = *TLB_get_guid_null(This->guid);
     (*attr)->lcid = This->set_lcid;
     (*attr)->syskind = This->syskind;
     (*attr)->wMajorVerNum = This->ver_major;
@@ -5054,7 +5119,7 @@ static HRESULT TLB_copy_all_custdata(struct list *custdata_list, CUSTDATA *pCust
 
     cdi = pCustData->prgCustData;
     LIST_FOR_EACH_ENTRY(pCData, custdata_list, TLBCustData, entry){
-        cdi->guid = pCData->guid;
+        cdi->guid = *TLB_get_guid_null(pCData->guid);
         VariantCopy(&cdi->varValue, &pCData->data);
         ++cdi;
     }
@@ -5458,7 +5523,7 @@ static HRESULT WINAPI ITypeInfo_fnGetTypeAttr( ITypeInfo2 *iface,
     if (!*ppTypeAttr)
         return E_OUTOFMEMORY;
 
-    (*ppTypeAttr)->guid = This->guid;
+    (*ppTypeAttr)->guid = *TLB_get_guid_null(This->guid);
     (*ppTypeAttr)->lcid = This->lcid;
     (*ppTypeAttr)->memidConstructor = This->memidConstructor;
     (*ppTypeAttr)->memidDestructor = This->memidDestructor;
@@ -7389,7 +7454,7 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeInfo(
                 result = S_OK;
             } else {
                 TRACE("typeinfo in imported typelib that isn't already loaded\n");
-                result = LoadRegTypeLib( &ref_type->pImpTLInfo->guid,
+                result = LoadRegTypeLib( TLB_get_guid_null(ref_type->pImpTLInfo->guid),
                                          ref_type->pImpTLInfo->wVersionMajor,
                                          ref_type->pImpTLInfo->wVersionMinor,
                                          ref_type->pImpTLInfo->lcid,
@@ -7408,7 +7473,7 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeInfo(
         }
         if(SUCCEEDED(result)) {
             if(ref_type->index == TLB_REF_USE_GUID)
-                result = ITypeLib_GetTypeInfoOfGuid(pTLib, &ref_type->guid, ppTInfo);
+                result = ITypeLib_GetTypeInfoOfGuid(pTLib, TLB_get_guid_null(ref_type->guid), ppTInfo);
             else
                 result = ITypeLib_GetTypeInfo(pTLib, ref_type->index, ppTInfo);
         }
@@ -8093,7 +8158,7 @@ HRESULT WINAPI CreateDispTypeInfo(
     pTIIface->index = 0;
     pTIIface->Name = NULL;
     pTIIface->dwHelpContext = -1;
-    memset(&pTIIface->guid, 0, sizeof(GUID));
+    pTIIface->guid = NULL;
     pTIIface->lcid = lcid;
     pTIIface->typekind = TKIND_INTERFACE;
     pTIIface->wMajorVerNum = 0;
@@ -8148,7 +8213,7 @@ HRESULT WINAPI CreateDispTypeInfo(
     pTIClass->index = 1;
     pTIClass->Name = NULL;
     pTIClass->dwHelpContext = -1;
-    memset(&pTIClass->guid, 0, sizeof(GUID));
+    pTIClass->guid = NULL;
     pTIClass->lcid = lcid;
     pTIClass->typekind = TKIND_COCLASS;
     pTIClass->wMajorVerNum = 0;
@@ -8438,7 +8503,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnSetGuid(ICreateTypeLib2 *iface,
 
     TRACE("%p %s\n", This, debugstr_guid(guid));
 
-    memcpy(&This->guid, guid, sizeof(GUID));
+    This->guid = TLB_append_guid(&This->guid_list, guid);
 
     return S_OK;
 }
@@ -8603,7 +8668,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetGuid(ICreateTypeInfo2 *iface,
 
     TRACE("%p %s\n", This, debugstr_guid(guid));
 
-    memcpy(&This->guid, guid, sizeof(GUID));
+    This->guid = TLB_append_guid(&This->pTypeLib->guid_list, guid);
 
     return S_OK;
 }
@@ -8729,7 +8794,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(ICreateTypeInfo2 *iface,
     }
 
     LIST_FOR_EACH_ENTRY(implib, &This->pTypeLib->implib_list, TLBImpLib, entry){
-        if(IsEqualGUID(&implib->guid, &libattr->guid) &&
+        if(IsEqualGUID(&implib->guid->guid, &libattr->guid) &&
                 implib->lcid == libattr->lcid &&
                 implib->wVersionMajor == libattr->wMajorVerNum &&
                 implib->wVersionMinor == libattr->wMinorVerNum)
@@ -8751,7 +8816,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(ICreateTypeInfo2 *iface,
             }
         }
 
-        implib->guid = libattr->guid;
+        implib->guid = TLB_append_guid(&This->pTypeLib->guid_list, &libattr->guid);
         implib->lcid = libattr->lcid;
         implib->wVersionMajor = libattr->wMajorVerNum;
         implib->wVersionMinor = libattr->wMinorVerNum;
@@ -8769,7 +8834,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(ICreateTypeInfo2 *iface,
     index = 0;
     LIST_FOR_EACH_ENTRY(ref_type, &This->pTypeLib->ref_list, TLBRefType, entry){
         if(ref_type->index == TLB_REF_USE_GUID &&
-                IsEqualGUID(&ref_type->guid, &typeattr->guid) &&
+                IsEqualGUID(&ref_type->guid->guid, &typeattr->guid) &&
                 ref_type->tkind == typeattr->typekind)
             break;
         ++index;
@@ -8784,7 +8849,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(ICreateTypeInfo2 *iface,
 
         ref_type->index = TLB_REF_USE_GUID;
 
-        ref_type->guid = typeattr->guid;
+        ref_type->guid = TLB_append_guid(&This->pTypeLib->guid_list, &typeattr->guid);
 
         list_add_tail(&This->pTypeLib->ref_list, &ref_type->entry);
     }
@@ -8793,7 +8858,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(ICreateTypeInfo2 *iface,
 
     *refType = ref_type->reference | 0x1;
 
-    if(IsEqualGUID(&ref_type->guid, &IID_IDispatch))
+    if(IsEqualGUID(&ref_type->guid->guid, &IID_IDispatch))
         This->pTypeLib->dispatch_href = *refType;
 
     return S_OK;
@@ -9342,6 +9407,8 @@ static HRESULT WINAPI ICreateTypeInfo2_fnDeleteImplType(ICreateTypeInfo2 *iface,
 static HRESULT WINAPI ICreateTypeInfo2_fnSetCustData(ICreateTypeInfo2 *iface,
         REFGUID guid, VARIANT *varVal)
 {
+    TLBGuid *tlbguid;
+
     ITypeInfoImpl *This = info_impl_from_ICreateTypeInfo2(iface);
 
     TRACE("%p %s %p\n", This, debugstr_guid(guid), varVal);
@@ -9349,7 +9416,9 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetCustData(ICreateTypeInfo2 *iface,
     if (!guid || !varVal)
         return E_INVALIDARG;
 
-    return TLB_set_custdata(&This->custdata_list, guid, varVal);
+    tlbguid = TLB_append_guid(&This->pTypeLib->guid_list, guid);
+
+    return TLB_set_custdata(&This->custdata_list, tlbguid, varVal);
 }
 
 static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncCustData(ICreateTypeInfo2 *iface,
-- 
1.8.3




More information about the wine-patches mailing list