Module: wine Branch: master Commit: b6bfd6d32e0abc0363c4c64b11769a6dc10a9d15 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b6bfd6d32e0abc0363c4c64b11...
Author: Andrew Eikum aeikum@codeweavers.com Date: Fri Aug 16 14:40:22 2013 -0500
oleaut32: Assign MEMBERIDs to vardescs without one.
---
dlls/oleaut32/tests/typelib.c | 4 ++++ dlls/oleaut32/typelib.c | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c index 40359a2..d12181c 100644 --- a/dlls/oleaut32/tests/typelib.c +++ b/dlls/oleaut32/tests/typelib.c @@ -4032,6 +4032,7 @@ static void test_SetVarHelpContext(void) ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hr);
memset(&desc, 0, sizeof(desc)); + desc.memid = MEMBERID_NIL; desc.elemdescVar.tdesc.vt = VT_INT; desc.varkind = VAR_CONST;
@@ -4067,6 +4068,7 @@ static void test_SetVarHelpContext(void)
hr = ITypeInfo_GetVarDesc(ti, 0, &pdesc); ok(hr == S_OK, "got %08x\n", hr); + ok(pdesc->memid == 0x40000000, "got wrong memid: %x\n", pdesc->memid); ok(pdesc->elemdescVar.tdesc.vt == VT_INT, "got wrong vardesc type: %u\n", pdesc->elemdescVar.tdesc.vt); ok(pdesc->varkind == VAR_CONST, "got wrong varkind: %u\n", pdesc->varkind); ok(V_VT(U(pdesc)->lpvarValue) == VT_INT, "got wrong value type: %u\n", V_VT(U(pdesc)->lpvarValue)); @@ -4191,6 +4193,7 @@ static void test_SetVarDocString(void) ok(hr == E_INVALIDARG, "got %08x\n", hr);
memset(&desc, 0, sizeof(desc)); + desc.memid = MEMBERID_NIL; desc.elemdescVar.tdesc.vt = VT_INT; desc.varkind = VAR_CONST;
@@ -4229,6 +4232,7 @@ static void test_SetVarDocString(void)
hr = ITypeInfo_GetVarDesc(ti, 0, &pdesc); ok(hr == S_OK, "got %08x\n", hr); + ok(pdesc->memid == 0x40000000, "got wrong memid: %x\n", pdesc->memid); ok(pdesc->elemdescVar.tdesc.vt == VT_INT, "got wrong vardesc type: %u\n", pdesc->elemdescVar.tdesc.vt); ok(pdesc->varkind == VAR_CONST, "got wrong varkind: %u\n", pdesc->varkind); ok(V_VT(U(pdesc)->lpvarValue) == VT_INT, "got wrong value type: %u\n", V_VT(U(pdesc)->lpvarValue)); diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 4cccbac..118e1f0 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -10737,6 +10737,33 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(ICreateTypeInfo2 *iface) if (user_vft > This->cbSizeVft) This->cbSizeVft = user_vft + This->pTypeLib->ptr_size;
+ for(i = 0; i < This->cVars; ++i){ + TLBVarDesc *var_desc = &This->vardescs[i]; + if(var_desc->vardesc.memid == MEMBERID_NIL){ + UINT j = 0; + BOOL reset = FALSE; + TLBVarDesc *iter; + + var_desc->vardesc.memid = 0x40000000 + (depth << 16) + i; + + iter = This->vardescs; + while (j < This->cVars) { + if (iter != var_desc && iter->vardesc.memid == var_desc->vardesc.memid) { + if (!reset) { + var_desc->vardesc.memid = 0x40000000 + (depth << 16) + This->cVars; + reset = TRUE; + } else + ++var_desc->vardesc.memid; + iter = This->vardescs; + j = 0; + } else { + ++iter; + ++j; + } + } + } + } + ITypeInfo_Release(tinfo); return hres; }