Ir al contenido


Foto

Borrar claves del registro de Windows.


  • Por favor identifícate para responder
2 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 06 noviembre 2015 - 06:00

Hicieron esta pregunta en CD y me parece interesante dejar aquí mi respuesta.

 

La API de Windows dispone de la función RegDeleteKey para realizar esa tarea, pero tiene un detalle, no borrará una clave si existe una subclave y era esto lo que originaba la cuestión. La solución es sencilla, buscar todas las subclaves del arbol y borrarlas, Así que eso hice en una función recursiva:


delphi
  1. function DeleteRegistryKey(const RootKey: HKEY; const Key: String): Boolean;
  2. var
  3. Handle : HKEY;
  4. Subkey: array[0..255] of CHAR; // las claves no pueden extenderse más allá de 256 caracteres.
  5. PathKey: String;
  6. Index: integer;
  7. begin
  8. Result := False;
  9. if RegOpenKeyEx(RootKey, PChar(Key), 0, KEY_ALL_ACCESS or KEY_WOW64_64KEY, Handle) = ERROR_SUCCESS then
  10. begin
  11. Index:= 0;
  12. while ERROR_SUCCESS = RegEnumKey(Handle, Index, @Subkey[0], sizeof(Subkey)-1) do
  13. begin
  14. PathKey:= Key + '\' + String(Subkey);
  15. DeleteRegistryKey(RootKey, PathKey);
  16. inc(Index);
  17. end;
  18. RegCloseKey(Handle);
  19. if RegOpenKeyEx(RootKey, PChar(ExtractFilePath(Key)), 0, KEY_ALL_ACCESS or KEY_WOW64_64KEY, Handle) = ERROR_SUCCESS then
  20. begin
  21. Result := RegDeleteKey(Handle, PCHAR(ExtractFileName(Key))) = ERROR_SUCCESS;
  22. RegCloseKey(Handle);
  23. end;
  24. end else
  25. Result := False;
  26. end;

Espero que os sirva de algo.

 

 

Saludos.


  • 1

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 06 noviembre 2015 - 09:07

Hola, muy interesante el asunto de borrar claves, pero yo tengo un detalle, antes de borrar algo del registro suelo hacer un respaldo de la llave.

Hay alguna función que haga una copia antes de borrar?

Saludos.
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 07 noviembre 2015 - 05:40

Hola, muy interesante el asunto de borrar claves, pero yo tengo un detalle, antes de borrar algo del registro suelo hacer un respaldo de la llave.

Hay alguna función que haga una copia antes de borrar?

Saludos.

Si. Tienes las APIs RegSaveKey y RegSaveKeyEx
 
El truco anterior esta centrado en Versiones anteriores a Vista, desde Vista tenemos RegDeleteTree que hace lo mismo de forma recursiva pero sin más código que la API:

 

delphi
  1. function RegDeleteTreeA(Key: HKEY; SubKey: PCHAR): DWORD; stdcall; external 'Advapi32.dll';
  2.  
  3. RegDeleteTreeA(HKEY_CURRENT_USER, 'MyClave');


Usando la unit que publiqué aquí para escanear el registro, puedes sacar las claves y valores en modo texto. Esa Unit enumera claves y valores. con variaciones de ese código se puede hacer una función que genere un archivo similar a los que exporta regedit.
 
Saludos.
  • 1




IP.Board spam blocked by CleanTalk.