Sdílet prostřednictvím


Typy hodnot registru

Hodnota registru může ukládat data v jednom z několika formátů, jako je řetězcová hodnota nebo celočíselná hodnota. Při ukládání dat do hodnoty registru – například voláním funkce RegSetValueEx – můžete určit typ uložených dat zadáním jednoho z typů v následující tabulce. Při načtení hodnoty registru, funkce, jako je RegQueryValueEx použít tyto typy k označení typu načtených dat.

V souboru hlaviček winnt.h jsou definovány následující typy hodnot registru:

Hodnota Typ
REG_BINARY Binární data v libovolné podobě.
REG_DWORD 32bitové číslo.
REG_DWORD_LITTLE_ENDIAN 32bitové číslo ve formátu little-endian. Systém Windows je navržený tak, aby běžel na architekturách počítačů s malými endy. Proto je tato hodnota definována jako REG_DWORD v souborech hlaviček systému Windows.
REG_DWORD_BIG_ENDIAN 32bitové číslo ve formátu big-endian. Některé systémy UNIX podporují architekturu typu big-endian.
REG_EXPAND_SZ Řetězec ukončený hodnotou null, který obsahuje nerozbalené odkazy na proměnné prostředí, například %PATH%. Jedná se o řetězec Unicode nebo ANSI v závislosti na tom, jestli používáte funkce Unicode nebo ANSI. Pokud chcete rozšířit odkazy na proměnné prostředí, použijte funkci ExpandEnvironmentStrings.
REG_LINK Řetězec Unicode s ukončenou hodnotou null, který obsahuje cílovou cestu symbolického odkazu vytvořeného voláním funkce RegCreateKeyEx s REG_OPTION_CREATE_LINK.
REG_MULTI_SZ Posloupnost řetězců ukončených hodnotou null, ukončená prázdným řetězcem (\0). Následuje příklad: String1\0String2\0String3\0LastString\0\0. První \0 ukončí první řetězec, druhý poslední \0 ukončí poslední řetězec a poslední \0 ukončí sekvenci. Všimněte si, že konečný ukončovací znak musí být faktorován do délky řetězce.
REG_NONE Žádný definovaný typ hodnoty.
REG_QWORD 64bitové číslo.
REG_QWORD_LITTLE_ENDIAN 64bitové číslo v malém endian formátu. Systém Windows je navržený tak, aby běžel na architekturách počítačů s malými endy. Proto je tato hodnota definována jako REG_QWORD v souborech hlaviček systému Windows.
REG_SZ Řetězec ukončený hodnotou null. Jedná se o řetězec Unicode nebo ANSI v závislosti na tom, jestli používáte funkce Unicode nebo ANSI.

Řetězcové hodnoty

Pokud data obsahují typ REG_SZ, REG_MULTI_SZnebo REG_EXPAND_SZ, řetězec pravděpodobně nebyl uložen se správnými ukončovacími znaky null. Takže při čtení řetězce z registru musíte před použitím řetězce zajistit, aby byl řetězec správně ukončen; jinak může přepsat vyrovnávací paměť. Všimněte si, že REG_MULTI_SZ řetězce by měly mít dva ukončující znaky null.

Při zápisu řetězce do registru je nutné zadat délku řetězce, včetně ukončujícího znak null (\0). Běžnou chybou je použití funkce strlen k určení délky řetězce, ale pokud chcete zapomenout, že strlen vrátí pouze počet znaků v řetězci, nepočítá se ukončující hodnota null. Měli byste tedy vypočítat délku řetězce pomocí strlen(string) + 1

Řetězec REG_MULTI_SZ končí řetězcem délky 0. Proto není možné do sekvence zahrnout řetězec nulové délky. Prázdná sekvence by byla definována takto: \0.

Následující příklad vás provede REG_MULTI_SZ řetězcem.

#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;
}

Formáty bajtů

V malého endiánského formátu je hodnota s více bajty uložena v paměti od nejnižšího bajtu (malý koncový) na nejvyšší bajt. Například hodnota 0x12345678 je uložena jako 0x78 0x56 0x34 0x12 v malém endian formátu.

Ve formátu big-endianje hodnota s více bajty uložena v paměti od nejvyššího bajtu (velký konec) na nejnižší bajt. Například hodnota 0x12345678 je uložena jako 0x12 0x34 0x56 0x78 ve formátu big-endian.

Tyto termíny jsou světlé kulturní odkazy na Jonathan Swift satirický román Gulliver travels.