Tipos de valor do Registro
Um valor do Registro pode armazenar dados em vários formatos. Ao armazenar dados sob um valor de registro, por exemplo, chamando a função RegSetValueEx , você pode especificar um dos valores a seguir para indicar o tipo de dados que está sendo armazenado. Quando você recupera um valor do Registro, funções como RegQueryValueEx usam esses valores para indicar o tipo de dados recuperados.
Os tipos de valor do registro a seguir são definidos em Winnt.h.
| Valor | Tipo |
|---|---|
| REG_BINARY | Dados binários em qualquer formulário. |
| REG_DWORD | Um número de 32 bits. |
| REG_DWORD_LITTLE_ENDIAN | Um número de 32 bits no formato little-endian. Windows foi projetado para ser executado em arquiteturas de computador little-endian. Portanto, esse valor é definido como REG_DWORD nos arquivos de cabeçalho Windows. |
| REG_DWORD_BIG_ENDIAN | Um número de 32 bits no formato big-endian. Alguns sistemas UNIX dão suporte a arquiteturas de big-endian. |
| REG_EXPAND_SZ | Uma cadeia de caracteres terminada em nulo que contém referências não explicadas a variáveis de ambiente (por exemplo, "%PATH%"). Ele será uma cadeia de caracteres Unicode ou ANSI, dependendo se você usar as funções Unicode ou ANSI. Para expandir as referências de variável de ambiente, use a função ExpandEnvironmentStrings . |
| REG_LINK | Uma cadeia de caracteres Unicode encerrada em nulo que contém o caminho de destino de um link simbólico que foi criado chamando a função RegCreateKeyEx com REG_OPTION_CREATE_LINK. |
| REG_MULTI_SZ | Uma sequência de cadeias de caracteres terminadas em nulo, encerradas por uma cadeia de caracteres vazia (\0). Veja a seguir um exemplo: String1\0String2\0String3\0LastString\0\0\0 O primeiro \0 encerra a primeira cadeia de caracteres, o segundo para o último \0 encerra a última cadeia de caracteres e o \0 final encerra a sequência. Observe que o terminador final deve ser fatorado no comprimento da cadeia de caracteres. |
| REG_NONE | Nenhum tipo de valor definido. |
| REG_QWORD | Um número de 64 bits. |
| REG_QWORD_LITTLE_ENDIAN | Um número de 64 bits no formato little-endian. Windows foi projetado para ser executado em arquiteturas de computador little-endian. Portanto, esse valor é definido como REG_QWORD nos arquivos de cabeçalho Windows. |
| REG_SZ | Uma cadeia de caracteres terminada em nulo. Isso será um Unicode ou uma cadeia de caracteres ANSI, dependendo se você usar as funções Unicode ou ANSI. |
Valores de cadeia de caracteres
Se os dados tiverem o tipo REG_SZ, REG_MULTI_SZ ou REG_EXPAND_SZ, a cadeia de caracteres poderá não ter sido armazenada com os caracteres nulos de terminação adequados. Portanto, ao ler uma cadeia de caracteres do registro, você deve garantir que a cadeia de caracteres seja encerrada corretamente antes de usá-la; caso contrário, ele pode substituir um buffer. (Observe que REG_MULTI_SZ cadeias de caracteres devem ter dois caracteres nulos de terminação.)
Ao gravar uma cadeia de caracteres no registro, você deve especificar o comprimento da cadeia de caracteres, incluindo o caractere nulo de terminação (\0). Um erro comum é usar a função strlen para determinar o comprimento da cadeia de caracteres, mas esquecer que strlen retorna apenas o número de caracteres na cadeia de caracteres, não incluindo o nulo de terminação. Portanto, o comprimento da cadeia de caracteres deve ser calculado da seguinte maneira: strlen( string ) + 1
Uma cadeia de caracteres REG_MULTI_SZ termina com uma cadeia de caracteres de comprimento 0. Portanto, não é possível incluir uma cadeia de caracteres de comprimento zero na sequência. Uma sequência vazia seria definida da seguinte maneira: \0.
O exemplo a seguir orienta uma cadeia de caracteres 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 byte
No formato little-endian, um valor de vários bytes é armazenado na memória do byte mais baixo (o "little end") até o byte mais alto. Por exemplo, o valor 0x12345678 é armazenado como (0x78 0x56 0x34 0x12) no formato little-endian.
No formato big-endian, um valor de vários bytes é armazenado na memória do byte mais alto (o "big end") até o byte mais baixo. Por exemplo, o valor 0x12345678 é armazenado como (0x12 0x34 0x56 0x78) no formato big-endian.