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_SZtipo , REG_MULTI_SZou 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.