Types de valeurs 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 du tableau ci-dessous. Lorsque vous récupérez une valeur de Registre, des fonctions telles que RegQueryValueEx utiliser 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 sous n’importe quel 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 informatiques peu endiennes. 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 aux 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 d’accès 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, arrêtée par une chaîne vide (\0 ). Voici un exemple : String1\0String2\0String3\0LastString\0\0 . La première \0 met fin à la première chaîne, la deuxième \0 met fin à la dernière chaîne et la dernière \0 met fin à la séquence. Notez que le terminateur final doit être pris en compte dans la longueur de la chaîne. |
REG_NONE |
Aucun type de valeur défini. |
REG_QWORD |
Nombre 64 bits. |
REG_QWORD_LITTLE_ENDIAN |
Nombre 64 bits au format little-endian. Windows est conçu pour s’exécuter sur des architectures informatiques peu endiennes. Par conséquent, cette valeur est définie comme REG_QWORD dans les fichiers d’en-tête Windows. |
REG_SZ |
Chaîne terminée par null. Il s’agit d’une chaîne Unicode ou ANSI, selon que vous utilisez les fonctions Unicode ou ANSI. |
Valeurs de chaîne
Si les données ont la REG_SZ
, REG_MULTI_SZ
ou REG_EXPAND_SZ
type, la chaîne n’a peut-être pas été stockée avec les caractères Null de fin appropriés. Par conséquent, lors de la lecture d’une chaîne à partir du Registre, vous devez vous assurer que la chaîne est correctement arrêtée avant de l’utiliser ; sinon, il peut remplacer une mémoire tampon. Notez que REG_MULTI_SZ
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 fonction strlen
pour déterminer la longueur de la chaîne, mais pour 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 chaîne REG_MULTI_SZ
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 présente une chaîne 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;
}
Formats d’octets
Dans format little-endian, une valeur à plusieurs octets est stockée en mémoire du octet le plus bas (le petit) au octet le plus élevé. Par exemple, la valeur 0x12345678
est stockée en tant que 0x78 0x56 0x34 0x12
au format little-endian.
Dans format big-endian, une valeur à plusieurs octets est stockée en mémoire du plus haut octet (le big end) au octet le plus bas. Par exemple, la valeur 0x12345678
est stockée en tant que 0x12 0x34 0x56 0x78
au format big-endian.
Ces termes sont des références culturelles légères au roman satirique de Jonathan Swift Travels de Gulliver.