Types valeur de Registre

Une valeur de Registre peut stocker des données dans l’un des différents formats, comme une valeur de chaîne ou une valeur entière. Lorsque vous stockez des données dans une valeur de Registre, par exemple en appelant la fonction RegSetValueEx , vous pouvez indiquer le type de données stockées en spécifiant l’un des types dans le tableau ci-dessous. Lorsque vous récupérez une valeur de Registre, les fonctions telles que RegQueryValueEx utilisent ces types pour indiquer le type de données récupérées.

Les types de valeurs de Registre suivants sont définis dans le fichier d’en-tête winnt.h :

Valeur Type
REG_BINARY Données binaires dans tout formulaire.
REG_DWORD Nombre 32 bits.
REG_DWORD_LITTLE_ENDIAN Nombre 32 bits au format little-endian. Windows est conçu pour s’exécuter sur des architectures d’ordinateurs little endian. Par conséquent, cette valeur est définie comme REG_DWORD dans les fichiers d’en-tête Windows.
REG_DWORD_BIG_ENDIAN Nombre 32 bits au format big-endian. Certains systèmes UNIX prennent en charge les architectures big-endian.
REG_EXPAND_SZ Chaîne terminée par null qui contient des références non expirées à des variables d’environnement, par exemple ,%PATH%. Il s’agit d’une chaîne Unicode ou ANSI, selon que vous utilisez les fonctions Unicode ou ANSI. Pour développer les références de variables d’environnement, utilisez la fonction ExpandEnvironmentStrings .
REG_LINK Chaîne Unicode terminée par null qui contient le chemin cible d’un lien symbolique créé en appelant la fonction RegCreateKeyEx avec REG_OPTION_CREATE_LINK.
REG_MULTI_SZ Séquence de chaînes terminées par null, terminées par une chaîne vide (\0). Voici un exemple : String1\0String2\0String3\0LastString\0\0. Le premier \0 termine la première chaîne, l’avant-dernier \0 termine la dernière chaîne et la dernière \0 termine la séquence. Notez que le terminateur final doit être pris en compte dans la longueur de la chaîne.
REG_NONE Aucun type valeur défini.
REG_QWORD Nombre 64 bits.
REG_QWORD_LITTLE_ENDIAN Nombre 64 bits au format 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 Chaîne se terminant par une valeur null. It's either a Unicode or an ANSI string, depending on whether you use the Unicode or ANSI functions.

Valeurs de chaîne

Si les données ont le REG_SZtype , REG_MULTI_SZou REG_EXPAND_SZ , la chaîne n’a peut-être pas été stockée avec les caractères null de fin appropriés. Ainsi, lors de la lecture d’une chaîne à partir du Registre, vous devez vous assurer que la chaîne est correctement terminée avant de l’utiliser ; dans le cas contraire, il peut remplacer une mémoire tampon. Notez que REG_MULTI_SZ les chaînes doivent avoir deux caractères null de fin.

Lorsque vous écrivez une chaîne dans le Registre, vous devez spécifier la longueur de la chaîne, y compris le caractère null de fin (\0). Une erreur courante consiste à utiliser la strlen fonction pour déterminer la longueur de la chaîne, mais à oublier que strlen retourne uniquement le nombre de caractères dans la chaîne, sans compter la valeur null de fin. Vous devez donc calculer la longueur de la chaîne avec strlen(string) + 1

Une REG_MULTI_SZ chaîne se termine par une chaîne de longueur 0. Par conséquent, il n’est pas possible d’inclure une chaîne de longueur nulle dans la séquence. Une séquence vide est définie comme suit : \0.

L’exemple suivant montre comment suivre une REG_MULTI_SZ chaîne.

#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;
}

Formats d’octets

Dans le format little-endian, une valeur de plusieurs octets est stockée en mémoire à partir de l’octet le plus bas (la petite extrémité) à l’octet le plus élevé. Par exemple, la valeur 0x12345678 est stockée au 0x78 0x56 0x34 0x12 format little-endian.

Dans le format big-endian, une valeur multioctet est stockée en mémoire de l’octet le plus élevé ( l’extrémité volumineuse) à l’octet le plus bas. Par exemple, la valeur 0x12345678 est stockée au 0x12 0x34 0x56 0x78 format big-endian.

Ces termes sont des références culturelles légères au roman satirique Gulliver’s Travels de Jonathan Swift.