Dmitry Timoshkov : shlwapi: Unify SHDeleteKeyW implementation with SHDeleteKeyA.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Nov 10 07:44:38 CST 2006


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

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Fri Nov 10 18:57:27 2006 +0800

shlwapi: Unify SHDeleteKeyW implementation with SHDeleteKeyA.

---

 dlls/oleaut32/tests/typelib.c |    2 --
 dlls/shlwapi/reg.c            |   17 +++++++++--------
 2 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 44b53d6..baeb370 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -503,9 +503,7 @@ static BOOL do_typelib_reg_key(GUID *uid
 
     if (remove)
     {
-todo_wine {
         ok(SHDeleteKeyW(HKEY_CLASSES_ROOT, buf) == ERROR_SUCCESS, "SHDeleteKey failed\n");
-}
         return TRUE;
     }
 
diff --git a/dlls/shlwapi/reg.c b/dlls/shlwapi/reg.c
index 331f84a..3cec25c 100644
--- a/dlls/shlwapi/reg.c
+++ b/dlls/shlwapi/reg.c
@@ -1553,7 +1553,7 @@ DWORD WINAPI SHDeleteKeyA(HKEY hKey, LPC
  */
 DWORD WINAPI SHDeleteKeyW(HKEY hKey, LPCWSTR lpszSubKey)
 {
-  DWORD dwRet, dwKeyCount = 0, dwMaxSubkeyLen = 0, dwSize, i;
+  DWORD dwRet, dwMaxSubkeyLen = 0, dwSize;
   WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
   HKEY hSubKey = 0;
 
@@ -1562,8 +1562,8 @@ DWORD WINAPI SHDeleteKeyW(HKEY hKey, LPC
   dwRet = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
   if(!dwRet)
   {
-    /* Find how many subkeys there are */
-    dwRet = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, &dwKeyCount,
+    /* Find the maximum subkey length so that we can allocate a buffer */
+    dwRet = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
                              &dwMaxSubkeyLen, NULL, NULL, NULL, NULL, NULL, NULL);
     if(!dwRet)
     {
@@ -1576,15 +1576,16 @@ DWORD WINAPI SHDeleteKeyW(HKEY hKey, LPC
         dwRet = ERROR_NOT_ENOUGH_MEMORY;
       else
       {
-        /* Recursively delete all the subkeys */
-        for(i = 0; i < dwKeyCount && !dwRet; i++)
+        while (dwRet == ERROR_SUCCESS)
         {
           dwSize = dwMaxSubkeyLen;
-          dwRet = RegEnumKeyExW(hSubKey, i, lpszName, &dwSize, NULL, NULL, NULL, NULL);
-          if(!dwRet)
+          dwRet = RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL, NULL, NULL, NULL);
+          if (dwRet == ERROR_SUCCESS || dwRet == ERROR_MORE_DATA)
             dwRet = SHDeleteKeyW(hSubKey, lpszName);
         }
-
+        if (dwRet == ERROR_NO_MORE_ITEMS)
+          dwRet = ERROR_SUCCESS;
+    
         if (lpszName != szNameBuf)
           HeapFree(GetProcessHeap(), 0, lpszName); /* Free buffer if allocated */
       }




More information about the wine-cvs mailing list