Работа со значениями реестра
октября 12 2009 by admin in АдминистрированиеДо этого момента речь шла в основном о разделах реестра, работа же со значениями реестра не обсуждалась. На самом деле основу реестра составляют именно значения. В них хранятся данные о конфигурации приложений. Имея описатель открытого раздела реестра, вы можете получить содержащуюся в нем информацию.
Получить значения из системного реестра позволяют функции RegQueryValueEx, RegEnumValue и RegQueryMultipleValues. Мы подробно обсудим первые две. RegQueryMultipleValues кратко описана в разделе «Удаленный доступ к реестру».
Используйте RegEnumValue, если название значения, содержащего нужные вам данные, неизвестно или если вы хотите получить все значения определенного раздела. И, наоборот, RegQueryValueEx применяется для получения одного значения, чье название (или его отсутствие, как в случае со значением по умолчанию) известно заранее. RegQueryValueEx объявлена так:
LONG RegQueryValueEx( HKEY hkey, PTSTR pszValueName, PDWORD pdwReserved, PDWORD pdwType, PBYTE pbData, PDWORD pcbData);
Параметр hkey является описателем открытого раздела с доступом типа KEY_QUERY_VALUE, а pszValueName — названием значения, которое вы хотите получить. Если вместо pszValueName передать NULL или указатель на пустую строку, система получит информацию из значения по умолчанию данного раздела.
Параметр pdwType является указателем на переменную типа DWORD, в которую система помещает одно из перечисленных в табл. 5-2 значений (например, REG_SZ или REG_BINARY), определяющих тип данных значения реестра.
Параметр pbData является указателем на буфер, в который функция помещает данные, a pcbData указывает на переменную типа DWORD, содержащую размер передаваемого буфера. Вместо pbData можно передать NULL, в результате чего в переменную типа DWORD, на которую указывает pcbData, будет помещен размер данных значения реестра в байтах.
RegQueryValueEx возвращает ошибку ERROR_MORE_DATA, если объем буфера недостаточен для получения всех данных значения. Ваше приложение должно уметь обрабатывать эту ошибку. Обычной реакцией на нее является увеличение буфера и повторный вызов функции. Проверка размера данных значения перед вызовом RegQueryValueEx не гарантирует успешного выполнения функции, так как другие процессы могут внести изменения в реестр уже после такой проверки. На прилагаемом к этой книге диске находится класс CAutoBuf предлагающий элегантное (не сочтите за нескромность) решение по работе с функциями, требующими для хранения данных буферы переменного размера. Этот класс часто используется в демонстрационных приложениях в этой книге.
Если приложению нужно получить только одно значение реестра, как правило, совершаются два вызова RegQueryValueEx-. первым определяют размер буфера, вторым — уже после выделения буфера соответствующего размера — получают сами данные.
Однако есть еще один метод, который может оказаться более эффективным в зависимости от количества получаемых значений реестра: осуществляется единственный вызов RegQuerylnfoKey, возвращающей размер самого большого значения раздела. Затем можно выделить память для одного буфера и использовать его в дальнейших вызовах RegQueryValueEx.
Чтобы определить подходящий размер буфера для получения названия значения, можно вызвать RegQueryValueEx, указав в качестве параметра pbData NULL. Так вы узнаете длину самого длинного названия значения раздела.