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.