Compartir a través de


Tipos de valor del Registro

Un valor del Registro puede almacenar datos en uno de varios formatos, como un valor de cadena o un valor entero. Cuando se almacenan datos en un valor del Registro (por ejemplo, llamando a la función RegSetValueEx), puede indicar el tipo de datos que se almacenan especificando uno de los tipos de la tabla siguiente. Al recuperar un valor del Registro, funciones como RegQueryValueEx usar estos tipos para indicar el tipo de datos recuperados.

Los siguientes tipos de valor del Registro se definen en el archivo de encabezado winnt.h:

Valor Tipo
REG_BINARY Datos binarios en cualquier formato.
REG_DWORD Número de 32 bits.
REG_DWORD_LITTLE_ENDIAN Número de 32 bits en formato little-endian. Windows está diseñado para ejecutarse en arquitecturas de equipos little-endian. Por lo tanto, este valor se define como REG_DWORD en los archivos de encabezado de Windows.
REG_DWORD_BIG_ENDIAN Número de 32 bits en formato big-endian. Algunos sistemas UNIX admiten arquitecturas big-endian.
REG_EXPAND_SZ Cadena terminada en null que contiene referencias no expandidas a variables de entorno, por ejemplo, %PATH%. Es un Unicode o una cadena ANSI, en función de si usa las funciones Unicode o ANSI. Para expandir las referencias de variables de entorno, use la funciónExpandEnvironmentStrings.
REG_LINK Cadena Unicode terminada en null que contiene la ruta de acceso de destino de un vínculo simbólico que se creó llamando a la función regCreateKeyEx con REG_OPTION_CREATE_LINK.
REG_MULTI_SZ Secuencia de cadenas terminadas en NULL, terminadas por una cadena vacía (\0). A continuación se muestra un ejemplo: String1\0String2\0String3\0LastString\0\0. El primer \0 finaliza la primera cadena, la segunda \0 finaliza la última cadena y el \0 final finaliza la secuencia. Tenga en cuenta que el terminador final debe tener en cuenta la longitud de la cadena.
REG_NONE No hay ningún tipo de valor definido.
REG_QWORD Número de 64 bits.
REG_QWORD_LITTLE_ENDIAN Número de 64 bits en formato little-endian. Windows está diseñado para ejecutarse en arquitecturas de equipos little-endian. Por lo tanto, este valor se define como REG_QWORD en los archivos de encabezado de Windows.
REG_SZ Cadena terminada en null. Es un Unicode o una cadena ANSI, en función de si usa las funciones Unicode o ANSI.

Valores de cadena

Si los datos tienen el REG_SZ, REG_MULTI_SZo REG_EXPAND_SZ tipo, es posible que la cadena no se haya almacenado con los caracteres NULL de terminación adecuados. Por lo tanto, al leer una cadena del Registro, debe asegurarse de que la cadena finaliza correctamente antes de usarla; de lo contrario, podría sobrescribir un búfer. Tenga en cuenta que REG_MULTI_SZ cadenas deben tener dos caracteres NULOs de terminación.

Al escribir una cadena en el Registro, debe especificar la longitud de la cadena, incluido el carácter nulo de terminación (\0). Un error común consiste en usar la función strlen para determinar la longitud de la cadena, pero para olvidar que strlen devuelve solo el recuento de caracteres de la cadena, sin contar el valor NULL de terminación. Por lo tanto, debe calcular la longitud de la cadena con strlen(string) + 1

Una cadena de REG_MULTI_SZ termina con una cadena de longitud 0. Por lo tanto, no es posible incluir una cadena de longitud cero en la secuencia. Una secuencia vacía se definiría de la siguiente manera: \0.

En el ejemplo siguiente se muestra una cadena de REG_MULTI_SZ.

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

void SampleSzz(PTSTR pszz)
{
   _tprintf(_TEXT("\tBegin multi-sz string\n"));
   while (*pszz) 
   {
      _tprintf(_TEXT("\t\t%s\n"), pszz);
      pszz = pszz + _tcslen(pszz) + 1;
   }
   _tprintf(_TEXT("\tEnd multi-sz\n"));
}

int __cdecl main(int argc, char **argv)
{
   // Because the compiler adds a \0 at the end of quoted strings, 
   // there are two \0 terminators at the end. 

   _tprintf(_TEXT("Conventional multi-sz string:\n"));  
   SampleSzz(_TEXT("String1\0String2\0String3\0LastString\0"));

   _tprintf(_TEXT("\nTest case with no strings:\n"));  
   SampleSzz(_TEXT(""));

   return 0;
}

Formatos de bytes

En formato little-endian, un valor de varios bytes se almacena en memoria desde el byte más bajo (el ) hasta el byte más alto. Por ejemplo, el valor 0x12345678 se almacena como 0x78 0x56 0x34 0x12 en formato little-endian.

En formato big-endian, un valor de varios bytes se almacena en memoria del byte más alto (el big end) al byte más bajo. Por ejemplo, el valor 0x12345678 se almacena como 0x12 0x34 0x56 0x78 en formato big-endian.

Esos términos son referencias culturales ligeras a la novela satírica de Jonathan Swift Los viajes de Gulliver.