Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

Deleting a Key with Subkeys

The example in this topic uses the RegOpenKeyEx, RegEnumKeyEx, and RegDeleteKey functions to delete a registry key with subkeys.

To test this example, create the following registry key by using Regedt32.exe, and then add a few values and subkeys:

HKEY_CURRENT_USER\Software\TestDir

After running the code, use the F5 key to refresh the registry data, and notice that the TestDir key is deleted.

#include <windows.h>
#include <stdio.h>
#include <strsafe.h>

//*************************************************************
//
// RegDelnodeRecurse()
//
// Purpose: Deletes a registry key and all its subkeys / values.
//
// Parameters: hKeyRoot - Root key
// lpSubKey - SubKey to delete
//
// Return: TRUE if successful.
// FALSE if an error occurs.
//
//*************************************************************

BOOL RegDelnodeRecurse (HKEY hKeyRoot, LPTSTR lpSubKey)
{
 LPTSTR lpEnd;
 LONG lResult;
 DWORD dwSize;
 TCHAR szName[MAX_PATH];
 HKEY hKey;
 FILETIME ftWrite;

 // First, see if we can delete the key without having
 // to recurse.

 lResult = RegDeleteKey(hKeyRoot, lpSubKey);

 if (lResult == ERROR_SUCCESS) 
 return TRUE;

 lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);

 if (lResult != ERROR_SUCCESS) 
 {
 if (lResult == ERROR_FILE_NOT_FOUND) {
 printf("Key not found.\n");
 return TRUE;
 } 
 else {
 printf("Error opening key.\n");
 return FALSE;
 }
 }

 // Check for an ending slash and add one if it is missing.

 lpEnd = lpSubKey + lstrlen(lpSubKey);

 if (*(lpEnd - 1) != TEXT('\\')) 
 {
 *lpEnd = TEXT('\\');
 lpEnd++;
 *lpEnd = TEXT('\0');
 }

 // Enumerate the keys

 dwSize = MAX_PATH;
 lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
 NULL, NULL, &ftWrite);

 if (lResult == ERROR_SUCCESS) 
 {
 do {

 *lpEnd = TEXT('\0');
 StringCchCat(lpSubKey, MAX_PATH * 2, szName);

 if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
 break;
 }

 dwSize = MAX_PATH;

 lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
 NULL, NULL, &ftWrite);

 } while (lResult == ERROR_SUCCESS);
 }

 lpEnd--;
 *lpEnd = TEXT('\0');

 RegCloseKey (hKey);

 // Try again to delete the key.

 lResult = RegDeleteKey(hKeyRoot, lpSubKey);

 if (lResult == ERROR_SUCCESS) 
 return TRUE;

 return FALSE;
}

//*************************************************************
//
// RegDelnode()
//
// Purpose: Deletes a registry key and all its subkeys / values.
//
// Parameters: hKeyRoot - Root key
// lpSubKey - SubKey to delete
//
// Return: TRUE if successful.
// FALSE if an error occurs.
//
//*************************************************************

BOOL RegDelnode (HKEY hKeyRoot, LPCTSTR lpSubKey)
{
 TCHAR szDelKey[MAX_PATH*2];

 StringCchCopy (szDelKey, MAX_PATH*2, lpSubKey);
 return RegDelnodeRecurse(hKeyRoot, szDelKey);

}

int __cdecl main()
{
 BOOL bSuccess;

 bSuccess = RegDelnode(HKEY_CURRENT_USER, TEXT("Software\\TestDir"));

 if(bSuccess)
 printf("Success!\n");
 else printf("Failure.\n");

 return 0;
}

Feedback

Was this page helpful?

Additional resources