Tipos de valor do Registro
Um valor do Registro pode armazenar dados em um dos vários formatos, como um valor de cadeia de caracteres ou um valor inteiro. Ao armazenar dados em um valor do Registro, por exemplo, chamando a função RegSetValueEx , você pode indicar o tipo de dados que está sendo armazenado 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 winnt.h
cabeçalho:
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. 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 no formato big-endian. Alguns sistemas UNIX dão suporte a arquiteturas 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%. É 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áveis de ambiente, use a função ExpandEnvironmentStrings . |
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 . A primeira \0 termina a primeira cadeia de caracteres, a segunda da última \0 termina a última cadeia de caracteres e a final \0 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 is designed to run on little-endian computer architectures. Therefore, this value is defined as REG_QWORD in the Windows header files. |
REG_SZ |
Uma cadeia de caracteres terminada em nulo. It's either a Unicode or an ANSI string, depending on whether you use the Unicode or ANSI functions. |
Valores de cadeia de caracteres
Se os dados tiverem o REG_SZ
tipo , 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 terminada corretamente antes de usá-la; caso contrário, ele pode substituir um buffer. Observe que REG_MULTI_SZ
as 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 strlen
função 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 REG_MULTI_SZ
cadeia de caracteres 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 REG_MULTI_SZ
de caracteres.
#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
No formato little-endian, um valor de vários bytes é armazenado na memória do byte mais baixo (a pequena extremidade) para 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 (a grande extremidade) 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.