este espacio está libre ¿deseas utilizarlo? haz clic aquí.

   Secciones

   Inicio
   Documentos
   Programas
   Links
   Proyectos
   Libros

   Actualizaciones & Foro

   Avisar al actualizar
   Foro Delphiladero

   Otras

   Contacto
   Agregar a favoritos
   Vota por nosotros

 

 

 

inicio » documentos » intro al registro y los ini - parte 1


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»


 Copyright © Pablo Castagnino 2000-2002. Todos los derechos reservados.


Puedes ayudarnos

¿Conoces algún documento enteramente en español que pueda resultar interesante para nuestra comunidad delphiadicta?

Coméntanos de él aquí.


Vota por nosotros