Udostępnij za pośrednictwem


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_SZlub 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.