Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Borrar Clave Y Subclave Del Regedit De Windows (https://www.clubdelphi.com/foros/showthread.php?t=89317)

cavdrz 31-10-2015 21:47:02

Borrar Clave Y Subclave Del Regedit De Windows
 
HOla como están, veran mi duda es que si alguién sabe como se puede eliminar desde delphi una rama del registro con varias subclaves (HKEY_LOCAL_MACHINE\SOTWARE\1\2\3), esto es lo que tengo, pero no me funciona cuando hay varias subclaves, solo si hay una si me la elimina:

Código Delphi [-]
function DeleteRegistryKey(const RootKey: HKEY; const Key: String): Boolean; 
var Handle : HKEY;     
K, N   : String; 
begin   
  SplitRegName(Key, K, N);   
  if RegOpenKeyEx(RootKey, PChar(K), 0, KEY_WRITE or KEY_WOW64_64KEY, Handle) = ERROR_SUCCESS then     
  begin       
    Result := RegDeleteKey(Handle, Pointer(N)) = ERROR_SUCCESS;       
    RegCloseKey(Handle);     
  end else     
    Result := False; 
end;
espero que me puedan ayudar, gracias.

luisito12382 01-11-2015 00:53:00

elimina el boolean y ponle string aver si funciona

cavdrz 01-11-2015 02:43:57

Gracias por responder, fijate que lo hice pero me tira un error de compilación (AnsiString), espero que me puedan dar soporte, estoy empezando con este potente lenguaje.

Casimiro Notevi 01-11-2015 09:43:05

¿Qué devuelve en Result?

dec 01-11-2015 11:44:59

Hola,

Igual no tienes permisos para borrar claves en la raíz "LOCAL_MACHINE", puesto que, si no me equivoco, necesitas permisos de "administrador". Por otro lado, hace poco me topé con un problema en cierto proyecto que usaba, directamente, las funciones "RegOpenKeyEx" del API de Windows. Dicho problema lo solucioné usando la clase "TRegistry" que incluye Delphi. En fin, igual esto te sirve de algo...

ecfisa 01-11-2015 18:09:13

Hola cavdrz.

Revisa si te funciona la propuesta del mensaje #4 de este enlace: How to delete a registry key (and its subkey/values) under Windows NT?

Saludos :)

escafandra 01-11-2015 20:27:54

Sobre la función que ya tienes basada en API y no en TRegistry, vamos a enumerar las subclaves posibles y borrarlas todas en una función recursiva:

Código Delphi [-]
function DeleteRegistryKey(const RootKey: HKEY; const Key: String): Boolean;
var
  Handle : HKEY;
  Subkey: array[0..255] of CHAR;
  PathKey: String;
  Index: integer;
begin
  Result := False;
  if RegOpenKeyEx(RootKey, PChar(Key), 0, KEY_ALL_ACCESS or KEY_WOW64_64KEY, Handle) = ERROR_SUCCESS then
  begin
    Index:= 0;
    while ERROR_SUCCESS = RegEnumKey(Handle, Index, @Subkey[0], sizeof(Subkey)-1) do
    begin
      PathKey:= Key + '\' + String(Subkey);
      DeleteRegistryKey(RootKey, PathKey);
      inc(Index);
    end;
    RegCloseKey(Handle);
    if RegOpenKeyEx(RootKey, PChar(ExtractFilePath(Key)), 0, KEY_ALL_ACCESS or KEY_WOW64_64KEY, Handle) = ERROR_SUCCESS then
    begin
      Result := RegDeleteKey(Handle, PCHAR(ExtractFileName(Key))) = ERROR_SUCCESS;
      RegCloseKey(Handle);
    end;
  end else
    Result := False;
end;


Saludos.

cavdrz 07-11-2015 00:29:28

Gracias por responder, tenias la razón con la nueva función que me diste, funciona a la perfección, gracias. ^\||/

escafandra 08-11-2015 00:57:41

cavdrz, no te pregunté por el S.O. que usas así que modifiqué la función para que trabajara desde XP.
En el caso de Vista en adelante puedes usar la API RegDeleteTree, hace lo mismo con un código de una sola función, pero ojo, tu programa no funcionará en WinXP.


Saludos.


La franja horaria es GMT +2. Ahora son las 05:43:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi