Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11634
Последний выпуск: 19.06.2015

Реестр и Windows API

В ранних версиях Windows, все её приложения хранили необходимую для запуска и работы информацию в файлах инициализации. С развитием ОС информации, необходимой для сохранения стало так много, что возникла необходимость в новом способе её хранения - реестре. Реестр, - это своеобразная база данных для приложений Windows. Его структура напоминает файловую систему. (не верите посмотрите через regedit.exe только ничего не меняйте). Вообще реестр считают несомненной альтернативой INI-файлам, но я думаю, что эти две технологии имеют наибольшую мощность только при их совмещении.

В Visual Basic есть функции для работы с реестром( GetSetting,SaveSetting) но их возможности ограничены. Они могут работать с реестром только в разделе HKEY_CURRENT_USER\Software\VB and VBA Programms, и способны только читать и записывать. Для начинающего программиста это неплохо, даже хорошо - меньше возможностей навредить.На самом деле Windows может намного больше. Расширить возможности VB, позволяет Windows API.

Windows обладает большим набором функций для работы с реестром, сами по себе GetSetting и SaveSetting тоже вызывают их. С помощью этих функций, вы можете создавать разделы, в любой части реестра, а затем удалять их :), подключать реестр через сеть, сохранять разделы в файле и т.д.

В качестве примера, мы создадим класс, для работы с реестром через Windows API (насколько я знаю в Borland Delphi, нечто подобное уже есть, и один знакомый программист очень этим гордится :) ). Этот класс может работать только со строковыми данными. Я посчитал, что если Вам понадобится больше, Вы сможете сделать это сами. Кроме того класс даёт возможность удалять лишние разделы, и параметры. Работу с реестром через сеть, и остальные возможности я исключил, так как этот класс задуман как расширение Basic'овских функций для работы с реестром. Остальные операции будут заключены в другой класс, который должен будет реализовать все возможности Windows API в работе с реестром.

Итак, хватит лирики, приступим к работе. Создадим новый модуль класса и назовём его RegistryExClass(совсем как в API, RegSetValue,RegSetValueEx). После этого приступим к объявлению необходимых функций.Я рассмотрю только особенные, остальные найдёте в API Text Viewer. (RegOpenKey, RegDeleteValue, RegDeleteKey, RegCloseKey, RegCreateKey)

Код:
Private Declare Function RegQueryValueExS Lib "advapi32.dll" _
 Alias "RegQueryValueExA" ( _
 ByVal hkey As Long, _
 ByVal lpValueName As String, _
 ByVal lpReserved As Long, _
 lpType As Long, _
 ByVal lpData As String, _
 lpcbData As Long) As Long

Private Declare Function RegSetValueExS Lib "advapi32.dll" _
 Alias "RegSetValueExA" ( _
 ByVal hkey As Long, _
 ByVal lpValueName As String, _
 ByVal Reserved As Long, _
 ByVal dwType As Long, _
 ByVal lpData As String, _
 ByVal cbData As Long) As Long

Что здесь особенного, спросите Вы. Объясняю: Как я уже сказал мой класс работает только со строками. Приведённые выше функции, в оригинальном объявлении не имеют чётко определённого типа данных(lpData As Any). При попытке использовать такое объявление, я получал ошибку "Out Of Memory". Как видно в листинге, я объявил lpData как строку, хотя имею возможность присвоить любой тип. Беда в том, что VB не поймёт Вас при попытке объявить две функции. Чтобы обойти это, я и объявил функции с оконаниями "-S". И теперь в класс можно будет добавить ещё функции для работы с различными типами.

Ещё по той же теме. Некоторые функции для работы с реестром имеют параметры типа SECURITY_ATTRIBUTES. Если эти параметры Вам не нужны, то объявите их как Long, и передавайте ноль.

Теперь объявим константы.

Код:
'Объявив эти константы таким способом, Вы дадите
'пользователю класса возможность выбирать из списка
'значение параметра
Public Enum HKEY_CONSTANTS
 HKEY_CLASSES_ROOT = &H80000000
 HKEY_CURRENT_CONFIG = &H80000005
 HKEY_CURRENT_USER = &H80000001
 HKEY_DYN_DATA = &H80000006
 HKEY_LOCAL_MACHINE = &H80000002
 HKEY_PERFORMANCE_DATA = &H80000004
 HKEY_USERS = &H80000003
End Enum

'Ну ещё константа, для строкового типа
Private Const REG_SZ = 1

Теперь создадим методы для чтения/записи параметров

Код:
'~~~~~~.GetString Функция
Public Function GetString( _
   ByVal HomeKey As HKEY_CONSTANTS, _
   ByVal KeyName As String, _
   ByVal ValueName As String) As String

'Handle раздела реестра
Dim hkey As Long
'переменная для хранения значения
Dim sData As String
'Результат работы API функций
Dim lres As Long
'Тип возвращаемого значения
Dim lDataType As Long
'переменная для хранения длины строки
Dim lDlen As Long
'Открываем Раздел
lres = RegOpenKey(HomeKey, KeyName, hkey)
'Если вернулся не ноль - ошибка, выходим
If lres <> 0 Then GetRegString = vbNullString: Exit Function
'Продолжаем, заполняем строку пробелами.
sData = String$(64, 32) & Chr$(0)
lDlen = Len(sData)
'Читаем значение
lres = RegQueryValueExS(hkey, ValueName, 0, lDataType, sData, lDlen)
'опять проверка на ошибку
If lres <> 0 Then GetRegString = vbNullString: Exit Function
'проверяем тип полученных данных
If lDataType = REG_SZ Then
GetString = Left$(sData, lDlen - 1)
Else
GetString = vbNullString
End If
'и закрываем раздел
lres = RegCloseKey(hkey)
End Function


