Jump to content


Photo

¿Cómo acceder al registro de windows con Delphi?


  • Please log in to reply
No replies to this topic

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 18 November 2008 - 07:51 AM

¿Qué es el Registro de Windows?

Es donde Windows guarda muchas de sus opciones de configuración y también permite a las aplicaciones acceder a estos datos, así como guardar sus propios datos.

Si desea echar un vistazo al registro simplemente ejecute la aplicación REGEDIT.EXE localizada en su directorio de Windows. Tenga cuidado de no cambiar nada o podría terminar arruinado su instalación! Ahora bien, los datos se guardan en el registro en forma de una estructura de árbol. Hay varias raíces (varios árboles):

  HKEY_CLASSES_ROOT
  HKEY_CURRENT_USER
  HKEY_LOCAL_MACHINE
  HKEY_USERS
  HKEY_PERFORMANCE_DATA
  HKEY_CURRENT_CONFIG
  HKEY_DYN_DATA

Cada raíz contiene valores y claves. Los valores son datos guardados bajo nombres de elementos (panel derecho de RegEdit). Las claves pueden tener valores así como otras claves, formando una estructura de árbol (panel izquierdo de RegEdit).

TRegistry

La clase TRegistry está declarada en la unidad Registry, así que tendrá que añadirla a la cláusula uses de la unidad o programa donde quiera usarla. Para acceder a un dato en el registro primero debe crear un objeto de esta clase, asignar la raíz donde se encuentra el dato en la propiedad RootKey (los valores están definidos en la unidad Windows) y luego intentar abrir la clave donde está ese dato con el método OpenKey que devolverá True si tuvo éxito. Lugo puede leer (con las funciones ReadXxxx) o escribir (con los procedimientos WriteXxxx) los valores de la clave abierta y luego de eso, debe cerrar la clave con el método CloseKey. Cuando haya terminado con el registro, debería liberar el objeto creado.

Veamos un ejemplo de cómo obtener el nombre del procesador que posee nuestro ordenador:


delphi
  1. uses Registry, Windows, Dialogs;
  2.  
  3. procedure TForm1.Button1Click(Sender: TObject);
  4. begin
  5.   with TRegistry.Create do
  6.     try
  7.       RootKey := HKEY_LOCAL_MACHINE;
  8.       if OpenKey('\Hardware\Description\System'
  9.           + '\CentralProcessor\0', False) then begin
  10.         ShowMessage(ReadString('Identifier'));
  11.         CloseKey;
  12.       end;
  13.     finally
  14.       Free;
  15.     end;
  16. end;



Puede ver otro ejemplo en el artículo Determinando la aplicación asociada

Por supuesto, hay muchas otras cosas que se pueden hacer con el registro, como crear y eliminar claves y valores...

La clase TRegistryIniFile hace fácil a las aplicaciones escribir y leer su información de configuración en y desde el registro, mientras que TRegistry opera a un nivel más bajo.

GetRegistryData

Para simplificar la lectura de valores de datos del registro puede usar la siguiente función capaz de leer cualquier tipo de dato del registro y lo devuelve como un variant (string o integer). La función realiza tratamiento de excepciones.



delphi
  1. uses Registry, Windows, SysUtils;
  2.  
  3. function GetRegistryData(RootKey: HKEY; Key, Value: string): variant;
  4. var
  5.   Reg: TRegistry;
  6.   RegDataType: TRegDataType;
  7.   DataSize, Len: integer;
  8.   s: string;
  9. label cantread;
  10. begin
  11.   Reg := nil;
  12.   try
  13.     Reg := TRegistry.Create(KEY_QUERY_VALUE);
  14.     Reg.RootKey := RootKey;
  15.     if Reg.OpenKeyReadOnly(Key) then begin
  16.       try
  17.         RegDataType := Reg.GetDataType(Value);
  18.         if (RegDataType = rdString) or
  19.           (RegDataType = rdExpandString) then
  20.           Result := Reg.ReadString(Value)
  21.         else if RegDataType = rdInteger then
  22.           Result := Reg.ReadInteger(Value)
  23.         else if RegDataType = rdBinary then begin
  24.           DataSize := Reg.GetDataSize(Value);
  25.           if DataSize = -1 then goto cantread;
  26.           SetLength(s, DataSize);
  27.           Len := Reg.ReadBinaryData(Value, PChar(s)^, DataSize);
  28.           if Len <> DataSize then goto cantread;
  29.           Result := s;
  30.         end else
  31. cantread:
  32.           raise Exception.Create(SysErrorMessage(ERROR_CANTREAD));
  33.       except
  34.         s := ''; // Deallocates memory if allocated
  35.         Reg.CloseKey;
  36.         raise;
  37.       end;
  38.       Reg.CloseKey;
  39.     end else
  40.       raise Exception.Create(SysErrorMessage(GetLastError));
  41.   except
  42.     Reg.Free;
  43.     raise;
  44.   end;
  45.   Reg.Free;
  46. end;



Llamada de ejemplo



delphi
  1. ShowMessage(GetRegistryData(HKEY_LOCAL_MACHINE,
  2.   '\Hardware\Description\System\CentralProcessor\0', 'Identifier'));



SetRegistryData

Para simplificar la escritura de un valor de datos en el registro puede usar el siguiente procedimiento capaz de escribir cualquier tipo de datos en el registro. El procedimiento tratamiento de excepciones.



delphi
  1. uses Registry, Windows, SysUtils;
  2.  
  3. procedure SetRegistryData(RootKey: HKEY; Key, Value: string;
  4.   RegDataType: TRegDataType; Data: variant);
  5. var
  6.   Reg: TRegistry;
  7.   s: string;
  8. begin
  9.   Reg := TRegistry.Create(KEY_WRITE);
  10.   try
  11.     Reg.RootKey := RootKey;
  12.     if Reg.OpenKey(Key, True) then begin
  13.       try
  14.         if RegDataType = rdUnknown then
  15.           RegDataType := Reg.GetDataType(Value);
  16.         if RegDataType = rdString then
  17.           Reg.WriteString(Value, Data)
  18.         else if RegDataType = rdExpandString then
  19.           Reg.WriteExpandString(Value, Data)
  20.         else if RegDataType = rdInteger then
  21.           Reg.WriteInteger(Value, Data)
  22.         else if RegDataType = rdBinary then begin
  23.           s := Data;
  24.           Reg.WriteBinaryData(Value, PChar(s)^, Length(s));
  25.         end else
  26.           raise Exception.Create(SysErrorMessage(ERROR_CANTWRITE));
  27.       except
  28.         Reg.CloseKey;
  29.         raise;
  30.       end;
  31.       Reg.CloseKey;
  32.     end else
  33.       raise Exception.Create(SysErrorMessage(GetLastError));
  34.   finally
  35.     Reg.Free;
  36.   end;
  37. end;



Llamada de ejemplo



delphi
  1. SetRegistryData(HKEY_LOCAL_MACHINE,
  2.   '\Software\Microsoft\Windows\CurrentVersion',
  3.   'RegisteredOrganization', rdString, 'Latium Software');



FUENTE: http://www.latiumsof...elphi/00004.php

Cualquier duda o pregunta con respecto a este artículo, puedes abrir un hilo en el foro adecuado
  • 0




IP.Board spam blocked by CleanTalk.