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_SZ
nebo 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.