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. Al almacenar 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, las funciones como RegQueryValueEx usan estos tipos para indicar el tipo de datos recuperados.

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

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 una cadena Unicode o ANSI, dependiendo de si se usan las funciones Unicode o ANSI. Para expandir las referencias de variables de entorno, use la función ExpandEnvironmentStrings .
REG_LINK Cadena Unicode terminada en null que contiene la ruta de acceso de destino de un vínculo simbólico que se creó mediante una llamada 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. La primera \0 finaliza la primera cadena, la segunda desde el último \0 finaliza la última cadena y la final \0 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 is designed to run on little-endian computer architectures. Therefore, this value is defined as REG_QWORD in the Windows header files.
REG_SZ Una cadena terminada en null. It's either a Unicode or an ANSI string, depending on whether you use the Unicode or ANSI functions.

Valores de cadena

Si los datos tienen el REG_SZtipo , REG_MULTI_SZo REG_EXPAND_SZ , 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 las 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 es usar la strlen función para determinar la longitud de la cadena, pero 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 REG_MULTI_SZ cadena 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 recorre una REG_MULTI_SZ cadena.

#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 del byte más bajo (el extremo pequeño) al 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 extremo grande) 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 Travels de Gulliver.