From eb5c9707b5ec8859b490148cff1521534a21ec61 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Wed, 31 Jul 2013 18:11:11 +0200 Subject: [PATCH] oleaut32: Store hreftype associated with guid while saving typelib. --- dlls/oleaut32/tests/typelib.c | 8 ++++++++ dlls/oleaut32/typelib.c | 24 ++++++++++++++---------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c index 30468c1b036..3bbf2d03c34 100644 --- a/dlls/oleaut32/tests/typelib.c +++ b/dlls/oleaut32/tests/typelib.c @@ -1519,6 +1519,8 @@ static void test_CreateTypeLib(void) { static OLECHAR *propname[] = {prop1W, param1W}; static const GUID custguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x70}}; static const GUID bogusguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x71}}; + static const GUID interfaceguid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}}; + static const GUID interface2guid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcd}}; char filename[MAX_PATH]; WCHAR filenameW[MAX_PATH]; @@ -1666,6 +1668,9 @@ static void test_CreateTypeLib(void) { hres = ICreateTypeInfo_LayOut(createti); ok(hres == S_OK, "got %08x\n", hres); + hres = ICreateTypeInfo_SetGuid(createti, &interfaceguid); + ok(hres == S_OK, "got %08x\n", hres); + hres = ICreateTypeInfo_AddRefTypeInfo(createti, NULL, &hreftype); ok(hres == E_INVALIDARG, "got %08x\n", hres); @@ -2195,6 +2200,9 @@ static void test_CreateTypeLib(void) { hres = ICreateTypeLib2_CreateTypeInfo(createtl, interface2W, TKIND_INTERFACE, &createti); ok(hres == S_OK, "got %08x\n", hres); + hres = ICreateTypeInfo_SetGuid(createti, &interface2guid); + ok(hres == S_OK, "got %08x\n", hres); + hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&interface2); ok(hres == S_OK, "got %08x\n", hres); diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 39d692ae26f..100c5393c85 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -959,6 +959,7 @@ HRESULT WINAPI UnRegisterTypeLibForUser( typedef struct tagTLBGuid { GUID guid; + INT hreftype; UINT offset; struct list entry; } TLBGuid; @@ -1830,7 +1831,8 @@ static TLBImplType *TLBImplType_Alloc(UINT n) return ret; } -static TLBGuid *TLB_append_guid(struct list *guid_list, const GUID *new_guid) +static TLBGuid *TLB_append_guid(struct list *guid_list, + const GUID *new_guid, HREFTYPE hreftype) { TLBGuid *guid; @@ -1844,6 +1846,7 @@ static TLBGuid *TLB_append_guid(struct list *guid_list, const GUID *new_guid) return NULL; memcpy(&guid->guid, new_guid, sizeof(GUID)); + guid->hreftype = hreftype; list_add_tail(guid_list, &guid->entry); @@ -1984,6 +1987,7 @@ static HRESULT MSFT_ReadAllGuids(TLBContext *pcx) guid->offset = offs; guid->guid = entry.guid; + guid->hreftype = entry.hreftype; list_add_tail(&pcx->pLibInfo->guid_list, &guid->entry); @@ -3628,7 +3632,7 @@ static DWORD SLTG_ReadLibBlk(LPVOID pLibBlk, ITypeLibImpl *pTypeLibImpl) pTypeLibImpl->ver_minor = *(WORD*)ptr; ptr += 2; - pTypeLibImpl->guid = TLB_append_guid(&pTypeLibImpl->guid_list, (GUID*)ptr); + pTypeLibImpl->guid = TLB_append_guid(&pTypeLibImpl->guid_list, (GUID*)ptr, -2); ptr += sizeof(GUID); return ptr - (char*)pLibBlk; @@ -3786,7 +3790,7 @@ static sltg_ref_lookup_t *SLTG_DoRefs(SLTG_RefInfo *pRef, ITypeLibImpl *pTL, import = heap_alloc_zero(sizeof(*import)); import->offset = lib_offs; TLB_GUIDFromString( pNameTable + lib_offs + 4, &tmpguid); - import->guid = TLB_append_guid(&pTL->guid_list, &tmpguid); + import->guid = TLB_append_guid(&pTL->guid_list, &tmpguid, 2); if(sscanf(pNameTable + lib_offs + 40, "}#%hd.%hd#%x#%s", &import->wVersionMajor, &import->wVersionMinor, @@ -4427,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 = TLB_append_guid(&pTypeLibImpl->guid_list, &pOtherTypeInfoBlks[i].uuid); + (*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; @@ -8549,7 +8553,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnSetGuid(ICreateTypeLib2 *iface, TRACE("%p %s\n", This, debugstr_guid(guid)); - This->guid = TLB_append_guid(&This->guid_list, guid); + This->guid = TLB_append_guid(&This->guid_list, guid, -2); return S_OK; } @@ -8802,7 +8806,7 @@ static HRESULT WMSFT_compile_guids(ITypeLibImpl *This, WMSFT_TLBFile *file) guidhashtab = file->guidhash_seg.data; LIST_FOR_EACH_ENTRY(guid, &This->guid_list, TLBGuid, entry){ memcpy(&entry->guid, &guid->guid, sizeof(GUID)); - entry->hreftype = 0xFFFFFFFF; /* TODO */ + entry->hreftype = guid->hreftype; hash_key = hash_guid(&guid->guid); entry->next_hash = guidhashtab[hash_key]; @@ -9966,7 +9970,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetGuid(ICreateTypeInfo2 *iface, TRACE("%p %s\n", This, debugstr_guid(guid)); - This->guid = TLB_append_guid(&This->pTypeLib->guid_list, guid); + This->guid = TLB_append_guid(&This->pTypeLib->guid_list, guid, This->hreftype); return S_OK; } @@ -10114,7 +10118,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(ICreateTypeInfo2 *iface, } } - implib->guid = TLB_append_guid(&This->pTypeLib->guid_list, &libattr->guid); + implib->guid = TLB_append_guid(&This->pTypeLib->guid_list, &libattr->guid, 2); implib->lcid = libattr->lcid; implib->wVersionMajor = libattr->wMajorVerNum; implib->wVersionMinor = libattr->wMinorVerNum; @@ -10147,7 +10151,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddRefTypeInfo(ICreateTypeInfo2 *iface, ref_type->index = TLB_REF_USE_GUID; - ref_type->guid = TLB_append_guid(&This->pTypeLib->guid_list, &typeattr->guid); + ref_type->guid = TLB_append_guid(&This->pTypeLib->guid_list, &typeattr->guid, ref_type->reference+1); list_add_tail(&This->pTypeLib->ref_list, &ref_type->entry); } @@ -10772,7 +10776,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetCustData(ICreateTypeInfo2 *iface, if (!guid || !varVal) return E_INVALIDARG; - tlbguid = TLB_append_guid(&This->pTypeLib->guid_list, guid); + tlbguid = TLB_append_guid(&This->pTypeLib->guid_list, guid, -1); return TLB_set_custdata(This->pcustdata_list, tlbguid, varVal); }