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_SZ
tipo , REG_MULTI_SZ
o 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.