Todo mundo já deve conhecer sobre a manipulação de registros do Windows através do Delphi, então o que eu vou mostrar é um exemplo prático do que você pode fazer.
Conteúdo dessa postagem:
- Listar pastas de uma determinada chave de registro.
- Buscar através de uma lista de pastas, uma pasta com um caracter coringa.
- Verificar existência de uma chave de registro.
- Excluir uma chave de registro.
Antes de mais nada, temos que declarar a biblioteca Registry no projeto.
Conteúdo dessa postagem:
- Listar pastas de uma determinada chave de registro.
- Buscar através de uma lista de pastas, uma pasta com um caracter coringa.
- Verificar existência de uma chave de registro.
- Excluir uma chave de registro.
Antes de mais nada, temos que declarar a biblioteca Registry no projeto.
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, Registry;
Já declarada, você poderá manipular variáveis do tipo TRegistry, vou colocar a procedure inteira mas você pode parametrizar ela conforme a sua necessidade.
A procedure abaixo apaga um determinado registro fixo no programa, mas o problema é que a primeira chave é variável, ou seja, não tem como passar um caminho fixo para excluir o registro.
A solução foi executar um loop, buscando pelo caracter coringa, até encontrar o registro a excluir.
Raiz: HKEY_USERS
Chave: S-1-5-21-xxxxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xxxx\Software\SimonTatham\putty\SshHostKeys\
onde xxxxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xxxx é variável de computador para computador.
procedure ApagaRegistrosWindows;
var i : integer;
RegWin : TRegistry;
achou, fim : boolean;
Chaves : TStringList;
begin
RegWin := TRegistry.Create; // Chama o construtor do objeto
RegWin.RootKey := HKEY_USERS; // seta raiz do registro
Chaves := TStringList.Create; // cria uma stringlist para referência
RegWin.OpenKey('', False); // abre a pasta da raiz caso exista
RegWin.GetKeyNames(Chaves); // associa as pastas para a stringlist
// inicializa variáveis
i := 0;
achou := false;
fim := false;
while ((not achou) and (not fim)) do
begin
// busca a chave que contém 'S-1-5-21' e não contenha a palavra 'Classes'
if ((Pos('S-1-5-21', Chaves.Strings[i]) > 0) and (Pos('Classes', Chaves.Strings[i]) = 0)) then
achou := true
else if i = Chaves.Count-1 then // se estiver no último registro, termina
fim := true
else Inc(i); // se não encontrar, incrementa o contador
end;
if achou = true then
begin
// facilitando a vida do programador
Chaves.Strings[i] := Chaves.Strings[i] + '\Software\SimonTatham\PuTTY\SshHostKeys';
// verifica se o registro existe
if RegWin.KeyExists(Chaves.Strings[i]) then
RegWin.DeleteKey(Chaves.Strings[i]); // apaga o registro se existir
end;
RegWin.CloseKey; // Fecha a chave e o objeto
RegWin.Free; // Libera o registro da memória
Chaves.Free; // Libera a stringList da memória
end;