fcl-registry/es

From Free Pascal wiki
Jump to: navigation, search

English (en) | español (es) | русский (ru)

fcl-registry es una unidad FCL que permite acceder al registro de Windows.

Terminología del Registro

El registro de Windows contiene un conjunto de entradas o apartados bien diferenciados que se denominan "hives", que van creando una estructura en árbol a partir de su raiz "root".

RootKey: es la entrada "hive" necesaria como comienzo para acceder al registro, como su nombre indica es la "llave raiz" comenzando con la H de Hive.

Ejemplos: HKEY_CLASSES_ROOT, HKEY_CURRENT_USER HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG

Key: es la trayectoria al "directorio" que contiene los datos individuales. Puede parecer poco intuitivo pero aporta compatibilidad con versiones previas del registro.

Name/value (Nombre/Valor): los pares actuales name/value en el directorio de la llave "Key". Cada llave puede tener un valor por defecto cuyo valor es ''' (una cadena vacía).

Una tabla con los diferentes tipos existentes la podéis consultar en:

http://wiki.lazarus.freepascal.org/registry_key_datatypes/es y https://msdn.microsoft.com/en-us/library/windows/desktop/ms724884%28v=vs.85%29.aspx

Ejemplo

Ejemplo que trata de obtener un valor:

uses ... registry...  // registry es la unidad que vamos a necesitar para interactuar con el registro
 
var
  CompileCommand: string='';
  Registry: TRegistry;
begin
  Registry := TRegistry.Create;
  try
    // Navegamos al "directorio" apropiado, en este caso escogemos HKEY_LOCAL_MACHINE.
    Registry.RootKey := HKEY_LOCAL_MACHINE; // Tener en cuenta que este paso es necesario para realizar los siguientes.
    if Registry.OpenKeyReadOnly('\SOFTWARE\Classes\InnoSetupScriptFile\shell\Compile\Command') then
    // Con lo anterior abrimos la llave en modo solo lectura.
      CompileCommand:=Registry.ReadString(''); // Como ya le hemos indicado el trayecto, ahora leemos el valor del nombre indicado.
  finally
    Registry.Free; // Liberamos el recurso creado con "Create".
  end;
end;

Accediendo a vistas del registro en 64 y 32 bits

Si tienes un sistema operativo de Windows de 64 bits, entonces el registro se encuentra repartido en 64 bits y 32 bits (compatibilidad) . Por defecto si arrancas un proceso de 32 bits entonces ves la parte correspondiente a la de 32 bits, mientras que si arrancas una de 64 bits entonces verá la parte de 64.

Puedes acceder a la parte de 32 desde una aplicación de 64 bits y viceversa. De MSDN:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa384129%28v=vs.85%29.aspx

Adicionalmente:

https://blogs.msdn.microsoft.com/junfeng/2004/04/05/key_wow64_64key-and-key_wow64_32key

  • KEY_WOW64_64KEY: Acceso a una llave de 64 bits tanto desde aplicaciones de 32 como de 64 bits.
  • KEY_WOW64_32KEY: Acceso a una llave de 32 bits tanto desde aplicacioens de 32 como de 64 bits.

Estas llaves se encuentran definidas en la unidad registry por lo que las puedes utilizar:

e.g. en la propiedad de acceso del objeto registro, tal como la siguiente:

Registry := TRegistry.Create;
Try
  Registry.Access:=Registry.Access or KEY_WOW64_64KEY;

o en la llamada a crear (registry.create), e.g.

TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);

Privilegios Administrativos

Dependiendo de lo que necesites leer/escribir en el registro, puede que necesites tener derechos de administrador y elevación de privilegios (Windows Vista+). Hecha un vistazo a IDE_Window:_Project_Options#Use_manifest_file_to_set_execution_level_.28Windows_only.29


Programas con código de referencia

Programas que sirven como referencia para estudiar su código en cuanto al uso del registro:

Enchanted Keyfinder:

Sería interesante portar este programa a Freepascal / Lazarus.

Consideraciones adicionales

Para caracteres no estandar, como serían las vocales acentuadas, para visualizar los valores del registro por ejemplo del tipo REG_SZ, se puede transformar dichos valores mediante el uso de la función WinCPToUTF8 (const s: string): string;, más información en [[1]]. Para ello se puede añadir la unidad LazUTF8 en la claúsula uses.

Ver También

Packages List

English (en) | español (es) | русский (ru)