Typy wartości rejestru
Wartość rejestru może przechowywać dane w jednym z kilku formatów, takich jak wartość ciągu lub wartość całkowita. W przypadku przechowywania danych w wartości rejestru — na przykład przez wywołanie funkcji RegSetValueEx — można wskazać typ przechowywanych danych, określając jeden z typów w poniższej tabeli. Podczas pobierania wartości rejestru funkcje takie jak RegQueryValueEx używają tych typów do wskazania typu pobranych danych.
Następujące typy wartości rejestru są zdefiniowane w pliku nagłówka winnt.h
:
Wartość | Typ |
---|---|
REG_BINARY |
Dane binarne w dowolnej formie. |
REG_DWORD |
Liczba 32-bitowa. |
REG_DWORD_LITTLE_ENDIAN |
Liczba 32-bitowa w formacie little-endian. System Windows jest przeznaczony do uruchamiania w architekturze komputerów mało endian. W związku z tym ta wartość jest definiowana jako REG_DWORD w plikach nagłówków systemu Windows. |
REG_DWORD_BIG_ENDIAN |
Liczba 32-bitowa w formacie big-endian. Niektóre systemy UNIX obsługują architektury big-endian. |
REG_EXPAND_SZ |
Ciąg zakończony wartością null, który zawiera nierozciągniętych odwołań do zmiennych środowiskowych, na przykład %PATH%. Jest to ciąg Unicode lub ANSI, w zależności od tego, czy używasz funkcji Unicode, czy ANSI. Aby rozwinąć odwołania do zmiennej środowiskowej, użyj funkcji ExpandEnvironmentStrings. |
REG_LINK |
Ciąg Unicode zakończony wartością null zawierający ścieżkę docelową linku symbolicznego, który został utworzony przez wywołanie funkcji RegCreateKeyEx za pomocą REG_OPTION_CREATE_LINK. |
REG_MULTI_SZ |
Sekwencja ciągów zakończonych wartością null, zakończona pustym ciągiem (\0 ). Oto przykład: String1\0String2\0String3\0LastString\0\0 . Pierwsza \0 kończy pierwszy ciąg, drugi z ostatnich \0 kończy ostatni ciąg, a ostatni \0 kończy sekwencję. Należy pamiętać, że końcowy terminator musi być uwzględniany w długości ciągu. |
REG_NONE |
Brak zdefiniowanego typu wartości. |
REG_QWORD |
Liczba 64-bitowa. |
REG_QWORD_LITTLE_ENDIAN |
Liczba 64-bitowa w formacie mało endianu. System Windows jest przeznaczony do uruchamiania w architekturze komputerów mało endian. W związku z tym ta wartość jest definiowana jako REG_QWORD w plikach nagłówków systemu Windows. |
REG_SZ |
Ciąg zakończony wartością null. Jest to ciąg Unicode lub ANSI, w zależności od tego, czy używasz funkcji Unicode, czy ANSI. |
Wartości ciągu
Jeśli dane mają typ REG_SZ
, REG_MULTI_SZ
lub REG_EXPAND_SZ
, ciąg mógł nie być przechowywany z odpowiednimi znakami null zakończenia. Dlatego podczas odczytywania ciągu z rejestru należy upewnić się, że ciąg jest poprawnie zakończony przed jego użyciem; w przeciwnym razie może zastąpić bufor. Należy pamiętać, że ciągi REG_MULTI_SZ
powinny mieć dwa znaki null zakończenia.
Podczas zapisywania ciągu w rejestrze należy określić długość ciągu, w tym znak o wartości null zakończenia (\0
). Typowym błędem jest użycie funkcji strlen
w celu określenia długości ciągu, ale zapominanie, że strlen
zwraca tylko liczbę znaków w ciągu, nie licząc wartości null zakończenia. Dlatego należy obliczyć długość ciągu przy użyciu strlen(string) + 1
Ciąg REG_MULTI_SZ
kończy się ciągiem o długości 0. W związku z tym nie można uwzględnić ciągu o zerowej długości w sekwencji. Pusta sekwencja zostanie zdefiniowana w następujący sposób: \0
.
W poniższym przykładzie przedstawiono ciąg 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;
}
Formaty bajtów
W małym formacie endianwartość wielo bajtów jest przechowywana w pamięci z najniższego bajtu (mały koniec) do najwyższego bajtu. Na przykład wartość 0x12345678
jest przechowywana jako 0x78 0x56 0x34 0x12
w formacie mało endianu.
W format big-endianwartość wielo bajtów jest przechowywana w pamięci z najwyższego bajtu (big end ) do najniższego bajtu. Na przykład wartość 0x12345678
jest przechowywana jako 0x12 0x34 0x56 0x78
w formacie big-endian.
Te terminy są lekko zapalone odniesienia kulturowe do satyrycznej powieści Jonathan Swift Gulliver's Travels.