From 379e1c035a4c4f838c75945d775c885560486c17 Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Thu, 30 May 2013 16:42:50 -0500 Subject: [PATCH] oleaut32: Store all Names in typelibs, too. --- dlls/oleaut32/typelib.c | 248 ++++++++++++++++++++++++++++-------------------- 1 file changed, 144 insertions(+), 104 deletions(-) diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 24e06b920c2..de09a5a7d23 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -1002,8 +1002,9 @@ typedef struct tagITypeLibImpl * exported to the application as a UNICODE string. */ struct list string_list; + struct list name_list; - BSTR Name; + const TLBString *Name; const TLBString *DocString; const TLBString *HelpFile; const TLBString *HelpStringDll; @@ -1083,7 +1084,7 @@ typedef struct tagTLBRefType /* internal Parameter data */ typedef struct tagTLBParDesc { - BSTR Name; + const TLBString *Name; struct list custdata_list; } TLBParDesc; @@ -1091,7 +1092,7 @@ typedef struct tagTLBParDesc typedef struct tagTLBFuncDesc { FUNCDESC funcdesc; /* lots of info on the function and its attributes. */ - BSTR Name; /* the name of this function */ + const TLBString *Name; /* the name of this function */ TLBParDesc *pParamDesc; /* array with param names and custom data */ int helpcontext; int HelpStringContext; @@ -1104,7 +1105,7 @@ typedef struct tagTLBFuncDesc typedef struct tagTLBVarDesc { VARDESC vardesc; /* lots of info on the variable and its attributes. */ - BSTR Name; /* the name of this variable */ + const TLBString *Name; /* the name of this variable */ int HelpContext; int HelpStringContext; const TLBString *HelpString; @@ -1135,7 +1136,7 @@ typedef struct tagITypeInfoImpl /* type libs seem to store the doc strings in ascii * so why should we do it in unicode? */ - BSTR Name; + const TLBString *Name; const TLBString *DocString; const TLBString *DllName; const TLBString *Schema; @@ -1199,6 +1200,13 @@ static inline BSTR TLB_get_bstr(const TLBString *str) return str != NULL ? str->str : NULL; } +static inline int TLB_str_memcmp(void *left, const TLBString *str, DWORD len) +{ + if(!str) + return 1; + return memcmp(left, str->str, len); +} + /* debug */ @@ -1322,9 +1330,9 @@ static const char * const typekind_desc[] = static void dump_TLBFuncDescOne(const TLBFuncDesc * pfd) { int i; - MESSAGE("%s(%u)\n", debugstr_w(pfd->Name), pfd->funcdesc.cParams); + MESSAGE("%s(%u)\n", debugstr_w(TLB_get_bstr(pfd->Name)), pfd->funcdesc.cParams); for (i=0;ifuncdesc.cParams;i++) - MESSAGE("\tparm%d: %s\n",i,debugstr_w(pfd->pParamDesc[i].Name)); + MESSAGE("\tparm%d: %s\n",i,debugstr_w(TLB_get_bstr(pfd->pParamDesc[i].Name))); dump_FUNCDESC(&(pfd->funcdesc)); @@ -1352,7 +1360,7 @@ static void dump_TLBVarDesc(const TLBVarDesc * pvd, UINT n) { while (n) { - TRACE_(typelib)("%s\n", debugstr_w(pvd->Name)); + TRACE_(typelib)("%s\n", debugstr_w(TLB_get_bstr(pvd->Name))); ++pvd; --n; } @@ -1477,7 +1485,7 @@ static void dump_DispParms(const DISPPARAMS * pdp) static void dump_TypeInfo(const ITypeInfoImpl * pty) { TRACE("%p ref=%u\n", pty, pty->ref); - TRACE("%s %s\n", debugstr_w(pty->Name), debugstr_w(TLB_get_bstr(pty->DocString))); + 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->TypeAttr.guid))); TRACE("kind:%s\n", typekind_desc[pty->TypeAttr.typekind]); TRACE("fct:%u var:%u impl:%u\n", @@ -1634,7 +1642,7 @@ static inline TLBFuncDesc *TLB_get_funcdesc_by_name(TLBFuncDesc *funcdescs, UINT n, const OLECHAR *name) { while(n){ - if(!lstrcmpiW(funcdescs->Name, name)) + if(!lstrcmpiW(TLB_get_bstr(funcdescs->Name), name)) return funcdescs; ++funcdescs; --n; @@ -1658,7 +1666,7 @@ static inline TLBVarDesc *TLB_get_vardesc_by_name(TLBVarDesc *vardescs, UINT n, const OLECHAR *name) { while(n){ - if(!lstrcmpiW(vardescs->Name, name)) + if(!lstrcmpiW(TLB_get_bstr(vardescs->Name), name)) return vardescs; ++vardescs; --n; @@ -1679,7 +1687,7 @@ static inline ITypeInfoImpl *TLB_get_typeinfo_by_name(ITypeInfoImpl **typeinfos, UINT n, const OLECHAR *name) { while(n){ - if(!lstrcmpiW((*typeinfos)->Name, name)) + if(!lstrcmpiW(TLB_get_bstr((*typeinfos)->Name), name)) return *typeinfos; ++typeinfos; --n; @@ -1907,40 +1915,65 @@ static HREFTYPE MSFT_ReadHreftype( TLBContext *pcx, int offset ) return niName.hreftype; } -static BSTR MSFT_ReadName( TLBContext *pcx, int offset) +static HRESULT MSFT_ReadAllNames(TLBContext *pcx) { - char * name; - MSFT_NameIntro niName; - int lengthInChars; - BSTR bstrName = NULL; + char *string; + MSFT_NameIntro intro; + INT16 len_piece; + int offs = 0, lengthInChars; - if (offset < 0) - { - ERR_(typelib)("bad offset %d\n", offset); - return NULL; - } - MSFT_ReadLEDWords(&niName, sizeof(niName), pcx, - pcx->pTblDir->pNametab.offset+offset); - niName.namelen &= 0xFF; /* FIXME: correct ? */ - name = heap_alloc_zero((niName.namelen & 0xff) +1); - MSFT_Read(name, (niName.namelen & 0xff), pcx, DO_NOT_SEEK); - name[niName.namelen & 0xff]='\0'; + MSFT_Seek(pcx, pcx->pTblDir->pNametab.offset); + while (1) { + TLBString *tlbstr; - lengthInChars = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, - name, -1, NULL, 0); + if (offs >= pcx->pTblDir->pNametab.length) + return S_OK; - /* no invalid characters in string */ - if (lengthInChars) - { - bstrName = SysAllocStringByteLen(NULL, lengthInChars * sizeof(WCHAR)); + MSFT_ReadLEWords(&intro, sizeof(MSFT_NameIntro), pcx, DO_NOT_SEEK); + intro.namelen &= 0xFF; + len_piece = intro.namelen + sizeof(MSFT_NameIntro); + if(len_piece % 4) + len_piece = (len_piece + 4) & ~0x3; + if(len_piece < 8) + len_piece = 8; + + string = heap_alloc(len_piece + 1); + MSFT_Read(string, len_piece - sizeof(MSFT_NameIntro), pcx, DO_NOT_SEEK); + string[intro.namelen] = '\0'; - /* don't check for invalid character since this has been done previously */ - MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, bstrName, lengthInChars); + lengthInChars = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, + string, -1, NULL, 0); + if (!lengthInChars) { + heap_free(string); + return E_UNEXPECTED; + } + + tlbstr = heap_alloc(sizeof(TLBString)); + + tlbstr->offset = offs; + tlbstr->str = SysAllocStringByteLen(NULL, lengthInChars * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, string, -1, tlbstr->str, lengthInChars); + + heap_free(string); + + list_add_tail(&pcx->pLibInfo->name_list, &tlbstr->entry); + + offs += len_piece; } - heap_free(name); +} + +static TLBString *MSFT_ReadName( TLBContext *pcx, int offset) +{ + TLBString *tlbstr; - TRACE_(typelib)("%s %d\n", debugstr_w(bstrName), lengthInChars); - return bstrName; + LIST_FOR_EACH_ENTRY(tlbstr, &pcx->pLibInfo->name_list, TLBString, entry) { + if (tlbstr->offset == offset) { + TRACE_(typelib)("%s\n", debugstr_w(tlbstr->str)); + return tlbstr; + } + } + + return NULL; } static TLBString *MSFT_ReadString( TLBContext *pcx, int offset) @@ -2175,7 +2208,7 @@ MSFT_DoFuncs(TLBContext* pcx, /* nameoffset is sometimes -1 on the second half of a propget/propput * pair of functions */ if ((nameoffset == -1) && (i > 0)) - ptfd->Name = SysAllocString(ptfd_prev->Name); + ptfd->Name = ptfd_prev->Name; else ptfd->Name = MSFT_ReadName(pcx, nameoffset); @@ -2263,11 +2296,11 @@ MSFT_DoFuncs(TLBContext* pcx, /* this occurs for [propput] or [propget] methods, so * we should just set the name of the parameter to the * name of the method. */ - ptfd->pParamDesc[j].Name = SysAllocString(ptfd->Name); + ptfd->pParamDesc[j].Name = ptfd->Name; else ptfd->pParamDesc[j].Name = MSFT_ReadName( pcx, paraminfo.oName ); - TRACE_(typelib)("param[%d] = %s\n", j, debugstr_w(ptfd->pParamDesc[j].Name)); + TRACE_(typelib)("param[%d] = %s\n", j, debugstr_w(TLB_get_bstr(ptfd->pParamDesc[j].Name))); MSFT_ResolveReferencedTypes(pcx, pTI, &elemdesc->tdesc); @@ -2501,7 +2534,7 @@ static ITypeInfoImpl * MSFT_DoTypeInfo( /* name, eventually add to a hash table */ ptiRet->Name=MSFT_ReadName(pcx, tiBase.NameOffset); ptiRet->hreftype = MSFT_ReadHreftype(pcx, tiBase.NameOffset); - TRACE_(typelib)("reading %s\n", debugstr_w(ptiRet->Name)); + TRACE_(typelib)("reading %s\n", debugstr_w(TLB_get_bstr(ptiRet->Name))); /* help info */ ptiRet->DocString=MSFT_ReadString(pcx, tiBase.docstringoffs); ptiRet->dwHelpStringContext=tiBase.helpstringcontext; @@ -2554,7 +2587,7 @@ static ITypeInfoImpl * MSFT_DoTypeInfo( MSFT_CustData(pcx, tiBase.oCustData, &ptiRet->custdata_list); TRACE_(typelib)("%s guid: %s kind:%s\n", - debugstr_w(ptiRet->Name), + debugstr_w(TLB_get_bstr(ptiRet->Name)), debugstr_guid(&ptiRet->TypeAttr.guid), typekind_desc[ptiRet->TypeAttr.typekind]); if (TRACE_ON(typelib)) @@ -3177,6 +3210,7 @@ static ITypeLibImpl* TypeLibImpl_Constructor(void) list_init(&pTypeLibImpl->implib_list); list_init(&pTypeLibImpl->custdata_list); + list_init(&pTypeLibImpl->name_list); list_init(&pTypeLibImpl->string_list); list_init(&pTypeLibImpl->ref_list); pTypeLibImpl->dispatch_href = -1; @@ -3237,6 +3271,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength) return NULL; } + MSFT_ReadAllNames(&cx); MSFT_ReadAllStrings(&cx); /* now fill our internal data */ @@ -3451,6 +3486,23 @@ static WORD SLTG_ReadStringA(const char *ptr, char **str) return bytelen + 2; } +static TLBString *SLTG_ReadName(const char *pNameTable, int offset, ITypeLibImpl *lib) +{ + BSTR tmp_str; + TLBString *tlbstr; + + LIST_FOR_EACH_ENTRY(tlbstr, &lib->name_list, TLBString, entry) { + if (tlbstr->offset == offset) + return tlbstr; + } + + tmp_str = TLB_MultiByteToBSTR(pNameTable + offset); + tlbstr = TLB_append_str(&lib->name_list, tmp_str); + SysFreeString(tmp_str); + + return tlbstr; +} + static DWORD SLTG_ReadLibBlk(LPVOID pLibBlk, ITypeLibImpl *pTypeLibImpl) { char *ptr = pLibBlk; @@ -3733,7 +3785,7 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign const char *pNameTable, const sltg_ref_lookup_t *ref_lookup) { TLBVarDesc *pVarDesc; - BSTR bstrPrevName = NULL; + const TLBString *prevName = NULL; SLTG_Variable *pItem; unsigned short i; WORD *pType; @@ -3752,11 +3804,11 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign } if (pItem->name == 0xfffe) - pVarDesc->Name = SysAllocString(bstrPrevName); + pVarDesc->Name = prevName; else - pVarDesc->Name = TLB_MultiByteToBSTR(pItem->name + pNameTable); + pVarDesc->Name = SLTG_ReadName(pNameTable, pItem->name, pTI->pTypeLib); - TRACE_(typelib)("name: %s\n", debugstr_w(pVarDesc->Name)); + TRACE_(typelib)("name: %s\n", debugstr_w(TLB_get_bstr(pVarDesc->Name))); TRACE_(typelib)("byte_offs = 0x%x\n", pItem->byte_offs); TRACE_(typelib)("memid = 0x%x\n", pItem->memid); @@ -3835,7 +3887,7 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign if (pItem->flags & 0x80) pVarDesc->vardesc.wVarFlags |= VARFLAG_FREADONLY; - bstrPrevName = pVarDesc->Name; + prevName = pVarDesc->Name; } pTI->TypeAttr.cVars = cVars; } @@ -3870,7 +3922,7 @@ static void SLTG_DoFuncs(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, FIXME("unimplemented func magic = %02x\n", pFunc->magic & ~SLTG_FUNCTION_FLAGS_PRESENT); continue; } - pFuncDesc->Name = TLB_MultiByteToBSTR(pFunc->name + pNameTable); + pFuncDesc->Name = SLTG_ReadName(pNameTable, pFunc->name, pTI->pTypeLib); pFuncDesc->funcdesc.memid = pFunc->dispid; pFuncDesc->funcdesc.invkind = pFunc->inv >> 4; @@ -3937,11 +3989,10 @@ static void SLTG_DoFuncs(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, pFuncDesc->funcdesc.lprgelemdescParam[param].u.paramdesc.wParamFlags |= PARAMFLAG_FOPT; if(paramName) { - pFuncDesc->pParamDesc[param].Name = - TLB_MultiByteToBSTR(paramName); + pFuncDesc->pParamDesc[param].Name = SLTG_ReadName(pNameTable, + paramName - pNameTable, pTI->pTypeLib); } else { - pFuncDesc->pParamDesc[param].Name = - SysAllocString(pFuncDesc->Name); + pFuncDesc->pParamDesc[param].Name = pFuncDesc->Name; } } } @@ -4254,7 +4305,7 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength) TRACE_(typelib)("Library name is %s\n", pNameTable + pLibBlk->name); - pTypeLibImpl->Name = TLB_MultiByteToBSTR(pNameTable + pLibBlk->name); + pTypeLibImpl->Name = SLTG_ReadName(pNameTable, pLibBlk->name, pTypeLibImpl); /* Hopefully we now have enough ptrs set up to actually read in @@ -4292,9 +4343,7 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength) *ppTypeInfoImpl = ITypeInfoImpl_Constructor(); (*ppTypeInfoImpl)->pTypeLib = pTypeLibImpl; (*ppTypeInfoImpl)->index = i; - (*ppTypeInfoImpl)->Name = TLB_MultiByteToBSTR( - pOtherTypeInfoBlks[i].name_offs + - pNameTable); + (*ppTypeInfoImpl)->Name = SLTG_ReadName(pNameTable, pOtherTypeInfoBlks[i].name_offs, pTypeLibImpl); (*ppTypeInfoImpl)->dwHelpContext = pOtherTypeInfoBlks[i].helpcontext; (*ppTypeInfoImpl)->TypeAttr.guid = pOtherTypeInfoBlks[i].uuid; (*ppTypeInfoImpl)->TypeAttr.typekind = pTIHeader->typekind; @@ -4312,7 +4361,7 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength) FIXME_(typelib)("typeflags3 = %02x\n", pTIHeader->typeflags3); TRACE_(typelib)("TypeInfo %s of kind %s guid %s typeflags %04x\n", - debugstr_w((*ppTypeInfoImpl)->Name), + debugstr_w(TLB_get_bstr((*ppTypeInfoImpl)->Name)), typekind_desc[pTIHeader->typekind], debugstr_guid(&(*ppTypeInfoImpl)->TypeAttr.guid), (*ppTypeInfoImpl)->TypeAttr.wTypeFlags); @@ -4463,14 +4512,16 @@ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface) } TRACE(" destroying ITypeLib(%p)\n",This); - SysFreeString(This->Name); - This->Name = NULL; - LIST_FOR_EACH_ENTRY_SAFE(tlbstr, tlbstr_next, &This->string_list, TLBString, entry) { list_remove(&tlbstr->entry); heap_free(tlbstr); } + LIST_FOR_EACH_ENTRY_SAFE(tlbstr, tlbstr_next, &This->name_list, TLBString, entry) { + list_remove(&tlbstr->entry); + heap_free(tlbstr); + } + TLB_FreeCustData(&This->custdata_list); for (i = 0; i < This->ctTypeDesc; i++) @@ -4666,7 +4717,7 @@ static HRESULT WINAPI ITypeLib2_fnGetDocumentation( { if (This->Name) { - if(!(*pBstrName = SysAllocString(This->Name))) + if(!(*pBstrName = SysAllocString(TLB_get_bstr(This->Name)))) goto memerr1; } else @@ -4681,7 +4732,7 @@ static HRESULT WINAPI ITypeLib2_fnGetDocumentation( } else if (This->Name) { - if(!(*pBstrDocString = SysAllocString(This->Name))) + if(!(*pBstrDocString = SysAllocString(TLB_get_bstr(This->Name)))) goto memerr2; } else @@ -4751,19 +4802,19 @@ static HRESULT WINAPI ITypeLib2_fnIsName( *pfName=TRUE; for(tic = 0; tic < This->TypeInfoCount; ++tic){ ITypeInfoImpl *pTInfo = This->typeinfos[tic]; - if(!memcmp(szNameBuf,pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; + if(!TLB_str_memcmp(szNameBuf, pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; for(fdc = 0; fdc < pTInfo->TypeAttr.cFuncs; ++fdc) { TLBFuncDesc *pFInfo = &pTInfo->funcdescs[fdc]; int pc; - - if(!memcmp(szNameBuf,pFInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; - for(pc=0; pc < pFInfo->funcdesc.cParams; pc++) - if(!memcmp(szNameBuf,pFInfo->pParamDesc[pc].Name, nNameBufLen)) + if(!TLB_str_memcmp(szNameBuf, pFInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; + for(pc=0; pc < pFInfo->funcdesc.cParams; pc++){ + if(!TLB_str_memcmp(szNameBuf, pFInfo->pParamDesc[pc].Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; + } } for(vrc = 0; vrc < pTInfo->TypeAttr.cVars; ++vrc){ TLBVarDesc *pVInfo = &pTInfo->vardescs[vrc]; - if(!memcmp(szNameBuf,pVInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; + if(!TLB_str_memcmp(szNameBuf, pVInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; } } @@ -4806,14 +4857,14 @@ static HRESULT WINAPI ITypeLib2_fnFindName( TLBVarDesc *var; UINT fdc; - if(!memcmp(name, pTInfo->Name, len)) goto ITypeLib2_fnFindName_exit; + if(!TLB_str_memcmp(name, pTInfo->Name, len)) goto ITypeLib2_fnFindName_exit; for(fdc = 0; fdc < pTInfo->TypeAttr.cFuncs; ++fdc) { TLBFuncDesc *func = &pTInfo->funcdescs[fdc]; int pc; - if(!memcmp(name, func->Name, len)) goto ITypeLib2_fnFindName_exit; + if(!TLB_str_memcmp(name, func->Name, len)) goto ITypeLib2_fnFindName_exit; for(pc = 0; pc < func->funcdesc.cParams; pc++) { - if(!memcmp(name, func->pParamDesc[pc].Name, len)) + if(!TLB_str_memcmp(name, func->pParamDesc[pc].Name, len)) goto ITypeLib2_fnFindName_exit; } } @@ -5062,7 +5113,7 @@ static HRESULT WINAPI ITypeLibComp_fnBind( for(i = 0; i < This->TypeInfoCount; ++i){ ITypeInfoImpl *pTypeInfo = This->typeinfos[i]; - TRACE("testing %s\n", debugstr_w(pTypeInfo->Name)); + TRACE("testing %s\n", debugstr_w(TLB_get_bstr(pTypeInfo->Name))); /* FIXME: check wFlags here? */ /* FIXME: we should use a hash table to look this info up using lHash @@ -5070,7 +5121,7 @@ static HRESULT WINAPI ITypeLibComp_fnBind( if ((pTypeInfo->TypeAttr.typekind == TKIND_ENUM) || (pTypeInfo->TypeAttr.typekind == TKIND_MODULE)) { - if (pTypeInfo->Name && !strcmpW(pTypeInfo->Name, szName)) + if (pTypeInfo->Name && !strcmpW(pTypeInfo->Name->str, szName)) { *pDescKind = DESCKIND_TYPECOMP; pBindPtr->lptcomp = &pTypeInfo->ITypeComp_iface; @@ -5292,9 +5343,6 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This) TRACE("destroying ITypeInfo(%p)\n",This); - SysFreeString(This->Name); - This->Name = NULL; - for (i = 0; i < This->TypeAttr.cFuncs; ++i) { int j; @@ -5308,12 +5356,10 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This) heap_free(elemdesc->u.paramdesc.pparamdescex); } TLB_FreeCustData(&pFInfo->pParamDesc[j].custdata_list); - SysFreeString(pFInfo->pParamDesc[j].Name); } heap_free(pFInfo->funcdesc.lprgelemdescParam); heap_free(pFInfo->pParamDesc); TLB_FreeCustData(&pFInfo->custdata_list); - SysFreeString(pFInfo->Name); } heap_free(This->funcdescs); @@ -5326,7 +5372,6 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This) heap_free(pVInfo->vardesc.u.lpvarValue); } TLB_FreeCustData(&pVInfo->custdata_list); - SysFreeString(pVInfo->Name); } heap_free(This->vardescs); @@ -5802,9 +5847,9 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid, for(i=0; ifuncdesc.cParams; i++) { if(!i) - *rgBstrNames=SysAllocString(pFDesc->Name); + *rgBstrNames=SysAllocString(TLB_get_bstr(pFDesc->Name)); else - rgBstrNames[i]=SysAllocString(pFDesc->pParamDesc[i-1].Name); + rgBstrNames[i]=SysAllocString(TLB_get_bstr(pFDesc->pParamDesc[i-1].Name)); } *pcNames=i; } @@ -5813,7 +5858,7 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid, pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->TypeAttr.cVars, memid); if(pVDesc) { - *rgBstrNames=SysAllocString(pVDesc->Name); + *rgBstrNames=SysAllocString(TLB_get_bstr(pVDesc->Name)); *pcNames=1; } else @@ -5952,11 +5997,11 @@ static HRESULT WINAPI ITypeInfo_fnGetIDsOfNames( ITypeInfo2 *iface, for (fdc = 0; fdc < This->TypeAttr.cFuncs; ++fdc) { int j; const TLBFuncDesc *pFDesc = &This->funcdescs[fdc]; - if(!lstrcmpiW(*rgszNames, pFDesc->Name)) { + if(!lstrcmpiW(*rgszNames, TLB_get_bstr(pFDesc->Name))) { if(cNames) *pMemId=pFDesc->funcdesc.memid; for(i=1; i < cNames; i++){ for(j=0; jfuncdesc.cParams; j++) - if(!lstrcmpiW(rgszNames[i],pFDesc->pParamDesc[j].Name)) + if(!lstrcmpiW(rgszNames[i],TLB_get_bstr(pFDesc->pParamDesc[j].Name))) break; if( jfuncdesc.cParams) pMemId[i]=j; @@ -7074,7 +7119,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface, This, memid, pBstrName, pBstrDocString, pdwHelpContext, pBstrHelpFile); if(memid==MEMBERID_NIL){ /* documentation for the typeinfo */ if(pBstrName) - *pBstrName=SysAllocString(This->Name); + *pBstrName=SysAllocString(TLB_get_bstr(This->Name)); if(pBstrDocString) *pBstrDocString=SysAllocString(TLB_get_bstr(This->DocString)); if(pdwHelpContext) @@ -7086,7 +7131,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface, pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->TypeAttr.cFuncs, memid); if(pFDesc){ if(pBstrName) - *pBstrName = SysAllocString(pFDesc->Name); + *pBstrName = SysAllocString(TLB_get_bstr(pFDesc->Name)); if(pBstrDocString) *pBstrDocString=SysAllocString(TLB_get_bstr(pFDesc->HelpString)); if(pdwHelpContext) @@ -7098,7 +7143,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface, pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->TypeAttr.cVars, memid); if(pVDesc){ if(pBstrName) - *pBstrName = SysAllocString(pVDesc->Name); + *pBstrName = SysAllocString(TLB_get_bstr(pVDesc->Name)); if(pBstrDocString) *pBstrDocString=SysAllocString(TLB_get_bstr(pVDesc->HelpString)); if(pdwHelpContext) @@ -7791,7 +7836,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetDocumentation2( */ if(memid==MEMBERID_NIL){ /* documentation for the typeinfo */ if(pbstrHelpString) - *pbstrHelpString=SysAllocString(This->Name); + *pbstrHelpString=SysAllocString(TLB_get_bstr(This->Name)); if(pdwHelpStringContext) *pdwHelpStringContext=This->dwHelpStringContext; if(pbstrHelpStringDll) @@ -8023,7 +8068,7 @@ HRESULT WINAPI CreateDispTypeInfo( pFuncDesc = pTIIface->funcdescs; for(func = 0; func < pidata->cMembers; func++) { METHODDATA *md = pidata->pmethdata + func; - pFuncDesc->Name = SysAllocString(md->szName); + pFuncDesc->Name = TLB_append_str(&pTypeLibImpl->name_list, md->szName); pFuncDesc->funcdesc.memid = md->dispid; pFuncDesc->funcdesc.lprgscode = NULL; pFuncDesc->funcdesc.funckind = FUNC_VIRTUAL; @@ -8042,7 +8087,7 @@ HRESULT WINAPI CreateDispTypeInfo( pFuncDesc->pParamDesc = TLBParDesc_Constructor(md->cArgs); for(param = 0; param < md->cArgs; param++) { pFuncDesc->funcdesc.lprgelemdescParam[param].tdesc.vt = md->ppdata[param].vt; - pFuncDesc->pParamDesc[param].Name = SysAllocString(md->ppdata[param].szName); + pFuncDesc->pParamDesc[param].Name = TLB_append_str(&pTypeLibImpl->name_list, md->ppdata[param].szName); } pFuncDesc->helpcontext = 0; pFuncDesc->HelpStringContext = 0; @@ -8135,7 +8180,7 @@ static HRESULT WINAPI ITypeComp_fnBind( for(fdc = 0; fdc < This->TypeAttr.cFuncs; ++fdc){ pFDesc = &This->funcdescs[fdc]; - if (!strcmpiW(pFDesc->Name, szName)) { + if (!strcmpiW(TLB_get_bstr(pFDesc->Name), szName)) { if (!wFlags || (pFDesc->funcdesc.invkind & wFlags)) break; else @@ -8273,7 +8318,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnCreateTypeInfo(ICreateTypeLib2 *iface, info = This->typeinfos[This->TypeInfoCount] = ITypeInfoImpl_Constructor(); info->pTypeLib = This; - info->Name = SysAllocString(name); + info->Name = TLB_append_str(&This->name_list, name); info->index = This->TypeInfoCount; info->TypeAttr.typekind = kind; info->TypeAttr.cbAlignment = 4; @@ -8304,7 +8349,6 @@ static HRESULT WINAPI ICreateTypeLib2_fnCreateTypeInfo(ICreateTypeLib2 *iface, hres = ITypeInfo2_QueryInterface(&info->ITypeInfo2_iface, &IID_ICreateTypeInfo, (void **)ctinfo); if (FAILED(hres)) { - SysFreeString(info->Name); ITypeInfo2_Release(&info->ITypeInfo2_iface); return hres; } @@ -8326,8 +8370,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnSetName(ICreateTypeLib2 *iface, if (!name) return E_INVALIDARG; - SysFreeString(This->Name); - This->Name = SysAllocString(name); + This->Name = TLB_append_str(&This->name_list, name); return S_OK; } @@ -8990,7 +9033,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncAndParamNames(ICreateTypeInfo2 * for(i = 0; i < This->TypeAttr.cFuncs; ++i) { TLBFuncDesc *iter = &This->funcdescs[i]; - if (iter->Name && !strcmpW(iter->Name, *names)) { + if (iter->Name && !strcmpW(TLB_get_bstr(iter->Name), *names)) { if (iter->funcdesc.invkind & (INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF | INVOKE_PROPERTYGET) && func_desc->funcdesc.invkind & (INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF | INVOKE_PROPERTYGET) && func_desc->funcdesc.invkind != iter->funcdesc.invkind) @@ -8999,13 +9042,11 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncAndParamNames(ICreateTypeInfo2 * } } - SysFreeString(func_desc->Name); - func_desc->Name = SysAllocString(*names); + func_desc->Name = TLB_append_str(&This->pTypeLib->name_list, *names); for (i = 1; i < numNames; ++i) { TLBParDesc *par_desc = func_desc->pParamDesc + i - 1; - SysFreeString(par_desc->Name); - par_desc->Name = SysAllocString(*(names + i)); + par_desc->Name = TLB_append_str(&This->pTypeLib->name_list, *(names + i)); } return S_OK; @@ -9345,8 +9386,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetName(ICreateTypeInfo2 *iface, if (!name) return E_INVALIDARG; - SysFreeString(This->Name); - This->Name = SysAllocString(name); + This->Name = TLB_append_str(&This->pTypeLib->name_list, name); return S_OK; } -- 2.11.4.GIT