Типы значений реестра
Значение реестра может хранить данные в одном из нескольких форматов, таких как строковое значение или целочисленное значение. При хранении данных в значении реестра (например, вызовом функции RegSetValueEx) можно указать тип данных, хранящихся в таблице ниже. При получении значения реестра такие функции, как RegQueryValueEx используют эти типы, чтобы указать тип полученных данных.
В файле заголовка winnt.h
определены следующие типы значений реестра:
Ценность | Тип |
---|---|
REG_BINARY |
Двоичные данные в любой форме. |
REG_DWORD |
32-разрядное число. |
REG_DWORD_LITTLE_ENDIAN |
32-разрядное число в маленьком формате. Windows предназначен для работы на небольших архитектурах компьютеров. Поэтому это значение определяется как REG_DWORD в файлах заголовков Windows. |
REG_DWORD_BIG_ENDIAN |
32-разрядное число в формате big-endian. Некоторые системы UNIX поддерживают архитектуры большого плана. |
REG_EXPAND_SZ |
Строка, завершающаяся значением NULL, содержащая необъяснимые ссылки на переменные среды, например %PATH%. Это либо Юникод, либо строка ANSI, в зависимости от того, используются ли функции Юникода или ANSI. Чтобы развернуть ссылки на переменную среды, используйте функцию ExpandEnvironmentStrings. |
REG_LINK |
Строка Юникода, завершающая значение NULL, содержащая целевой путь символьной ссылки, созданной путем вызова функции RegCreateKeyEx с REG_OPTION_CREATE_LINK. |
REG_MULTI_SZ |
Последовательность строк, завершаемых значением NULL, завершаемая пустой строкой (\0 ). Ниже приведен пример: String1\0String2\0String3\0LastString\0\0 . Первый \0 завершает первую строку, второй из последней \0 завершает последнюю строку, а последняя \0 завершает последовательность. Обратите внимание, что окончательный терминатор должен учитываться в длину строки. |
REG_NONE |
Не определен тип значения. |
REG_QWORD |
64-разрядное число. |
REG_QWORD_LITTLE_ENDIAN |
64-разрядное число в маленьком формате. Windows предназначен для работы на небольших архитектурах компьютеров. Поэтому это значение определяется как REG_QWORD в файлах заголовков Windows. |
REG_SZ |
Строка, завершаемая значением NULL. Это либо Юникод, либо строка ANSI, в зависимости от того, используются ли функции Юникода или ANSI. |
Строковые значения
Если данные имеют тип REG_SZ
, REG_MULTI_SZ
или REG_EXPAND_SZ
, то строка может не храниться с соответствующими конечными символами NULL. Поэтому при чтении строки из реестра необходимо убедиться, что строка завершается правильно, прежде чем использовать ее; в противном случае он может перезаписать буфер. Обратите внимание, что REG_MULTI_SZ
строки должны иметь два конечных символа NULL.
При записи строки в реестр необходимо указать длину строки, включая завершающийся символ NULL (\0
). Распространенная ошибка заключается в том, чтобы использовать функцию strlen
для определения длины строки, но забыть, что strlen
возвращает только количество символов в строке, а не подсчет конца null. Поэтому вы должны вычислить длину строки с strlen(string) + 1
Строка REG_MULTI_SZ
заканчивается строкой длины 0. Поэтому невозможно включить строку нулевой длины в последовательность. Пустая последовательность будет определена следующим образом: \0
.
В следующем примере показано, как 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;
}
Форматы байтов
В маленьком форматезначение с несколькими байтами хранится в памяти от наименьшего байта (маленький конец) до самого высокого байта. Например, значение 0x12345678
хранится как 0x78 0x56 0x34 0x12
в маленьком формате.
В формате big-endianзначение с несколькими байтами хранится в памяти от самого высокого байта (больших конечных) до наименьшего байта. Например, значение 0x12345678
хранится как 0x12 0x34 0x56 0x78
в формате big-endian.
Эти термины являются легкодушными культурными ссылками на сатирический роман Джонатан Свифт Путешествия Гулливера.