Esta función no es más que una forma recursiva que tiene la API de Windows para utilizar RegOpenKeyEx, RegEnumKeyEx (Aún no documentada aquí en Wiki) y RegDeleteKeyEx con el objetivo de abrir una Clave indicada en la función, enumerar todas las sub-claves que tenga y eliminarlas una por una junto con sus respectivos Valores de Registro. Quiere decir que podría utilizar la combinación de las tres para llevar a cabo la operación, o bien llamar a esta función que hará el trabajo fácil y rápido, aunque puede ser necesario, de acuerdo a la clave que se le vaya a eliminar sub-claves, utilizar de todas formas la función RegOpenKeyEx. Windows internamente utiliza estas funciones cuando se está trabajando desde el Editor de Registro. Esta función es la que se debe utilizar cuando queramos borrar todo un árbol de sub-claves, ya que RegDeleteKeyEx vista en otro artículo de Wiki, solo permite borrar una sola sub-clave indicada con todos sus valores.
Esta función es realmente sencilla de utilizar, y solo requiere dos variables: HKEY hKey: Siempre representa el apuntador a una clave de registro que se haya abierto con RegCreateKeyEx o RegOpenKeyEx, aunque también puede tomarse alguna de las ramas predefinidas: HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS Si se utiliza RegCreateKeyEx o RegOpenKeyEx, tendríamos que usar la variable declarada de phkResult que tiene el apuntador a toda la clave. LPCTSTR lpSubKey: Para esta variable es necesario indicarle cuál es el nombre exacto de la clave a la que se le eliminarán todas las sub-claves. Por ejemplo, si deseamos eliminar todo lo que esté dentro de MiSubClave, ubicada en HKEY_CURRENT_USER\MiClave, la declararíamos como: "MiSubClave", pues hKey tendría el retorno de HKEY_CURRENT_USER\MiClave.
Para ver en acción esta función como corresponde, supongamos que tenemos una clave sub-clave llamada APrincipal en HKEY_CURRENT_USER, y dentro de esta tenemos a la vez dos sub-claves más llamadas Borrar y NoBorrar. Dentro de borrar existe una última sub-clave denominada BorrarA y tiene un valor de tipo DWORD llamado ValorABorrar. La siguiente imagen ilustra un poco lo explicado anteriormente: Nota: Lo ideal es que creen las claves y valores para hacer las pruebas. Como el proceso siempre es Abrir > Eliminar, tenemos que abrir la clave HKEY_CURRENT_USER\APrincipal y eliminar todo el árbol que tenga la sub-clave Borrar. Las declaraciones, según lo explicado anteriormente, y de acuerdo a lo que ya escribí en el artículo dedicado a RegOpenKeyEx, quedarían así:
//Declaración para RegOpenKeyEx
HKEY
hKey = HKEY_CURRENT_USER;
LPCTSTR
lpSubKey = L
"APrincipal"
;
DWORD
ulOptions = 0;
//samDesired debe tener estos permisos para poder borrar sub-claves y valores:
REGSAM samDesired = DELETE | KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE;
phkResult;
//Declaración para RegDeleteTree
lpSubKey2 = L
"Borrar"
long
R2;
//Es necesario hKey, pero ya está declarada por RegOpenKeyEx
//Abriendo la clave
R1 = RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, &phkResult);
switch
(R1)
{
case
ERROR_SUCCESS:
R2 = RegDeleteTree(phkResult, lpSubKey2);
if
(R2 == ERROR_SUCCESS)
MessageBox(NULL, L
"Se abrió la clave, y se eliminó el árbol."
,
L
"Explorando la API"
, MB_ICONEXCLAMATION);
}
else
(R2 == ERROR_ACCESS_DENIED)
"Se abrió la clave, pero hay acceso denegado."
(R2 == ERROR_FILE_NOT_FOUND)
"Se abrió la clave, no se encontró la sub-clave."
"Error eliminando la sub-clave."
break
//Fin del primer case
ERROR_FILE_NOT_FOUND:
"No se encontró la sub-clave."
//Fin del segundo case
ERROR_ACCESS_DENIED:
"Error, Acceso Denegado."
//Fin del tercer case
default
:
"Error abriendo la sub-clave."
//Fin del último case
//Fin del switch