|
indice
|
|
El Registro de Windows
Qué es
Su estructura, cómo leerlo y modificarlo
con regedit
Cómo leerlo y modificarlo con Delphi
|
«
el registro de windows »
|
|
qué es
|
|
El Registro es una gran base de datos utilizada para
almacenar las configuraciones y opciones para las versiones
de Microsoft Windows de 32 bits que incluyen al Windows 95,
98, ME y NT/2000. En otras palabras, el Registro contiene información
sobre la configuración para todo el hardware, software, usuarios
y preferencias de tu PC. Siempre que un usuario realice modificaciones
a las opciones del Panel de Control, o asociaciones de archivos,
o agregue o quite un programa, etc. los cambios se verán reflejados
en el Registro.
Los archivos que constituyen esta gran base de datos
están almacenados en forma diferente dependiendo de la versión de
Windows que tengas instalada, bajo Windows 95 y 98 se encuentra
almacenada en 2 archivos ocultos en el directorio Windows, llamados
USER.DAT y SYSTEM.DAT, para Windows ME se agrega un archivo más
llamado CLASSES.DAT, mientras que bajo Windows NT/2000 los archivos
se encuentran almacenados en el directorio System32\Config. Sin
embargo, no es posible modificar estos archivos directamente, para
ello debes utilizar una herramienta conocida como el "Editor
del Registro" o "Regedit".
Nota: Puedes
ejecutar a c:\windows\regedit.exe desde Inicio -> Ejecutar y
escribiendo simplemente "regedit", sin tener que ir a
"Examinar..." y decirle donde se encuentra el ejecutable.
Este tip sirve no solamente para regedit si no también para todos
los archivos que se encuentran en el directorio Windows. Por ejemplo,
"scandskw" abre el scandisk.
Antes de continuar, te recomiendo que ejecutes regedit,
y sin modificar nada por ahora, comiences a ambientarte con el programa.
|
|
su estructura, como
leerlo y modificarlo con regedit
|
|
El Registro, como te habrás dado cuenta, tiene una
estructura jerárquica, y aunque parezca complicada es similar a
la estructura de los directorios en tu disco duro, siendo Regedit
similar al Windows Explorer.
Al abrir Regedit lo primero con lo que nos encontramos
son 6 grandes ramas. Antes de curiosear y ver que "datos ocultos"
hay en este infinito árbol veamos rápidamente que tipo de información
se almacena en cada una de estas ramas.
-
HKEY_CLASSES_ROOT - Esta rama contiene toda la
información relacionada con las asociaciones de archivos (por
ejemplo, con que programa debe Windows abrir los archivos .TXT,
.JPG, etc.). Además contiene también información relacionada
con OLE, los accesos directos, y aspectos fundamentales de la
interfase de Windows.
-
HKEY_CURRENT_USER - Esta rama contiene enlaces
a la sección de HKEY_USERS apropiada para el usuario actual
del sistema y contiene información tal como nombre de usuario,
configuración del escritorio y configuración del menú Start.
-
HKEY_LOCAL_MACHINE - Esta rama contiene información
sobre tu computadora relacionada con el tipo de hardware, software
y otras preferencias. Esta información es utilizada para todos
los usuarios que ingresen a Windows desde esa computadora.
-
HKEY_USERS - Esta rama contiene preferencias
individuales para cada usuario, que está representado por una
sub-key SID localizada bajo la rama principal.
-
HKEY_CURRENT_CONFIG - Esta rama contiene enlaces
a la sección de HKEY_LOCAL_MACHINE apropiada para la configuración
actual del hardware.
-
HKEY_DYN_DATA - Esta rama apunta a la parte de
HKEY_LOCAL_MACHINE apropiada para la configuración del Plug-&-Play.
Esta sección es dinámica y cambiará a medida que se agreguen
o quiten dispositivos al sistema (mouse, teclado, micrófono,
joystick, etc).
Cada una de estas ramas principales tiene "sub-ramas"
llamadas Claves (Keys). Cada clave, a su vez, puede contener sub-claves,
así como también Valores o Values. Para ser bien gráficos veamos
un ejemplo. Abre la rama HKEY_CURRENT_USER,
luego abre la clave Software. Una vez
allí verás una larga lista de claves
(dentro de Software, por supuesto). ¿Sorprendido de encontrar los
nombres de la mayoría de los fabricantes de los programas que tienes
instalados, e inclusive de algunos que ya has desinstalado, mencionados
en esta lista? Bueno, no te sorprendas tanto, muy pronto tu también
podrás figurar allí.
Hasta aquí vimos cómo acceder a las ramas y las claves,
pero ¿qué hay de los valores? Siguiendo con nuestra expedición por
la clave Software si sigues adentrándote
un poco más podrás llegar a la clave
"HKEY_CURRENT_USER\Software\Microsoft\Notepad". Una vez
allí se listarán a tu derecha todos los diferentes valores
almacenados en esta clave. En mi caso
estos son: "fSavePageSettings", "fUseDefaultPrinterFont",
"fWrap", etc. todos de tipo DWORD menos "lfFaceName"
que es de tipo string.
Estos valores son los que contienen la información
que se almacena en el Registro. Existen 3 tipos de valores: string,
binary y DWORD. Sin embargo, cómo veremos más adelante, no trataremos
con estos tipos de datos, ya que Delphi realiza a nuestras espaldas
todas las conversiones necesarias para que trabajemos con los tipos
de datos con los que venimos trabajando siempre: Integer, String,
Float, TDateTime, Currency, Boolean, etc.
Para modificar un valor sólo debes hacer doble clic
sobre su nombre. En cambio, para agregar un nuevo valor basta con
presionar el botón derecho y elegir "Nuevo", por supuesto,
nos preguntarán que tipo de valor queremos crear, lo elegimos y
le asignamos el valor que deseamos.
En definitiva, la relación entre ramas, claves y
valores es muy parecida a la de las unidades, los directorios y
los archivos. Los valores/archivos (son la información misma), las
claves/directorios (van construyendo las rutas donde podrás encontrar
la información) y las ramas/unidades (son los "nudos"
principales donde se encuentra almacenada la información).
Uff! ya sabemos cómo agregar claves y valores y cómo
modificar los valores, lo único que no sabemos es qué modificar
o qué claves y valores podemos agregar. Esto aunque parezca algo
secundario es fundamental. El Registro, nunca viene mal recordarlo,
es el engranaje de Windows. Si falla el Registro y no tienes una
copia hecha ... chau Windows ... ¿conoces el famoso: "estoy
reinstalando Windows. Bill Gates y la gran..."?. Es por ello
que aunque, en general, las modificaciones que tenderás a hacer
no harán que falle el Registro siempre hay que tener cautela y cada
modificación que realicemos aquí debe ser estudiada cuidadosamente.
No se debe modificar el Registro si no es absolutamente necesario.
Nota:
¿Cómo restauro el Registro en caso de que haya ocurrido algún
error? Muy sencillo, sólo debes ir a Inicio -> Apagar el sistema
-> Reiniciar en modo MS-DOS. Una vez en MS-DOS debes escribir
"scanreg /restore", presionar enter y reiniciar el equipo.
Si sigues este procedimiento, restaurarás el Registro al estado
en que estaba la última vez que el sistema se inició correctamente.
Siguiendo esta idea de que todavía no sabemos qué
valores y claves modificar/agregar, veamos cuál es mi visión sobre
el asunto. Según mi experiencia, básicamente, se pueden realizar
2 tipos de operaciones en el Registro.
a) agregar/modificar/borrar configuraciones de NUESTRO
programa y ...
b) modificar configuraciones de otros programas e inclusive del
sistema operativo, es decir, de Windows.
La pregunta, entonces es, ¿qué lugar del Registro
está reservado para que yo pueda guardar las configuraciones de
MI programa?. La respuesta a esa pregunta es corta. "HKEY_CURRENT_USER\Software"
es la ruta recomendada en donde, generalmente, deberás guardar este
tipo de información. Sin embargo, si te fijas bien, verás que por
ejemplo Delphi también tiene claves y valores en otros lados, como
en "HKEY_LOCAL_MACHINE\Software".
Es decir, "HKEY_CURRENT_USER\Software" es una sugerencia,
no una restricción, puedes almacenar datos en donde quieras, pero
se recomienda que sea en una de estas 2 claves Software, sobre todo
en la primera.
Nota: Para terminar
de comprender cómo debes guardar las configuraciones de tu programa,
te recomiendo que abras regedit y te fijes cómo lo hicieron los
fabricantes de los programas que tienes instalados.
Eso abarcaría al punto A, pero ¿que hay del B?. Es
decir, ¿qué valores debo modificar para cambiar las configuraciones
de Windows? Bueno, eso depende de qué desees cambiar. Si quieres
cambiar el papel tapiz deberás ir a "HKEY_CURRENT_USER\Control
Panel\Desktop", si quieres cambiar las asociaciones de archivos
entonces deberás ir a "HKEY_CLASSES_ROOT", por otro lado
si quieres cambiar el nombre de tu computadora debes ir a "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ComputerName
\ComputerName", y la lista continúa.
En otras palabras, para realizar cambios en la configuración
del sistema no hay un lugar específico en donde buscar. Es por ello
que es recomendable tener bien en claro lo que se está haciendo,
estar bien seguro de que cambiar tal o cual valor tendrá el efecto
que esperas y siempre saber el riesgo que se corre.
|
|
como leerlo y modificarlo
con delphi
|
|
Bueno de hecho ya sabemos cómo leer y realizar modificaciones
en el Registro utilizando regedit, pero veamos cómo hacerlo con
Delphi.
El API de Windows nos provee de varias funciones
para manipular el Registro. Estas incluyen a RegCreateKey, RegOpenKey,
RegQueryValue, RegSetValue, RegDeleteKey, y muchas más. Sin embargo,
tratar con el Registro al nivel API puede resultar un poco tedioso.
Gracias a Dios, la gente de Borland pensó en proveer una clase llamada
TRegistry que encapsula estas funciones API, facilitando enormemente
las operaciones con el Registro. Esta clase nos provee de todo lo
que necesitamos para leer y escribir en el Registro. Antes de ver
cómo funciona TRegistry, veamos sus propiedades y métodos más importantes.
|
Propiedad
|
Descripción
|
|
RootKey
|
Define cuál será la rama de claves a las cuales
se podrá tener acceso. En forma predeterminada, el RootKey
es HKEY_CURRENT USER. Sin embargo, también puede tomar los
siguientes valores: HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE,
HKEY_USERS, HKEY_CURRENT_CONFIG, HKEY_DYN_DATA.
|
|
CurrentKey
|
Nos indica cuál es la clave que se encuentra
actualmente abierta.
|
|
Método
|
Descripción
|
|
CloseKey
|
Cierra la clave. En general, no deberías llamar
a este método ya que el destructor de TRegistry cerrará la
clave por ti.
|
|
CreateKey
|
Crea una nueva clave pero no la abre para poder
escribir en ella. Para ello utiliza OpenKey.
|
|
DeleteKey
|
Borra la clave especificada. Para borrar la
clave que en ese momento se encuentra abierta debes llamar
a DeleteKey con una cadena vacía como parámetro.
|
|
HasSubKeys
|
Devuelve True si la clave actual tiene "sub-claves",
o False si no las tiene.
|
|
GetKeyNames
|
Devuelve una lista de las "sub-claves"
asociadas a la clave especificada en un objeto TStrings.
|
|
GetValueNames
|
Devuelve una lista de los nombres de los valores
asociados a la clave que se encuentra actualmente abierta.
|
|
KeyExists
|
Verifica si la clave especificada existe. Puedes
utilizar este método para verificar la existencia de una clave
antes de intentar leerla.
|
|
LoadKey
|
Crea una nueva clave y carga todas sus claves
y valores desde un archivo creado con SaveKey.
|
|
SaveKey
|
Guarda una clave en el disco para que luego
pueda ser cargada llamando a LoadKey.
|
|
OpenKey
|
Abre una clave. Si la clave no existe, el valor
de CanCreate determina si se crea o no la clave.
|
|
ValueExists
|
Devuelve True si la clave actual tiene un valor
con el nombre especificado, de lo contrario devuelve False.
|
|
ReadBinaryData, ReadBool, ReadDateTime, ReadDate,
ReadTime, ReadFloat, ReadInteger, ReadString
|
Todos estos métodos realizan la misma operación:
leer datos desde el Registro. La única diferencia es que cada
uno lee diferentes tipos de datos.
|
|
WriteBinaryData, WriteBool, WriteDateTime,
WriteDate, WriteTime, WriteFloat, WriteInteger, WriteString
|
Todos estos métodos realizan la misma operación:
escribir datos en el Registro. La única diferencia es que
cada uno escribe diferentes tipos de datos.
|
Cuando decimos que el Registro guarda la configuración
de los programas, en realidad, lo que estamos diciendo es que el
Registro guarda información que (se supone) será útil la próxima
vez que el usuario abra nuestro programa. Por ejemplo, ¿cómo puedo
hacer para que mi programa se abra en la misma ubicación y con el
mismo tamaño que tenía cuando se cerró por última vez?. La respuesta,
cómo se imaginarán está relacionada con el Registro. Veamos cómo.
Nota: Antes de
que puedas usar TRegistry debes agregar el unit Registry a tu lista
uses.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Registry, StdCtrls, ToolWin, ComCtrls, Menus;
type
TForm1 = class(TForm)
Button1: TButton;
ToolBar1: TToolBar;
MainMenu1: TMainMenu;
mnuOpcionesToolbar1: TMenuItem;
RichEdit1: TRichEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
UltimoAbierto: string;
procedure AbrirArchivo(Ruta: string);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
const Clave: string = 'Software\Delphiladero\PruebaReg';
procedure TForm1.AbrirArchivo(Ruta: string);
begin
{ abrimos el archivo y realizamos algunas modificaciones a la barra de título }
try
if Ruta <> '' then begin
RichEdit1.Lines.LoadFromFile(Ruta);
Caption := 'Notas - ' + Ruta;
UltimoAbierto := Ruta;
end;
except
on EFOpenError do
ShowMessage('El archivo que se abrió la última vez ya no existe!');
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var Reg: TRegistry;
ClaveExiste: boolean;
begin
Reg := TRegistry.Create;
try
ClaveExiste := Reg.OpenKey(Clave, False);
{ OpenKey devuelve True si pudo abrir correctamente la clave, pero si la
clave no existe no podrá abrirla y por lo tanto devolverá False. Observa
cómo utilizando OpenKey en vez de KeyExists matamos 2 pájaros de 1
sólo tiro, ya que si la clave existe OpenKey ya la abre y por lo tanto me
permite acceder a ella (leer/escribir), en cambio KeyExists sólo averigua
si la clave existe o no en el Registro. }
{ obtenemos todos los datos necesarios del Registro }
if ClaveExiste then begin
if Reg.ReadBool('Maximizado') = False then begin
Left := Reg.ReadInteger('Left');
Top := Reg.ReadInteger('Top');
Height := Reg.ReadInteger('Height');
Width := Reg.ReadInteger('Width');
end else
WindowState := wsMaximized;
ToolBar1.Visible := Reg.ReadBool('ToolBar1');
mnuOpcionesToolBar1.Checked := ToolBar1.Visible;
AbrirArchivo(Reg.ReadString('UltimoAbierto'));
end;
finally
Reg.Free;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.OpenKey(Clave, True);
{ guardamos todos los datos en el Registro }
Reg.WriteBool('Maximizado', WindowState = wsMaximized);
{ si WindowState = wsMaximized entonces devuelve True, de lo contrario
devuelve False }
Reg.WriteInteger('Left', Left);
Reg.WriteInteger('Top', Top);
Reg.WriteInteger('Height', Height);
Reg.WriteInteger('Width', Width);
Reg.WriteBool('ToolBar1', mnuOpcionesToolBar1.Checked);
Reg.WriteString('UltimoAbierto', UltimoAbierto);
finally
Reg.Free;
end;
end;
procedure TForm1.btnAbrirClick(Sender: TObject);
begin
if OpenDialog.Execute then
AbrirArchivo(OpenDialog.FileName);
end;
end.
|
Nota: Para no
tener que escribir toda la ruta de una clave y si además la estas
viendo con regedit, entonces ve a regedit y pulsa botón derecho
arriba de la clave, seleccionas "Copiar nombre de clave"
y listo. Luego puedes pegarlo en Delphi, como en cualquier otra
operación copiar-pegar.
Antes de continuar me gustaría hacer una pequeña
observación. En nuestro ejemplo anterior no fue necesario determinar
el RootKey, ya que el constructor del objeto TRegistry lo inicializa
en HKEY_CURRENT_USER, que era justamente el RootKey al que nosotros
necesitábamos acceder. Ahora bien, teniendo esto en mente, analicemos
un error que suele ser muy común:
Reg.OpenKey('HKEY_LOCAL_MACHINE\Software\Delphiladero\PruebaReg',
False);
¿Qué tiene de malo este código?, te estarás preguntando.
Bueno, miremos cómo debería haberse escrito:
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey('Software\Delphiladero\PruebaReg', False);
¿Ahora comprendes? En el primer caso en realidad
se le estaba pidiendo a OpenKey que abriera la clave 'HKEY_CURRENT_USER\HKEY_LOCAL_MACHINE\Software\
Delphiladero\PruebaReg', que por supuesto no existe y por lo tanto
OpenKey devolverá False.
Bueno, creo que eso es todo en cuanto al Registro,
ahora sólo te queda ir averiguando y experimentando.
¡Cuidado!: Hay
que ser muy cuidadosos al realizar cambios al Registro ya que estos
cambios pueden afectar no solamente el buen funcionamiento de las
aplicaciones sino también el del propio Windows.
|
Recomienda
este documento a un amigo.
Recuerda enviarme tus comentarios sobre el
artículo.

«anterior - Indice -
siguiente»
|