Manipulando o registro do Windows

Started by Dark_Side, 10 de December , 2006, 09:27:49 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

Hi,

No artigo de hoje, veremos como manipular o registro do windows utilizando o Delphi. Geralmente, utilizamos as funções: RegOpenKey, RegCreateKey, RegSetValue, RegSetValue, RegDeleteKey, RegDeleteValue, RegCloseKey e suas variantes e extensões para realizar tarefas básicas no registro, tais como, criar ou deletar uma chave, adicionar ou modificar um valor, dentre outras.
Estas funções fazem parte da API do Windows. No Delphi, entretanto, temos uma maneira muito mais fácil e rápida de manipular o registro - utilizando o componente TRegistry.

Mas afinal, o que é esse registro do Windows?

Basicamente, poderíamos dizer que o registro do Windows é um local onde temos toda a configuração do sistema operacional. Seria como arquivos .INI, onde temos determinadas seções, chaves e valores. Porém, no registro do Windows, acessamos estes valores como se estivéssimos trabalhando com pastas - afinal, as chaves são mostradas como pastas.

Você pode ter uma idéia maior executando o editor de registro:

1) Vá até o menu iniciar » executar;
2) Digite "regedit.exe" e dê OK.

Na parte esquerda da janela há as chaves principais:

QuoteHKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG

Se você explorar qualquer uma destas chaves, verá que existem outras subpastas e ,notará ainda que, à direita, são mostrados o nome, tipo e valor para cada subchave.

Uma observação importante a ser feita é que devemos tomar muito cuidado ao manipular dados do registro, uma vez em que, alterando um ou mais valores vitais do sistema, você pode comprometer o seu funcionamento.

Após uma breve introdução, partiremos para a prática =)

Antes de podermos manipular o registro, é necessário incluir a unit "Registry" na cláusula Uses:

Quote// Note que as units inicias foram mantidas =)
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Registry;
Agora sim podemos continuar ;)?

Após criar a subchave, liberamos a instância criada:
reg.Free;

2)

Utilizando o método OpenKey:

procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Minha Chave',True);
reg.CloseKey();
reg.Free;
end;
Veja o método utilizado:

reg.OpenKey('Minha Chave',True);

Acima, o programa tenta abrir a chave "Minha Chave" dentro de "HKEY_CURRENT_USER".Há um pequeno detalhe: se a chave não existir ele é criada. Vamos entender isso melhor analisando a sintaxe da função:
Quotereg.OpenKey(NOME_CHAVE,CRIAR);

   NOME_CHAVE:
       nome da chave que se deseja abrir;

   CRIAR:
       é um valor BOOL, isto é, FALSE ou TRUE. Se FALSE, caso a chave não exista, ela não será criada, se TRUE, a chave será criada caso não exista.
Observando a sintaxe vemos que, como o segundo parâmetro foi passado como 'True', a chave seria criada =)

Uma observação a ser feita é que, para podermos trabalhar com valores dentro de uma chave, deve-se abri-la previamente através de OpenKey. Portanto, é mais simples utilizar este método mesmo quando formos criar uma chave, uma vez em que esta é criada e aberta de uma só vez =)

Após realizar as devidas tarefas com uma chave do registro, devemos fechá-la:

reg.CloseKey();
O método fecha a chave atual aberta, no caso, Minha Chave.


Ainda trabalhando com a chave 'Minha Chave', veremos como criar um simples valor:

procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Minha Chave',True); // Abrimos (e criamos se necessário) a chave

// Escrevemos o valor 'Valor1' dentro da chave tendo 'LOL' como conteúdo;
reg.WriteString('Valor1','LOL');
reg.CloseKey();
reg.Free;
end;


A sintaxe básica seria:
Quotereg.WriteString(NOME_VALOR,CONTEUDO);

   NOME_VALOR:
       nome do valor a ser inserido;

   CONTEUDO:
       dados do valor.

Se você reparar bem, o método utilizado foi WriteString, ou seja, iremos escrever um valor do tipo string na chave =)

Além de strings, podemos escrever inteiros, floats, valores booleanos, dentre outros.

Exemplo:
procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Minha Chave',True); // Abrimos (e criamos se necessário) a chave

reg.WriteString('Valor String','LOL');
reg.WriteInteger('Valor Inteiro',100);
reg.WriteFloat('Valor Float',10.5);
reg.WriteBool('Valor Bool',FALSE);

reg.CloseKey();
reg.Free;
end;
Bem simples não?

Porém, as notações são diferentes no editor do registro. O que eu quero dizer é que se escrevemos um valor Inteiro na chave, este não irá aparecer como o tipo Integer, necessariamente. Você se lembra que, no início do artigo, me referir ao nome, tipo e dados de um valor?

Pois bem, analise:

reg.WriteString('Valor String','LOL');
QuoteValor String - nome do valor;
LOL - conteúdo do valor (dados)
;)

Para finalizar o artigo, iremos tratar um pouco de validação.


1) Verificando se uma chave existe


procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
if reg.KeyExists('Minha Chave') then // Verifica se a chave 'Minha Chave' existe
  ShowMessage('A chave existe!')
else
  ShowMessage('A chave não existe!');

reg.free;
end;
O método reg.KeyExists() retorna FALSE se uma chave ou subchave não existir, ou TRUE caso exista.

Outro exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
if reg.KeyExists('Minha Chave\LOL') then
  ShowMessage('A chave existe!')
else
  ShowMessage('A chave não existe!');

reg.free;
end;

Desta vez, verificamos se a subchave 'LOL' existe dentro de 'Minha Chave'.


2) Verificando se um valor existe

procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Minha Chave',FALSE);

if reg.ValueExists('Valor1') then
  ShowMessage('O valor existe!')
  else
  ShowMessage('O valor não existe!');

  reg.CloseKey();

reg.free;
end;
O método reg.ValueExists() retorna TRUE se um valor existir, ou FALSE do contrário.


Bem, sei que ficou cansativo mas é isso...
Bye ;)

RC

       Ótimo post dark_side, é uma ótima fonte de estudos para quem vai desenvolver ferramentas que precisam lidar com o registro.
       Continue assim, isso é um incentivo não só para quem está no delphi, mas em outras linguagens tb, pq seus posts abrangem também outras linguagens, sua boa vontade em ajudar quem precisa é louvável, sempre que precisei de uma ajuda sua vc sempre esteve disposto a ajudar.
       Não perca essas virtudes kra...
"Procurar informações é o primeiro passo para o conhecimento, compartilha-las é o primeiro passo para a comunidade"
      Vc é uma das poucas pessoas que eu conheço que justificam esse pensamento'.

rox_nxr

"Ae mais uma vez se algum adimin poder excluir minha conta de rox_nxr para que eu possa usar novamente meu nick que tanto me faz falta aki no forúm"

Hacker Xtreme

mto show cara, é uma fonte mto boa de estudos!

DarkGenesis

Nossa Dark_Side como sempre enchendo de excelentes conteúdos o nosso forum, admiro sua dedicação.
Nêm preciso falar que é Ponto Positivo né.  ;D

rodweb

O.O

Mais explicado até que um tuto que eu peguei pra estudar xD

Muito bom cara, parabéns...

Anonymous

Sem comentários!

Excelende dark_side, ótimo tutorial!
Parabéns pelo ponto +!  ;)

Abraços.

Hacker Xtreme

ei dark_side ficou mto rox msm :P tu é foda mano hauahuahuauhahua (n sei nem se posso falar issu hauhauahah)