Registrierungswerttypen
Ein Registrierungswert kann Daten in verschiedenen Formaten speichern. Wenn Sie Daten unter einem Registrierungswert speichern, z. B. durch Aufrufen der RegSetValueEx-Funktion , können Sie einen der folgenden Werte angeben, um den Typ der gespeicherten Daten anzugeben. Wenn Sie einen Registrierungswert abrufen, verwenden Funktionen wie RegQueryValueEx diese Werte, um den Typ der abgerufenen Daten anzugeben.
Die folgenden Registrierungswerttypen werden in Winnt.h definiert.
| Wert | Typ |
|---|---|
| REG_BINARY | Binärdaten in beliebiger Form. |
| REG_DWORD | Eine 32-Bit-Nummer. |
| REG_DWORD_LITTLE_ENDIAN | Eine 32-Bit-Zahl im Klein-End-Format. Windows ist so konzipiert, dass sie auf kleinen endischen Computerarchitekturen ausgeführt wird. Daher wird dieser Wert in den Windows Headerdateien als REG_DWORD definiert. |
| REG_DWORD_BIG_ENDIAN | Eine 32-Bit-Nummer im Big-End-Format. Einige UNIX-Systeme unterstützen big-endische Architekturen. |
| REG_EXPAND_SZ | Eine null-beendete Zeichenfolge, die nichtexpandierte Verweise auf Umgebungsvariablen enthält (z. B. "%PATH%"). Es handelt sich um eine Unicode- oder ANSI-Zeichenfolge, je nachdem, ob Sie die Unicode- oder ANSI-Funktionen verwenden. Verwenden Sie zum Erweitern der Umgebungsvariablenverweise die Funktion ExpandEnvironmentStrings . |
| REG_LINK | Eine mit Null beendete Unicode-Zeichenfolge, die den Zielpfad eines symbolischen Links enthält, der 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 werden. Es folgt ein Beispiel: String1\0String2\0String3\0LastString\0\0 Die erste \0 beendet die erste Zeichenfolge, die zweite bis zur letzten \0 beendet die letzte Zeichenfolge, und das letzte \0 beendet die Sequenz. Beachten Sie, dass der endgültige Terminator in die Länge der Zeichenfolge berücksichtigt werden muss. |
| REG_NONE | Kein definierter Werttyp. |
| REG_QWORD | Eine 64-Bit-Nummer. |
| REG_QWORD_LITTLE_ENDIAN | Eine 64-Bit-Zahl im Klein-End-Format. Windows ist so konzipiert, dass sie auf kleinen endischen Computerarchitekturen ausgeführt wird. Daher wird dieser Wert in den Windows Headerdateien als REG_QWORD definiert. |
| REG_SZ | Eine NULL-terminierte Zeichenfolge. Dies ist entweder eine Unicode- oder eine ANSI-Zeichenfolge, je nachdem, ob Sie die Unicode- oder ANSI-Funktionen verwenden. |
Zeichenfolgenwerte
Wenn Daten über die REG_SZ, REG_MULTI_SZ oder REG_EXPAND_SZ Typ verfügen, wurde die Zeichenfolge möglicherweise nicht mit den richtigen Endzeichen gespeichert. Daher müssen Sie beim Lesen einer Zeichenfolge aus der Registrierung sicherstellen, dass die Zeichenfolge vor der Verwendung ordnungsgemäß beendet wird; andernfalls kann ein Puffer überschrieben werden. (Beachten Sie, dass REG_MULTI_SZ Zeichenfolgen zwei Endzeichen aufweisen sollten.)
Beim Schreiben einer Zeichenfolge in die Registrierung müssen Sie die Länge der Zeichenfolge angeben, einschließlich des endenden Nullzeichens (\0). Ein allgemeiner Fehler besteht darin, die Strlen-Funktion zu verwenden, um die Länge der Zeichenfolge zu bestimmen, aber zu vergessen, dass strlen nur die Anzahl der Zeichen in der Zeichenfolge zurückgibt, nicht einschließlich der endenden Null. Daher sollte die Länge der Zeichenfolge wie folgt berechnet werden: strlen( string ) + 1
Eine REG_MULTI_SZ Zeichenfolge endet mit einer Länge von 0. Daher ist es nicht möglich, eine Leere-Länge-Zeichenfolge in die Sequenz einzuschließen. Eine leere Sequenz würde wie folgt definiert: \0.
Im folgenden Beispiel wird eine REG_MULTI_SZ Zeichenfolge ausgeführt.
#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 Klein-End-Format wird ein Multi-Byte-Wert im Speicher von dem niedrigsten Byte (das "kleine Ende") bis zum höchsten Byte gespeichert. Der Wert 0x12345678 wird z. B. im Klein-End-Format als (0x78 0x56 0x34 0x12) gespeichert.
Im Big-End-Format wird ein Multi-Byte-Wert im Speicher von dem höchsten Byte (dem "big end") bis zum niedrigsten Byte gespeichert. Der Wert 0x12345678 wird beispielsweise im Big-End-Format als (0x12 0x34 0x56 0x78) gespeichert.