Module: wine Branch: master Commit: 50a18ca57e595801e0ccfa6be0a5494bfc0f0623 URL: http://source.winehq.org/git/wine.git/?a=commit;h=50a18ca57e595801e0ccfa6be0...
Author: Dmitry Timoshkov dmitry@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 */ }