shlwapi: Unify SHDeleteKeyW implementation with SHDeleteKeyA.

This commit is contained in:
Dmitry Timoshkov 2006-11-10 18:57:27 +08:00 committed by Alexandre Julliard
parent 75dd3534f9
commit 50a18ca57e
2 changed files with 9 additions and 10 deletions

View File

@ -503,9 +503,7 @@ static BOOL do_typelib_reg_key(GUID *uid, WORD maj, WORD min, LPCWSTR base, BOOL
if (remove) if (remove)
{ {
todo_wine {
ok(SHDeleteKeyW(HKEY_CLASSES_ROOT, buf) == ERROR_SUCCESS, "SHDeleteKey failed\n"); ok(SHDeleteKeyW(HKEY_CLASSES_ROOT, buf) == ERROR_SUCCESS, "SHDeleteKey failed\n");
}
return TRUE; return TRUE;
} }

View File

@ -1553,7 +1553,7 @@ DWORD WINAPI SHDeleteKeyA(HKEY hKey, LPCSTR lpszSubKey)
*/ */
DWORD WINAPI SHDeleteKeyW(HKEY hKey, LPCWSTR lpszSubKey) 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; WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
HKEY hSubKey = 0; HKEY hSubKey = 0;
@ -1562,8 +1562,8 @@ DWORD WINAPI SHDeleteKeyW(HKEY hKey, LPCWSTR lpszSubKey)
dwRet = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey); dwRet = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
if(!dwRet) if(!dwRet)
{ {
/* Find how many subkeys there are */ /* Find the maximum subkey length so that we can allocate a buffer */
dwRet = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, &dwKeyCount, dwRet = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
&dwMaxSubkeyLen, NULL, NULL, NULL, NULL, NULL, NULL); &dwMaxSubkeyLen, NULL, NULL, NULL, NULL, NULL, NULL);
if(!dwRet) if(!dwRet)
{ {
@ -1576,15 +1576,16 @@ DWORD WINAPI SHDeleteKeyW(HKEY hKey, LPCWSTR lpszSubKey)
dwRet = ERROR_NOT_ENOUGH_MEMORY; dwRet = ERROR_NOT_ENOUGH_MEMORY;
else else
{ {
/* Recursively delete all the subkeys */ while (dwRet == ERROR_SUCCESS)
for(i = 0; i < dwKeyCount && !dwRet; i++)
{ {
dwSize = dwMaxSubkeyLen; dwSize = dwMaxSubkeyLen;
dwRet = RegEnumKeyExW(hSubKey, i, lpszName, &dwSize, NULL, NULL, NULL, NULL); dwRet = RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL, NULL, NULL, NULL);
if(!dwRet) if (dwRet == ERROR_SUCCESS || dwRet == ERROR_MORE_DATA)
dwRet = SHDeleteKeyW(hSubKey, lpszName); dwRet = SHDeleteKeyW(hSubKey, lpszName);
} }
if (dwRet == ERROR_NO_MORE_ITEMS)
dwRet = ERROR_SUCCESS;
if (lpszName != szNameBuf) if (lpszName != szNameBuf)
HeapFree(GetProcessHeap(), 0, lpszName); /* Free buffer if allocated */ HeapFree(GetProcessHeap(), 0, lpszName); /* Free buffer if allocated */
} }