Dmitry Timoshkov : oleaut32: Make QueryPathOfRegTypeLib test pass under Wine.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Oct 23 10:02:22 CDT 2006


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

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Mon Oct 23 20:28:37 2006 +0900

oleaut32: Make QueryPathOfRegTypeLib test pass under Wine.

---

 dlls/oleaut32/tests/typelib.c |    4 ---
 dlls/oleaut32/typelib.c       |   56 ++++++++++++++++++++++++++++++++++++++--
 2 files changed, 53 insertions(+), 7 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 4808bf4..ccc5b26 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -541,13 +541,9 @@ static void test_QueryPathOfRegTypeLib(v
         { 1, 0, TYPE_E_LIBNOTREGISTERED, { 0 } },
         { 3, 0, S_OK, {'f','a','k','e','_','3','_','0','.','d','l','l',0 } },
         { 3, 1, S_OK, {'f','a','k','e','_','3','_','1','.','d','l','l',0 } },
-#if 0 /* todo: enable once properly implemented */
         { 3, 22, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
-#endif
         { 3, 37, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
-#if 0 /* todo: enable once properly implemented */
         { 3, 40, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
-#endif
         { 4, 0, TYPE_E_LIBNOTREGISTERED, { 0 } }
     };
     static const WCHAR base[] = {'f','a','k','e',0};
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index c6dd2aa..0863c30 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -149,6 +149,55 @@ #define FromLEWords(X,Y) /*nothing*/
 #define FromLEDWords(X,Y) /*nothing*/
 #endif
 
+/*
+ * Find a typelib key which matches a requested maj.min version.
+ */
+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;
+    HKEY hkey;
+
+    memcpy( buffer, typelibW, sizeof(typelibW) );
+    StringFromGUID2( guid, buffer + strlenW(buffer), 40 );
+
+    if (RegOpenKeyExW( HKEY_CLASSES_ROOT, buffer, 0, KEY_READ, &hkey ) != ERROR_SUCCESS)
+        return FALSE;
+
+    len = sizeof(key_name);
+    i = 0;
+    while (RegEnumKeyExA(hkey, i++, key_name, &len, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
+    {
+        INT v_maj, v_min;
+
+        if (sscanf(key_name, "%u.%u", &v_maj, &v_min) == 2)
+        {
+            TRACE("found %s: %u.%u\n", debugstr_w(buffer), v_maj, v_min);
+
+            if (*wMaj == v_maj)
+            {
+                if (*wMin == v_min)
+                {
+                    best_min = v_min;
+                    break; /* exact match */
+                }
+                if (v_min > best_min) best_min = v_min;
+            }
+        }
+        len = sizeof(key_name);
+    }
+    RegCloseKey( hkey );
+    if (best_min >= 0)
+    {
+        *wMin = best_min;
+        return TRUE;
+    }
+    return FALSE;
+}
+
 /* get the path of a typelib key, in the form "Typelib\\<guid>\\<maj>.<min>" */
 /* buffer must be at least 60 characters long */
 static WCHAR *get_typelib_key( REFGUID guid, WORD wMaj, WORD wMin, WCHAR *buffer )
@@ -230,6 +279,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;
     get_typelib_key( guid, wMaj, wMin, buffer );
 
     res = RegOpenKeyExW( HKEY_CLASSES_ROOT, buffer, 0, KEY_READ, &hkey );
@@ -708,7 +758,7 @@ HRESULT WINAPI UnRegisterTypeLib(
     }
 
     /* Try and open the key to the type library. */
-    if (RegOpenKeyExW(HKEY_CLASSES_ROOT, keyName, 0, KEY_READ | KEY_WRITE, &key) != S_OK) {
+    if (RegOpenKeyExW(HKEY_CLASSES_ROOT, keyName, 0, KEY_READ | KEY_WRITE, &key) != ERROR_SUCCESS) {
         result = E_INVALIDARG;
         goto end;
     }
@@ -742,7 +792,7 @@ HRESULT WINAPI UnRegisterTypeLib(
         get_interface_key( &typeAttr->guid, subKeyName );
 
         /* Delete its bits */
-        if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != S_OK) {
+        if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != ERROR_SUCCESS) {
             goto enddeleteloop;
         }
         RegDeleteKeyW(subKey, ProxyStubClsidW);
@@ -770,7 +820,7 @@ enddeleteloop:
     tmpLength = sizeof(subKeyName)/sizeof(WCHAR);
     deleteOtherStuff = TRUE;
     i = 0;
-    while(RegEnumKeyExW(key, i++, subKeyName, &tmpLength, NULL, NULL, NULL, NULL) == S_OK) {
+    while(RegEnumKeyExW(key, i++, subKeyName, &tmpLength, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
         tmpLength = sizeof(subKeyName)/sizeof(WCHAR);
 
         /* if its not FLAGS or HELPDIR, then we must keep the rest of the key */




More information about the wine-cvs mailing list