Tipos de valor do Registro
Um valor de registro pode armazenar dados em um dos vários formatos, como um valor de cadeia de caracteres ou um valor inteiro. Quando você armazena dados em um valor de registro, por exemplo, chamando a função RegSetValueEx, você pode indicar o tipo de dados armazenados especificando um dos tipos na tabela abaixo. Quando você recupera um valor do Registro, funções como RegQueryValueEx usam esses tipos para indicar o tipo de dados recuperados.
Os seguintes tipos de valor do Registro são definidos no arquivo de cabeçalho winnt.h
:
Valor | Tipo |
---|---|
REG_BINARY |
Dados binários em qualquer forma. |
REG_DWORD |
Um número de 32 bits. |
REG_DWORD_LITTLE_ENDIAN |
Um número de 32 bits em formato little-endian. O Windows foi projetado para ser executado em arquiteturas de computador little-endian. Portanto, esse valor é definido como REG_DWORD nos arquivos de cabeçalho do Windows. |
REG_DWORD_BIG_ENDIAN |
Um número de 32 bits em 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 exibidas a variáveis de ambiente, por exemplo, %PATH%. É um Unicode ou uma cadeia de caracteres ANSI, dependendo se você usa as funções Unicode ou ANSI. Para expandir as referências de variável de ambiente, use a funçãoExpandEnvironmentStrings. |
REG_LINK |
Uma cadeia de caracteres Unicode terminada 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, terminadas por uma cadeia de caracteres vazia (\0 ). Veja a seguir um exemplo: String1\0String2\0String3\0LastString\0\0 . O primeiro \0 termina a primeira cadeia de caracteres, a segunda da última \0 termina a última cadeia de caracteres e a \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. O Windows foi projetado para ser executado em arquiteturas de computador little-endian. Portanto, esse valor é definido como REG_QWORD nos arquivos de cabeçalho do Windows. |
REG_SZ |
Uma cadeia de caracteres terminada em nulo. É um Unicode ou uma cadeia de caracteres ANSI, dependendo se você usa 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
, talvez a cadeia de caracteres não tenha 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 a contagem de caracteres na cadeia de caracteres, sem contar o nulo de terminação. Portanto, você deve calcular o comprimento da cadeia de caracteres com 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 bytes
Em formato little-endian, um valor de vários bytes é armazenado na memória do byte mais baixo (o pequeno) para o byte mais alto. Por exemplo, o valor 0x12345678
é armazenado como 0x78 0x56 0x34 0x12
no formato little-endian.
Em formato big-endian, um valor de vários bytes é armazenado na memória do byte mais alto (o big end) para o byte mais baixo. Por exemplo, o valor 0x12345678
é armazenado como 0x12 0x34 0x56 0x78
no formato big-endian.
Esses termos são referências culturais leves ao romance satírico de Jonathan Swift Gulliver's Travels.