Registrierungswerttypen
Ein Registrierungswert kann Daten in einem von mehreren Formaten speichern, z. B. einen Zeichenfolgenwert oder einen ganzzahligen Wert. Wenn Sie Daten in einem Registrierungswert speichern, z. B. durch Aufrufen der RegSetValueEx-Funktion , können Sie den Typ der gespeicherten Daten angeben, indem Sie einen der Typen in der folgenden Tabelle angeben. Wenn Sie einen Registrierungswert abrufen, verwenden Funktionen wie RegQueryValueEx diese Typen, um den Typ der abgerufenen Daten anzugeben.
Die folgenden Registrierungswerttypen sind in der winnt.h
Headerdatei definiert:
Wert | type |
---|---|
REG_BINARY |
Binärdaten in beliebiger Form. |
REG_DWORD |
Eine 32-Bit-Zahl. |
REG_DWORD_LITTLE_ENDIAN |
Eine 32-Bit-Zahl im Little-Endian-Format. Windows ist für die Ausführung auf Little-Endian-Computerarchitekturen konzipiert. Daher wird dieser Wert in den Windows-Headerdateien definiert REG_DWORD . |
REG_DWORD_BIG_ENDIAN |
Eine 32-Bit-Zahl im Big-Endian-Format. Einige UNIX-Systeme unterstützen Big-End-Architekturen. |
REG_EXPAND_SZ |
Eine null-endende Zeichenfolge, die nicht erweiterte Verweise auf Umgebungsvariablen enthält, z. B. %PATH%. Es handelt sich entweder um eine Unicode- oder eine ANSI-Zeichenfolge, je nachdem, ob Sie die Unicode- oder ANSI-Funktionen verwenden. Verwenden Sie die Funktion ExpandEnvironmentStrings , um die Verweise auf die Umgebungsvariablen zu erweitern. |
REG_LINK |
Eine unicode-Zeichenfolge mit Null-Endung, die den Zielpfad einer symbolischen Verknüpfung enthält, die durch Aufrufen der RegCreateKeyEx-Funktion mit REG_OPTION_CREATE_LINK erstellt wurde. |
REG_MULTI_SZ |
Eine Sequenz von NULL-beendeten Zeichenfolgen, die durch eine leere Zeichenfolge (\0 ) beendet wird. Im Folgenden finden Sie ein Beispiel: String1\0String2\0String3\0LastString\0\0 . Die erste \0 beendet die erste Zeichenfolge, die vorletzte \0 die letzte Zeichenfolge und die letzte \0 die Sequenz. Beachten Sie, dass das endgültige Abschlusszeichen in der Länge der Zeichenfolge berücksichtigt werden muss. |
REG_NONE |
Kein definierter Werttyp. |
REG_QWORD |
Eine 64-Bit-Zahl. |
REG_QWORD_LITTLE_ENDIAN |
Eine 64-Bit-Zahl im Little-Endian-Format. 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 |
Eine NULL-terminierte Zeichenfolge. It's either a Unicode or an ANSI string, depending on whether you use the Unicode or ANSI functions. |
Zeichenfolgenwerte
Wenn die Daten den REG_SZ
Typ , REG_MULTI_SZ
oder REG_EXPAND_SZ
aufweisen, wurde die Zeichenfolge möglicherweise nicht mit den richtigen Nullzeichen gespeichert. Wenn Sie also eine Zeichenfolge aus der Registrierung lesen, müssen Sie sicherstellen, dass die Zeichenfolge ordnungsgemäß beendet wird, bevor Sie sie verwenden. Andernfalls wird möglicherweise ein Puffer überschrieben. Beachten Sie, dass REG_MULTI_SZ
Zeichenfolgen zwei endende NULL-Zeichen enthalten sollten.
Wenn Sie eine Zeichenfolge in die Registrierung schreiben, müssen Sie die Länge der Zeichenfolge angeben, einschließlich des abschließenden NULL-Zeichens (\0
). Ein häufiger Fehler besteht darin, die Länge der Zeichenfolge mithilfe der strlen
-Funktion zu bestimmen. Vergessen Sie jedoch, dass strlen
nur die Anzahl der Zeichen in der Zeichenfolge zurückgibt, ohne den abschließenden NULL-Wert zu zählen. Daher sollten Sie die Länge der Zeichenfolge mit berechnen. strlen(string) + 1
Eine REG_MULTI_SZ
Zeichenfolge endet mit einer Zeichenfolge der Länge 0. Daher ist es nicht möglich, eine Zeichenfolge der Länge Null in die Sequenz einzuschließen. Eine leere Sequenz wird wie folgt definiert: \0
.
Im folgenden Beispiel wird eine REG_MULTI_SZ
Zeichenfolge durchlaufen.
#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;
}
Byteformate
Im Little-Endian-Format wird ein Multibytewert vom niedrigsten Byte (dem kleinen Ende) bis zum höchsten Byte im Arbeitsspeicher gespeichert. Der Wert 0x12345678
wird beispielsweise im 0x78 0x56 0x34 0x12
Little-Endian-Format gespeichert.
Im Big-Endian-Format wird ein Multibytewert vom höchsten Byte (big end) bis zum niedrigsten Byte im Arbeitsspeicher gespeichert. Der Wert 0x12345678
wird beispielsweise im 0x12 0x34 0x56 0x78
Big-Endian-Format gespeichert.
Diese Begriffe sind leichtherzige kulturelle Bezüge zu Jonathan Swifts satirischem Roman Gulliver es Travels.