Andrew Eikum : oleaut32: Assign MEMBERIDs to vardescs without one.

Alexandre Julliard julliard at winehq.org
Mon Aug 19 14:32:59 CDT 2013


Module: wine
Branch: master
Commit: b6bfd6d32e0abc0363c4c64b11769a6dc10a9d15
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b6bfd6d32e0abc0363c4c64b11769a6dc10a9d15

Author: Andrew Eikum <aeikum at 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;
 }




More information about the wine-cvs mailing list