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_SZ
o 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.