Dmitry Timoshkov : oleaut32: Add some additional tests for QueryPathOfRegTypeLib, make them pass under Wine.

Alexandre Julliard julliard at winehq.org
Tue Apr 14 15:59:59 CDT 2009


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

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Mon Apr 13 15:14:08 2009 +0900

oleaut32: Add some additional tests for QueryPathOfRegTypeLib, make them pass under Wine.

---

 dlls/oleaut32/tests/typelib.c |    5 +++++
 dlls/oleaut32/typelib.c       |   32 ++++++++++++++++++++++++++------
 2 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 7c0e2c5..93920c5 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -638,6 +638,10 @@ static void test_QueryPathOfRegTypeLib(void)
         { 3, 22, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
         { 3, 37, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
         { 3, 40, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
+        { 0xffff, 0xffff, S_OK, {'f','a','k','e','_','5','_','3','7','.','d','l','l',0 } },
+        { 0xffff, 0, TYPE_E_LIBNOTREGISTERED, { 0 } },
+        { 3, 0xffff, TYPE_E_LIBNOTREGISTERED, { 0 } },
+        { 5, 0xffff, TYPE_E_LIBNOTREGISTERED, { 0 } },
         { 4, 0, TYPE_E_LIBNOTREGISTERED, { 0 } }
     };
     static const WCHAR base[] = {'f','a','k','e',0};
@@ -657,6 +661,7 @@ static void test_QueryPathOfRegTypeLib(void)
     if (!do_typelib_reg_key(&uid, 3, 0, base, 0)) return;
     if (!do_typelib_reg_key(&uid, 3, 1, base, 0)) return;
     if (!do_typelib_reg_key(&uid, 3, 37, base, 0)) return;
+    if (!do_typelib_reg_key(&uid, 5, 37, base, 0)) return;
 
     for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
     {
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 75a30d2..a0af847 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -168,13 +168,13 @@ static void FromLEDWords(void *p_Val, int p_iSize)
 /*
  * Find a typelib key which matches a requested maj.min version.
  */
-static BOOL find_typelib_key( REFGUID guid, WORD wMaj, WORD *wMin )
+static BOOL find_typelib_key( REFGUID guid, WORD *wMaj, WORD *wMin )
 {
     static const WCHAR typelibW[] = {'T','y','p','e','l','i','b','\\',0};
     WCHAR buffer[60];
     char key_name[16];
     DWORD len, i;
-    INT best_min = -1;
+    INT best_maj = -1, best_min = -1;
     HKEY hkey;
 
     memcpy( buffer, typelibW, sizeof(typelibW) );
@@ -193,20 +193,40 @@ static BOOL find_typelib_key( REFGUID guid, WORD wMaj, WORD *wMin )
         {
             TRACE("found %s: %x.%x\n", debugstr_w(buffer), v_maj, v_min);
 
-            if (wMaj == v_maj)
+            if (*wMaj == 0xffff && *wMin == 0xffff)
             {
+                if (v_maj > best_maj) best_maj = v_maj;
+                if (v_min > best_min) best_min = v_min;
+            }
+            else if (*wMaj == v_maj)
+            {
+                best_maj = v_maj;
+
                 if (*wMin == v_min)
                 {
                     best_min = v_min;
                     break; /* exact match */
                 }
-                if (v_min > best_min) best_min = v_min;
+                if (*wMin != 0xffff && v_min > best_min) best_min = v_min;
             }
         }
         len = sizeof(key_name);
     }
     RegCloseKey( hkey );
-    if (best_min >= 0)
+
+    TRACE("found best_maj %d, best_min %d\n", best_maj, best_min);
+
+    if (*wMaj == 0xffff && *wMin == 0xffff)
+    {
+        if (best_maj >= 0 && best_min >= 0)
+        {
+            *wMaj = best_maj;
+            *wMin = best_min;
+            return TRUE;
+        }
+    }
+
+    if (*wMaj == best_maj && best_min >= 0)
     {
         *wMin = best_min;
         return TRUE;
@@ -295,7 +315,7 @@ HRESULT WINAPI QueryPathOfRegTypeLib(
 
     TRACE_(typelib)("(%s, %x.%x, 0x%x, %p)\n", debugstr_guid(guid), wMaj, wMin, lcid, path);
 
-    if (!find_typelib_key( guid, wMaj, &wMin )) return TYPE_E_LIBNOTREGISTERED;
+    if (!find_typelib_key( guid, &wMaj, &wMin )) return TYPE_E_LIBNOTREGISTERED;
     get_typelib_key( guid, wMaj, wMin, buffer );
 
     res = RegOpenKeyExW( HKEY_CLASSES_ROOT, buffer, 0, KEY_READ, &hkey );




More information about the wine-cvs mailing list