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

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

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