'~~~~~.SaveString  Метод
Public Sub SaveString( _
    ByVal HomeKey As HKEY_CONSTANTS, _
    ByVal KeyName As String, _
    ByVal ValueName As String, _
    ByVal Data As String)

'Handle для корневого раздела
Dim hkey As Long
'Handle для изменяемого раздела
Dim hSubKey  As Long
'Результат работы функции
Dim lres As Long
'Открываем корневой раздел
lres = RegOpenKey(HomeKey, vbNullString, hkey)
'Создаём(если есть открываем) нужный раздел
lres = RegCreateKey(HomeKey, KeyName, hSubKey)
'Пишем данные
lres = RegSetValueExS(hSubKey, ValueName, 0, _
   REG_SZ, Data + Chr$(0), Len(Data) + 1)

'и закрываем всё открытое
lres = RegCloseKey(hSubKey)
lres = RegCloseKey(hkey)
End Sub

Метод GetString всего лишь читает параметр из реестра. SaveString - имеет больше возможностей. С его помощью Вы можете создать пустой раздел. Для этого вызовите его, установив значение ValueName и Data равное пустой строке. Если хотите установить для раздела значение по умолчанию присвойте Data нужное значение, при нулевом(vbNullString) ValueName.

Теперь поработаем с удалением.

Код:
'~~~~~~.DeleteValue Метод
Public Sub DeleteValue( _
    ByVal HomeKey As HKEY_CONSTANTS, _
    ByVal KeyName As String, _
    ByVal ValueName As String)

'Handle для изменяемого раздела
Dim hkey As Long
'Результат API функции
Dim lres As Long
'открываем нужные раздел
lres = RegOpenKey(HomeKey, KeyName, hkey)
'проверяем на ошибку
If lres <> 0 Then Exit Sub
'удаляем параметр
lres = RegDeleteValue(hkey, ValueName)
'закрываем
lres = RegCloseKey(hkey)
End Sub

'~~~~~~.DeleteKey
Public Sub DeleteKey( _
   ByVal HomeKey As HKEY_CONSTANTS, _
   ByVal KeyName As String)
'результат APi функции
Dim lres As Long
'Удаляем раздел из корневого
lres = RegDeleteKey(HomeKey, KeyName)
End Sub

Как Вы наверное заметили, я сохранял результат работы API функций во всех процедурах и функциях, а проверял только в некоторых. Вообще рекомендуется проверять результат всегда, если дело касается каких-то изменений в системе, но я пытался создать код минимального размера, и сэкономил на проверке, особой беды нет - класс работает и неплохо. Но на всякий случай возьмите на заметку. Вот в общем-то и всё, что я хотел сообщить Вам о работе с реестром. Весь код я скопировал в прямо из VB-редактора, так что он должен работать, если что удалите лишние подчёркивания.

Евгений EugeneO@rambler.ru

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
92K
18 января 2014 года
Serapfima
0 / / 18.01.2014
Мне нравитсяМне не нравится
18 января 2014, 16:54:15
Здравствуйте!
Подскажите, пожалуйста, а как будет выглядеть в с++ API-функция для просмотра списка установленного на компьютере ПО?
2.
68K
20 января 2011 года
Miha VDV
0 / / 20.01.2011
Мне нравитсяМне не нравится
24 января 2011, 09:29:25
Эти же две строчки и для кнопки в вб подойдут!
3.
68K
20 января 2011 года
Miha VDV
0 / / 20.01.2011
Мне нравитсяМне не нравится
24 января 2011, 08:39:56
jjoosseepphh Создай файл *.vbs, в блокноте забей в него:
Код:
Set R = CreateObject("Wscript.Shell")

R.RegWrite "HKLM\Software\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization","Xelmarjve Ostati", "REG_DWORD"

и запускай двойным кликом!!
4.
41K
13 июля 2008 года
jjoosseepphh
0 / / 13.07.2008
Мне нравитсяМне не нравится
13 июля 2008, 21:12:17
Помогите создать программу на ВБ, с помочью которого, при нажатии на кнопке можно будет в реестр в вести следующее изменения


[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"RegisteredOrganization"="Xelmarjve Ostati"


Заранее благодарю,
5.
41K
13 июля 2008 года
jjoosseepphh
0 / / 13.07.2008
Мне нравитсяМне не нравится
13 июля 2008, 21:09:19
esli ne trudno sdelaite primer chb pri klike na knopku v registr zapisivalsa slebuiushee

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"RegisteredOrganization"="Xelmarjve Ostati"

zaraneee blogadariu
6.
38K
01 апреля 2008 года
DRU_BY
0 / / 01.04.2008
Мне нравитсяМне не нравится
1 апреля 2008, 02:42:14
'
Set Reg = CreateObject("WScript.Shell")

Reg.RegDelete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace\{2227A280-3AEA-1069-A2DE-08002B30309D}\"
Reg.Regwrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Browser\Parameters\IsDomainMaster", "FALSE"
'
7.
Аноним
+1 / -0
Мне нравитсяМне не нравится
20 февраля 2006, 19:43:47
Создал библиотеку, пользуюсь функцией из класса а мне сообщает "Ошибка компиляции: Ожидаемая функция или переменная"
8.
Аноним
Мне нравитсяМне не нравится
5 мая 2005, 11:02:57
Если не трудно не могли бы Вы прислать или выложить где нибудь этот класс, но чтобы он мог работать и с dword и со строковыми данными.

kreed@rin.ru
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог