Як вже було сказано, ключі (keys) подібні до папок, а значення (values) подібні до файлів. Тому кожен ключ може містити багато підключів і значень, так як і папки можуть містити багато підпапок і файлів. Ключі, як і папки потрібні тільки для групування файлів-значень. Інформація ж міститься в файлах та значеннях.
Для отримання інформації, яка знаходиться в одному із значень використовується функція RegQueryValueEx.
Приклад виклику функції RegQueryValueEx – Програма В
.386
.model flat, stdcall
include c:\masm32\include\windows.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\advapi32.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\masm32.inc
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\masm32.lib
includelib c:\masm32\lib\advapi32.lib
.data
Subkey db "Control Panel\International",0; Назва ключа, який містить значення
hkey dd? ; Змінна, яка отримає дескриптор ключа
val_n db "sCurrency",0 ; Назва значення в ключі реєстру з якого
; отримується інформація
val db 255 dup (0) ; Буфер для збереження інформації із
; значення
val_l dd 255 ; Довжина інформації в буфері
|
|
.code
start:
invoke RegOpenKeyEx, \ ; Відкриття ключа, див. Програму А
HKEY_CURRENT_USER, \ ; Точка входу в реєстр
addr Subkey, \ ; Див. В13
0, \
KEY_EXECUTE, \ ; Доступ до відкритого ключа
addr hkey ;
invoke RegQueryValueEx, \; функція отримання інформації із
; значення реєстру
hkey, \ ; Дескриптор ключа в якому міститься значення
addr val_n, \ ; Вказівник на стрічку В15 з назвою значення
0, \ ; Завжди нуль
0, \ ; Тип значення нас не цікавить
addr val, \ ; Вказує на стрічку В16,яка отримає інформацію
addr val_l ; Вказує на змінну В17, в яку запишиться
; розмір отриманої в В16 інформації
invoke MessageBox,0, addr val, addr val_n, 0; виводить отриману інформацію
invoke ExitProcess,0
end start
Програма В виводить на екран інформацію, яка міститься в значенні з назвою sCurrency, яке знаходиться в ключі реєстру “HKEY_CURRENT_USER\Control Panel\International”. Опишемо деякі аргументи функції RegQueryValueEx:
В21.4 може вказувати на змінну типу dd (DWORD), яка отримуватиме тип даного значення. Цей параметр може бути рівний нулю, коли тип отримувати не потрібно. В іншому випадку одержаний тип може приймати одне з перелічених значень:
Значення | Опис |
REG_BINARY | Двійкові дані будь-якого формату |
REG_DWORD | 32-розрядне число |
REG_DWORD_LITTLE_ENDIAN | 32-розрядне число в форматі little-endian (аналог REG_DWORD). В цьому форматі перший байт слова є старшим байтом. Цей формат є найчастіше вживаним на комп'ютерах з ОС Windows NT та Windows 95. |
REG_DWORD_BIG_ENDIAN | 32-розрядне число у форматі big-endian. В цьому форматі останній байт слова є найстаршим. |
REG_EXPAND_SZ | Стрічка символів з нулем на кінці, яка містить посилання на змінні середовища (наприклад "%PATH%"). Ця стрічка може представлятися в Unicode або ANSI, залежно від функцій, які ви до неї застосуєте. |
REG_LINK | Символьне посилання в форматі Unicode. |
REG_MULTI_SZ | Масив стрічок, який завершується двома символами з нульовим кодом. |
REG_NONE | Невизначений тип значення |
REG_RESOURCE_LIST | Список ресурсів для пристрою або драйвера. |
REG_SZ | Стрічка символів з нулем на кінці. Ця стрічка може представлятися в Unicode або ANSI, залежно від функцій, які ви до неї застосуєте. |
|
|
В21.5 вказує на буфер В16, який отримає інформацію із значення. Цей параметр може бути рівний нулю, коли дані не потрібні.
В21.6 вказує на зміннуВ17, яка визначає розмір буфера заданого в В21.5. Після свого виконання функція записує в змінну В17 кількість байт отриманої інформації.
Коли буфер має недостатній для отримання інформації розмір, функція повертає в ЕАХ значення ERROR_MORE_DATA, і записує в змінну на яку вказує В21.6 кількість байт, які необхідні для отримання інформації.
Коли задати В21.5 рівним нулю, а В21.6 вказуватиме на змінну, то функція повертає ERROR_SUCCESS в ЕАХ, і зберігає в цю змінну кількість байт, які необхідні для отримання інформації. Така поведінка функції дозволяє одразу визначити кількість байт, які треба виділити в пам'яті для повного отримання інформації.
В21.6 може бути нульовим лише тоді коли В21.5 нульовий.