Implemented SHDeleteEmptyKeyA, SHDeleteKeyA.
This commit is contained in:
parent
3b216de5cd
commit
3112fd2269
|
@ -223,17 +223,78 @@ HRESULT WINAPI SHQueryValueExW (
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* SHDeleteKeyA [SHLWAPI.@]
|
* SHDeleteKeyA [SHLWAPI.@]
|
||||||
|
*
|
||||||
|
* It appears this function is made available to account for the differences
|
||||||
|
* between the Win9x and WinNT/2k RegDeleteKeyA functions.
|
||||||
|
*
|
||||||
|
* According to docs, Win9x RegDeleteKeyA will delete all subkeys, whereas
|
||||||
|
* WinNt/2k will only delete the key if empty.
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI SHDeleteKeyA(
|
HRESULT WINAPI SHDeleteKeyA(
|
||||||
HKEY hkey,
|
HKEY hKey,
|
||||||
LPCSTR pszSubKey)
|
LPCSTR lpszSubKey)
|
||||||
{
|
{
|
||||||
FIXME("hkey=0x%08x, %s\n", hkey, debugstr_a(pszSubKey));
|
DWORD r, dwKeyCount, dwSize, i, dwMaxSubkeyLen;
|
||||||
return 0;
|
HKEY hSubKey;
|
||||||
|
LPSTR lpszName;
|
||||||
|
|
||||||
|
TRACE("hkey=0x%08x, %s\n", hKey, debugstr_a(lpszSubKey));
|
||||||
|
|
||||||
|
hSubKey = 0;
|
||||||
|
r = RegOpenKeyExA(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
|
||||||
|
if(r != ERROR_SUCCESS)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
/* find how many subkeys there are */
|
||||||
|
dwKeyCount = 0;
|
||||||
|
dwMaxSubkeyLen = 0;
|
||||||
|
r = RegQueryInfoKeyA(hSubKey, NULL, NULL, NULL, &dwKeyCount,
|
||||||
|
&dwMaxSubkeyLen, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
if(r != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
RegCloseKey(hSubKey);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* alloc memory for the longest string terminating 0 */
|
||||||
|
dwMaxSubkeyLen++;
|
||||||
|
lpszName = HeapAlloc(GetProcessHeap(), 0, dwMaxSubkeyLen*sizeof(CHAR));
|
||||||
|
if(!lpszName)
|
||||||
|
{
|
||||||
|
RegCloseKey(hSubKey);
|
||||||
|
return ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* recursively delete all the subkeys */
|
||||||
|
for(i=0; i<dwKeyCount; i++)
|
||||||
|
{
|
||||||
|
dwSize = dwMaxSubkeyLen;
|
||||||
|
r = RegEnumKeyExA(hSubKey, i, lpszName, &dwSize, NULL, NULL, NULL, NULL);
|
||||||
|
if(r != ERROR_SUCCESS)
|
||||||
|
break;
|
||||||
|
r = SHDeleteKeyA(hSubKey, lpszName);
|
||||||
|
if(r != ERROR_SUCCESS)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, lpszName);
|
||||||
|
|
||||||
|
RegCloseKey(hSubKey);
|
||||||
|
|
||||||
|
if(r == ERROR_SUCCESS)
|
||||||
|
r = RegDeleteKeyA(hKey, lpszSubKey);
|
||||||
|
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* SHDeleteKeyW [SHLWAPI.@]
|
* SHDeleteKeyW [SHLWAPI.@]
|
||||||
|
*
|
||||||
|
* It appears this function is made available to account for the differences
|
||||||
|
* between the Win9x and WinNT/2k RegDeleteKeyA functions.
|
||||||
|
*
|
||||||
|
* According to docs, Win9x RegDeleteKeyA will delete all subkeys, whereas
|
||||||
|
* WinNt/2k will only delete the key if empty.
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI SHDeleteKeyW(
|
HRESULT WINAPI SHDeleteKeyW(
|
||||||
HKEY hkey,
|
HKEY hkey,
|
||||||
|
@ -242,3 +303,56 @@ HRESULT WINAPI SHDeleteKeyW(
|
||||||
FIXME("hkey=0x%08x, %s\n", hkey, debugstr_w(pszSubKey));
|
FIXME("hkey=0x%08x, %s\n", hkey, debugstr_w(pszSubKey));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* SHDeleteEmptyKeyA [SHLWAPI.@]
|
||||||
|
*
|
||||||
|
* It appears this function is made available to account for the differences
|
||||||
|
* between the Win9x and WinNT/2k RegDeleteKeyA functions.
|
||||||
|
*
|
||||||
|
* According to docs, Win9x RegDeleteKeyA will delete all subkeys, whereas
|
||||||
|
* WinNt/2k will only delete the key if empty.
|
||||||
|
*/
|
||||||
|
DWORD WINAPI SHDeleteEmptyKeyA(HKEY hKey, LPCSTR lpszSubKey)
|
||||||
|
{
|
||||||
|
DWORD r, dwKeyCount;
|
||||||
|
HKEY hSubKey;
|
||||||
|
|
||||||
|
TRACE("hkey=0x%08x, %s\n", hKey, debugstr_a(lpszSubKey));
|
||||||
|
|
||||||
|
hSubKey = 0;
|
||||||
|
r = RegOpenKeyExA(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
|
||||||
|
if(r != ERROR_SUCCESS)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
dwKeyCount = 0;
|
||||||
|
r = RegQueryInfoKeyA(hSubKey, NULL, NULL, NULL, &dwKeyCount,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
if(r != ERROR_SUCCESS)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
RegCloseKey(hSubKey);
|
||||||
|
|
||||||
|
if(dwKeyCount)
|
||||||
|
return ERROR_KEY_HAS_CHILDREN;
|
||||||
|
|
||||||
|
r = RegDeleteKeyA(hKey, lpszSubKey);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* SHDeleteEmptyKeyW [SHLWAPI.@]
|
||||||
|
*
|
||||||
|
* It appears this function is made available to account for the differences
|
||||||
|
* between the Win9x and WinNT/2k RegDeleteKeyA functions.
|
||||||
|
*
|
||||||
|
* According to docs, Win9x RegDeleteKeyA will delete all subkeys, whereas
|
||||||
|
* WinNt/2k will only delete the key if empty.
|
||||||
|
*/
|
||||||
|
DWORD WINAPI SHDeleteEmptyKeyW(HKEY hKey, LPCWSTR lpszSubKey)
|
||||||
|
{
|
||||||
|
FIXME("hkey=0x%08x, %s\n", hKey, debugstr_w(lpszSubKey));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -558,8 +558,8 @@ import kernel32
|
||||||
@ stdcall PathUnquoteSpacesA (str) PathUnquoteSpacesA
|
@ stdcall PathUnquoteSpacesA (str) PathUnquoteSpacesA
|
||||||
@ stdcall PathUnquoteSpacesW (wstr) PathUnquoteSpacesW
|
@ stdcall PathUnquoteSpacesW (wstr) PathUnquoteSpacesW
|
||||||
@ stdcall SHCreateShellPalette(long)SHCreateShellPalette
|
@ stdcall SHCreateShellPalette(long)SHCreateShellPalette
|
||||||
@ stub SHDeleteEmptyKeyA
|
@ stdcall SHDeleteEmptyKeyA(long ptr) SHDeleteEmptyKeyA
|
||||||
@ stub SHDeleteEmptyKeyW
|
@ stdcall SHDeleteEmptyKeyW(long ptr) SHDeleteEmptyKeyW
|
||||||
@ stdcall SHDeleteKeyA(long str) SHDeleteKeyA
|
@ stdcall SHDeleteKeyA(long str) SHDeleteKeyA
|
||||||
@ stdcall SHDeleteKeyW(long wstr) SHDeleteKeyW
|
@ stdcall SHDeleteKeyW(long wstr) SHDeleteKeyW
|
||||||
@ stub SHDeleteOrphanKeyA
|
@ stub SHDeleteOrphanKeyA
|
||||||
|
|
|
@ -122,6 +122,14 @@ void WINAPI PathRemoveBlanksW(LPWSTR lpszPath);
|
||||||
#define PathRemoveBlanks WINELIB_NAME_AW(PathRemoveBlanks)
|
#define PathRemoveBlanks WINELIB_NAME_AW(PathRemoveBlanks)
|
||||||
void WINAPI PathRemoveBlanksAW(LPVOID lpszPath);
|
void WINAPI PathRemoveBlanksAW(LPVOID lpszPath);
|
||||||
|
|
||||||
|
HRESULT WINAPI SHDeleteKeyA(HKEY hKey, LPCSTR lpszSubKey);
|
||||||
|
HRESULT WINAPI SHDeleteKeyW(HKEY hkey, LPCWSTR pszSubKey);
|
||||||
|
#define SHDeleteKey WINELIB_NAME_AW(SHDeleteKey)
|
||||||
|
|
||||||
|
DWORD WINAPI SHDeleteEmptyKeyA(HKEY hKey, LPCSTR lpszSubKey);
|
||||||
|
DWORD WINAPI SHDeleteEmptyKeyW(HKEY hKey, LPCWSTR lpszSubKey);
|
||||||
|
#define SHDeleteEmptyKey WINELIB_NAME_AW(SHDeleteEmptyKey)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif /* defined(__cplusplus) */
|
#endif /* defined(__cplusplus) */
|
||||||
|
|
Loading…
Reference in New Issue