Esta es realmente una función muy sencilla de utilizar, pero por supuesto demasiado útil, pues se encarga de eliminar una sub-clave especificada, pero a la vez todos los valores que se hayan creado. Nota: Es de vital importancia saber que esta función sólo eliminará una sub-clave especificada y todos sus valores, pero si existe otra sub-clave habrá acceso denegado, pues para borrar todo un árbol, es necesario hacer uso de la función RegDeleteTree que describiré en otro artículo. La declaración que presenta la documentación oficial es la siguiente: HKEY hKey: Como siempre, es un tipo de apuntador a alguna clave que se encuentre abierta, ese apuntador lo debe retornar RegOpenKeyEx, RegCreateKeyEx, o utilizar algunas de las claves que se encuentran predefinidas en Windows:
Para poder ver esto un poco más allá de la simple documentación, y además para que cobre valor la función de RegOpenKeyEx visto en otro artículo de Wiki, pondremos como caso de uso una sub-clave de registro llamada DemoKey\Key, que pertenece a la clave de HKEY_CURRENT_USER. Básicamente, si la sub-clave existe y se puede abrir (Comprobándolo con RegOpenKeyEx), se procederá a eliminar, de lo contrario, se indicará un mensaje de error sencillo. La ruta completa de la sub-clave sería: HKEY_CURRENT_USER\DemoKey\Key Antes que nada, como siempre habría que crear el Proyecto de Win32 vacío, agregar el .cpp del código fuente y declarar el encabezado y función principal:
#include <Windows.h>
int
WINAPI WinMain(
HINSTANCE
hInstance,
hPrevInstance,
LPSTR
lpCmdLine,
nCmdShow){
}
//Fin del método principal
long
R2;
//Declaración para las dos funciones
HKEY
hKey = HKEY_CURRENT_USER;
LPCTSTR
lpSubKey = L
"DemoKey\\Key"
;
//Declaración de variables para RegOpenKeyEx
DWORD
ulOptions = 0;
REGSAM samDesired = KEY_READ | KEY_WRITE;
phkResult;
//Declaración de variables para RegDeleteKeyEx
REGSAM samDesired2 = KEY_WOW64_32KEY;
Rererved = 0;
R1= RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, &phkResult);
switch
(R1)
//Inicia el switch con el resultado de R1 (RegOpenKeyEx)
{
case
ERROR_SUCCESS:
//Si la sub-clave se abre.
//Se llama a la función RegDeleteKeyEx para eliminar la sub-clave
R2 = RegDeleteKeyEx(hKey, lpSubKey, samDesired2, Reserved);
if
(R2 == ERROR_SUCCESS)
//Si se elimina la sub-clave
MessageBox(NULL, L
"Se abrió y se eliminó la sub-clave."
, L
"Explorando la API"
, MB_OK | MB_ICONINFORMATION);
else
(R2 == ERROR_ACCESS_DENIED)
//Si hay acceso denegado al eliminar la sub-clave
"Se abrió la clave, pero hubo acceso denegado al eliminarla."
//Cualquier otro error no contemplado.
"Se abrió la clave, pero no se pudo eliminar."
break
//Cierra primer case
ERROR_FILE_NOT_FOUND:
//Si no se encuentra la sub-clave
"No se encontró la clave."
, MB_ICONERROR);
//Cierra segundo case
ERROR_ACCESS_DENIED:
//Si hay acceso denegado al abrir la sub-clave
"Acceso denegado"
//Fin del tercer case
default
:
//Otro error no contemplado al abrir la sub-clave
"Error al abrir la clave"
//Fin del default
//Fin del switch
//Cerrar la operación en la sub-clave
RegCloseKey(phkResult);