Типы значений реестра
Значение реестра может хранить данные в одном из нескольких форматов, например строковое или целочисленное значение. При хранении данных в значении реестра, например путем вызова функции 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 поддерживают архитектуры big-endian. |
REG_EXPAND_SZ |
Строка, завершающаяся нулевым значением, которая содержит нерасширенные ссылки на переменные среды, например %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 is designed to run on little-endian computer architectures. Therefore, this value is defined as REG_QWORD in the Windows header files. |
REG_SZ |
Строка с нулевым символом в конце. It's either a Unicode or an ANSI string, depending on whether you use the Unicode or ANSI functions. |
Строковые значения
Если данные имеют 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.
Эти термины являются беззаботными культурными ссылками на сатирический роман Джонатана Свифта «Путешествия Гулливера».