Поделиться через


Типы значений реестра

Значение реестра может хранить данные в одном из нескольких форматов, таких как строковое значение или целочисленное значение. При хранении данных в значении реестра (например, вызовом функции 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.

Эти термины являются легкодушными культурными ссылками на сатирический роман Джонатан Свифт Путешествия Гулливера.