[PATCH 3/6] oleaut32: Assign MEMBERIDs to vardescs without one

Andrew Eikum aeikum at codeweavers.com
Fri Aug 16 14:40:22 CDT 2013


---
 dlls/oleaut32/tests/typelib.c |  4 ++++
 dlls/oleaut32/typelib.c       | 27 +++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)

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;
 }
-- 
1.8.3.4





More information about the wine-patches mailing list