powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Внештатный редактор реестра
48 сообщений из 48, показаны все 2 страниц
Внештатный редактор реестра
    #36741990
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! Нужна помощь со стороны при написании части кода для разрабатываемой утилиты. Вначале дам разрабатываемой утилите кодовое название - "Внештатный редактор реестра".
Основное отличие от системного редактора реестра должно заключаться в том, что он и в частности его интерфейс должен отображать неполное дерево реестра и уметь работать с этим деревом
как это делает штатное средство для работы с реестром Windows.

Такое вот задание мне "всучили" и просили разработать утилиту. "Падать лицом в грязь" не хочется, но и не обойтись без помощи опытных программистов, не понаслышке знающих реестр Windows.
Заранее буду нижайше кланяться за оказанную помощь.

Мое видение проблемы, и исходя из поставленной мне задачи представил такой интерфейс (см. изображение).

[img=http://www.sql.ru/images/интерфейс_утилиты.jpg]

В левый фрейм окна понадобиться включить такие компоненты Visual Basic 6.0 как TreeView и ImageList.
В правый фрейм окна - ListView.

Теперь по поводу кустов реестра отображаемых в левом фрейме окна. Это разделы реестра (см. изображение):
HKEY_CURRENT_USER и HKEY_USERS и их подразделы - Software и те подразделы, которые в него войдут.
Предполагается (временно вымышленные названия) в Software: Program A, Program B и т.п. (как пример дерева).

Любой из подразделов - "Program" предполагается описать в инициализационном файле (INI-файл) и только он должен присутствовать в TreeView. При этом должна остаться возможность работать
со всем этим "набором" через API-функции: редактирование значений имен отображенных в ListView параметров установленных приложений Windows (файл .ini).

Значения параметров, которые подлежат отображению и редактированию:
1. значение параметра (По умолчанию) тип REG_SZ - пока не решено нужно ли оно вообще, но пусть будет.
2. значения, имена которых принадлежат к типу REG_DWORD.

Небольшой пример INI-файла (по правилам штатного редактора реестра):

windows registry editor 5.00
<пустая строка>
[HKEY_CURRENT_USER\Software\Program A]
"Table00"=dword:00000000
"Table01"=dword:00800000
<пустая строка>
[HKEY_USERS\.DEFAULT\Software\Program A]
"параметр"="значение"
<пустая строка>

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

P.S. Ничего себе "замутил" вопросик, аж сам "запарился" пока писал.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742056
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742106
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, ты как-то странно подошел к вопросу - мол напишите мне все....

Разбивай на части, части на более мелкие части и решай по отдельности
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742117
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
ну да , а то так как то не интересно ))
и я бы поучился заодно
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742119
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА вообще, ты как-то странно подошел к вопросу - мол напишите мне все....

Я старался - написать корректно, но как получилось так получилось и теперь не исправить. Если немного в сторону от темы, то я по национальности поляк и не владею русским яз. на столько,
чтоб не допустить ни единой ошибки. Ну, это так... Я вообще не имел ввиду написать половину программы за меня. И знаете, сколько там еще кроме этого. И интерфейс мне не нужен!
Это я для наглядности материала, чтоб визуально...
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742125
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, где мне еще ждать помощи, разве только в Microsoft...
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742129
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admи я бы поучился заодно


... а с картинкой это у Вас "клёва" подучилось - не возражаю!
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742130
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин67,
вытаскивайте код свой лучше))
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742142
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admВалентин67,
вытаскивайте код свой лучше))

Имелось в виду - код "в студию"!? А какой в этом смысл. Вообще кода еще пока нет ("все в голове, а голова на плечах"), но написать его не составит огромного труда, только время.
Вся загвоздка в вопросе, который задан. Поначалу это предвидел и хотел разобраться, как это можно сделать - отнюдь не без помощи. Иначе, зачем бы мне просить...
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742144
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу только предложить исходники, когда проект будет закончен. Может, кто изъявит желание "покопаться" в коде готовой утилиты.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742150
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин67,
Валентин67со всем этим "набором" через API-функции
Игорь Горбонос вам нужен )
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742159
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admВалентин67со всем этим "набором" через API-функции
Игорь Горбонос вам нужен )

Да, но он наверное за прошлый раз на меня обиделся за VB.Net, хотя я не предполагал, что наступлю...
Просто Эндрю нужно поначалу в VB разобраться. Вон видите, что и я еще не все знаю, а уже потом и с .NET можно пробовать.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742164
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, простите! Это был (просмотрев "курилку") не Игорь Горбонос, а другой.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742165
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин67,

может пригодится , вывод файлов ,очень удобный способ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Declare Function DlgDirList Lib "user32.dll" Alias "DlgDirListA" ( _
                                    ByVal hDlg As Long, _
                                    ByVal lpPathSpec As String, _
                                    ByVal nIDListBox As Long, _
                                    ByVal nIDStaticPath As Long, _
                                    ByVal wFileType As Long) As Long
Private Declare Function GetDlgCtrlID Lib "user32.dll" (ByVal hwnd As Long) As Long

Private Sub Form_Load()
    Dim ID As Long
    ID = GetDlgCtrlID(ByVal List1.hwnd)
    DlgDirList Me.hwnd, ByVal "C:\Windows\System32", ByVal ID, ByVal  0 , ByVal  0 
End Sub
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742172
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин67,
по вашей теме
Итак, начнем:
1. Нажмите кнопку "Пуск"
2. Выберите меню "Выполнить"
3. В появившемся диалоговом окне, в текстовое поле впишем: regedit
4. Нажмем кнопку "ОК"
5. В открывшемся редакторе реестра, выберем меню Реестр\Экспорт файла реестра
6. Впишем любое, понравившееся нам имя файла, и нажмем кнопку "Сохранить"
Теперь я за Вас спокоен, и мы можем перейти к нашей статье. Почему же такое "строгое" начало? Все дело в том, что Windows хранит в реестре все свои настройки и настройки программ, которые в нем работают. Начиная от внешнего графического вида и кончая соответствием расширений файлов их программам. Поэтому любое неграмотное вмешательство в реестр, может привести к тому, что Ваш Windows …
Необходимость в месте хранения информации возникла, наверно, с момента создания самой первой операционной системы (ОС). И по мере усложнения ОС – усложнялось и хранение самой информации о ней.
До появления Win 95 эта информация хранилась в многочисленных ini-файлах (директория Windows/System). Однако, по мере наращивания мощностей операционной системы – это становилось все более неудобным. И Win 95, уже как новая платформа, практически полностью перешел на хранение информации в реестре. Практически полностью – так мы говорим потому, что "осколки старого" все еще живы даже в Win Me (например, Win.ini, System.ini).
Visual Basic, как и любая другая среда программирования, должна уметь обращаться к информации системы. Что он и делает, используя ряд встроенных функций (см. Часть 1).
Но и тут все далеко неоднозначно. Если в VB3 и VB4 с помощью этих функций мы могли обратиться к любому ini-файлу, то, начиная с VB5, данные функции работают только с реестром и только с небольшой веточкой в нем. По-видимому, разработчики VB, предвидя нарастание увлечения программированием на VB и VBA, решили обезопасить реестр от вмешательства дилетантов. В большинстве работ начинающих программистов – этого вполне достаточно. А вот работа с ini-файлами теперь возможна только через API-функции (?). Как работать с ними см. Часть 2.
Ну и, наконец, мы считаем себя уже "маститыми" программистами и работать хотим со всем реестром. Бейсик позволяет делать и это, но опять же работая через API-функции. Как это делается, мы будем изучать в Части 3.
Часть 1. Встроенные функции работы с реестром в Visual Basic.

Таких функций всего четыре:
Имя функции
Описание функции
Код: plaintext
GetSetting
Получить значение параметра
Код: plaintext
GetAllSettings
Получить массив значений в указанной секции
Код: plaintext
SaveSetting
Сохранить значение параметра
Код: plaintext
DeleteSetting
Удалить параметр (секцию)
Все они работают с одной конкретной веткой реестра, а именно:
Код: plaintext
HKEY_CURRENT_USER/SOFTWARE/VB and VBA Program Settings/
. Обращение к данной ветке, происходит автоматически внутри функции, и поэтому прописывать столь длинный путь нет необходимости. Давайте чуть-чуть подробнее остановимся на каждой из этих функций.
Код: plaintext
1.
2.
GetSetting и SaveSetting – с ними Вы будете встречаться чаще всего.
GetSetting(appname, section, key[, default])
SaveSetting appname, section, key, setting
appname – строковый параметр, определяет имя приложения и/или проекта, где будут храниться данные. В 99,9 % случаев для каждой программы достаточно одного значения appname. Чтобы не забивать себе голову ненужными вещами, а спустя некоторое время не заниматься длительными поисками в реестре (где же это у меня хранится?), удобней всего использовать объект App (например, App.EXEName).
section – так же строковый параметр, определяет имя подпапки, где хранятся все значения. Таких папок может быть от одной до … Т.е. здесь Вы формируете наличие и расположение папок, так как Вам удобно.
key – строковый параметр, имя, под которым будет храниться Ваше значение. Как рекомендация, давайте ему осмысленные значения.
setting – непосредственно само сохраняемое значение.
[, default] – судя по квадратным скобкам, Вы уже догадались, что это необязательный параметр. Однако желательно все же его заполнять. По крайней мере – это избавит Вас от громоздкой проверки при запуске приложения самый первый раз, когда еще ничего в реестре Вашей программой не прописано.
Для закрепления материала маленький примерчик, демонстрирующий эти две функции.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Form_Load()
    Me.Left = GetSetting(App.EXEName, "Position", "Left",  0 )
    Me.Top = GetSetting(App.EXEName, "Position", "Top",  0 )
    Me.Caption = GetSetting(App.EXEName, "Other", "Caption", "Проба")
End Sub
Private Sub Form_Unload(Cancel As Integer)
    SaveSetting App.EXEName, "Position", "Left", Me.Left
    SaveSetting App.EXEName, "Position", "Top", Me.Top
    SaveSetting App.EXEName, "Other", "Caption", Me.Caption
End Sub
Здесь, при загрузке формы, в самый первый раз, в связи с отсутствием записей в реестре, используются значения по умолчанию. Если Вы после запуска переместили форму, то на выходе новые координаты будут записаны в реестр. При следующем запуске происходит считывание параметров (игнорируя значение по умолчанию) и расположение формы в нужном месте. "Кувыркания" с заголовком здесь приведены просто как пример создания нескольких папок для одного приложения. Теперь, если Вы откроете редактор реестра и пройдете по веточке HKEY_CURRENT_USER/SOFTWARE/VB and VBA Program Settings/, то увидите там папку Project1 (если проект не переименовывался!), а в ней две подпапки "Position" и "Other", с сохраненными в них значениями.
Функция DeleteSetting имеет чуть более простую структуру:

Код: plaintext
DeleteSetting appname, section[, key]
Параметры appname, section, key – имеют те же описания, что и в предыдущих функциях.
И снова небольшой пример. Добавьте код в Form_Unload, чтобы он выглядел так:
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Form_Unload(Cancel As Integer)
    SaveSetting App.EXEName, "Position", "Left", Me.Left
    SaveSetting App.EXEName, "Position", "Top", Me.Top
    SaveSetting App.EXEName, "Other", "Caption", Me.Caption
    On Error Resume Next
    DeleteSetting App.EXEName, "Position", "Left"
End Sub
И при следующей загрузке формы, не найдя нужного параметра, она будет позиционирована по левому краю. Обратите внимание на включение обработчика ошибок. Он необходим для того, чтобы в случае не нахождения данного параметра, не происходило аварийное завершение программы.
Данная строка удаляет только один параметр ("Left"). Если же нам необходимо удалить весь подраздел, то строка должна выглядеть следующим образом:

Код: plaintext
1.
On Error Resume Next
DeleteSetting App.EXEName, "Position"
Ну и, наконец, последняя встроенная VB-функция, для работы с реестром.
Код: plaintext
GetAllSettings(appname, section)
Как нетрудно догадаться appname, section – описывают все те же самые параметры, что и предыдущие функции. Данная функция служит для получения массива параметров.
Разместим на форме кнопку, которая будет считывать массив параметров подпапки "Position" и выдавать ее в заголовок. Не забудьте удалить последние две строки в Form_Unload, посвященные, удалению параметров.
Добавим код для кнопки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private Sub Command1_Click()
    Dim arrSettings As Variant, intLoop As Integer
    Me.Caption = vbNullString
    arrSettings = GetAllSettings(App.EXEName, "Position")
    For intLoop = LBound(arrSettings,  1 ) To UBound(arrSettings,  1 )
        Me.Caption = Me.Caption & " " & arrSettings(intLoop,  0 ) & "=" & arrSettings(intLoop,  1 )
    Next
End Sub
Чуть поподробнее: arrSettings объявляем как Variant, т.к. в дальнейшем она будет нести функции двумерного массива. intLoop – переменная-счетчик для цикла For-Next.
С помощью функции GetAllSettings, считываем в переменную arrSettings двумерный массив значений. Затем циклом For-Next проходим от первого значения до последнего (в нашем случае их только два). И внутри цикла присваиваем заголовку программы считываемые значения. Обратите внимание, что второй компонент в массиве может принимать только значения 0 или 1. Если 0, то считывается заголовок параметра (key). Если 1, то считывается его значение (setting).
На этом со встроенными функциями бейсика, посвященных реестру можно закончить.
Работа с ini-файлами.
Как говорилось выше, ini-файлы – это наследие прошлого. Хорошо это или плохо? Однозначного ответа нет. Существует много сторонников ini-файлов, и их основным аргументом является доступность и легкость в редактировании. Что такое, по сути, ini-файл? Это текстовый файл, разбитый внутри на секции. Заголовок каждой секции заключен в квадратные скобки. Каждая секция состоит из строк, представляющих собой название параметра (ключ) и через равно (=) – его значение.
Все элементарно просто и понятно для восприятия. Однако это же самое является и отрицательным моментом. Учитывая, что нынешний Windows занимает порядка 150-300 мегабайт, имеет массу встроенных программ и каждой из них необходим свой собственный ini-файл. А, кроме того, мы инсталлируем у себя, как минимум, Офис. А как максимум еще 3-4 десятка программ. Представляете в какую "выгребную яму" превратится директория, хранящая ini-файлы? Кроме того, из-за своей простоты, ini-файлы не могут предоставить иерархическую структуру вложенности, то, что так легко удается реестру.
И в заключение: ini-файл – это отдельный файл, т.е. принципиально он может храниться в любом месте, а не только Windows\System. Насколько усложнится поиск необходимого файла, из-за кажущейся "простоты редактирования". Однако, несмотря на все минусы ini-файлы продолжают жить. Не так вольготно, как в Windows 3x, но все же. По-прежнему сохраняются 2 основных файла, несущих информацию о самом Windows (win.ini, system.ini). Поэтому давайте разберемся, как все-таки с ними надо работать. Встроенных VB-функций для работы с ini-файлами нет, однако существуют API-функции. Излагаемый ниже материал полностью приведен в Листинге. Его можно просто скопировать и оформить как отдельный модуль или класс, который подключается по мере надобности.

Код: plaintext
1.
2.
- Private Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal strSection As String, ByVal strKeyName As String, ByVal lngDefault As Long, ByVal strFileName As String) As Long
- Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal strSection As String, ByVal strKeyName As String, ByVal strDefault As String, ByVal strReturned As String, ByVal lngSize As Long, ByVal strFileName As String) As Long
- Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal strSection As String, ByVal strKeyNam As String, ByVal strValue As String, ByVal strFileName As String) As Long
Приведенные здесь три основные функции служат для работы с ini-файлами 2 на запись (для строкового и целочисленного параметров) и одна на чтение. Кроме того, существует еще три API-функции (по тому же принципу), но работающие ТОЛЬКО с одним файлом WIN.INI
Код: plaintext
1.
2.
- Private Declare Function GetProfileInt Lib "kernel32" Alias "GetProfileIntA" (ByVal strSection As String, ByVal strKeyName As String, ByVal lngDefault As Long) As Integer
- Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal strSection As String, ByVal strKeyName As String, ByVal strDefault As String, ByVal strReturned As String, ByVal intSize As Long) As Long
- Private Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" (ByVal strSection As String, ByVal strKeyName As String, ByVal strValue As String) As Integer
Нетрудно заметить, что последние три функции, практически полностью повторяют первые, за исключением одного параметра – путь файла. Однако, благодаря этому, скорость их работы значительно выше. Внутренняя структура представленных API-функций достаточно проста, и, в принципе их можно использовать "напрямую" в своих приложениях. Однако я рекомендую все же сделать функции - "обертки", так как API-функции не поддерживают обработку ошибок, и лучше это сделать самому, не дожидаясь, когда Ваша программа "скоропостижно" закончит работу.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Function GetValueInteger(strSection As String, strKey As String, strFile As String) As Integer
    Dim intValue As Integer
 
    On Error GoTo PROC_ERR
    intValue = GetPrivateProfileInt(strSection, strKey,  0 , strFile)
    GetValueInteger = intValue
    PROC_EXIT:
    Exit Function
    PROC_ERR:
    MsgBox "Ошибка: <" & Err.Number & "> - " & Err.Description, vbExclamation + vbOKOnly, "GetValueInteger"
    Resume PROC_EXIT
End Function
Данная функция возвращает целочисленное значение из ini-файла. Где имя секции – strSection, имя ключа – strKey и strFile – полный путь к ini-файлу.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Function GetValueString(strSection As String, strKey As String, strFile As String) As String
    Dim strBuffer As String *  256 
    Dim intSize As Integer
 
    On Error GoTo PROC_ERR
    intSize = GetPrivateProfileString(strSection, strKey, "", strBuffer,  256 , strFile)
    GetValueString = Left$(strBuffer, intSize)
    PROC_EXIT:
    Exit Function
    PROC_ERR:
    MsgBox "Ошибка: <" & Err.Number & "> - " & Err.Description, vbExclamation + vbOKOnly, "GetValueString"
    Resume PROC_EXIT
End Function
Данная функция возвращает строковое значение из ini-файла. Где имя секции – strSection, имя ключа – strKey и strFile – полный путь к ini-файлу. Обратите внимание, что вначале резервируется пустая строка, а из результата функции выкидываются пустоты.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Function SetValue(strSection As String, strKey As String, strValue As String, strFile As String) As Integer
    Dim intStatus As Integer
 
    On Error GoTo PROC_ERR
    intStatus = WritePrivateProfileString(strSection, strKey, strValue, strFile)
    SetValue = (intStatus <>  0 )
    PROC_EXIT:
    Exit Function
    PROC_ERR:
    MsgBox "Ошибка: <" & Err.Number & "> - " & Err.Description, vbExclamation + vbOKOnly, "SetValue"
    Resume PROC_EXIT
End Function
Данная функция записывает в файл значение strValue и возвращает целочисленное значение: True, если запись произведена и False, в случае ошибки записи. Имя секции – strSection, имя ключа – strKey и strFile – полный путь к ini-файлу. Как уже говорилось выше, работа с файлом WIN.INI строится аналогичным образом. Поэтому повторяться здесь не буду. До этого момента все было легко и просто. Однако встречаются ситуации, когда нам необходимо считать все значения в конкретной секции. И данные функции нам не помогут. Оказывается, существует еще одна API-функция, которая нам в этом поможет:
Код: plaintext
- Private Declare Function GetPrivateProfileSection Lib "KERNEL32" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Для нее так же напишем функцию-"обертку".
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Public Function GetSection(strSection As String, strFile As String)
    Dim strBuffer As String *  512 
    Dim intSize As Integer
    Dim strTemp As String
    Dim intTemp As Integer
    Dim Index As Integer
    Dim arrSection() As String
    Dim key As String, value As String, str As String
 
    On Error GoTo PROC_ERR
    intSize = GetPrivateProfileSection(strSection, strBuffer,  512 , strFile)
    strTemp = Left$(strBuffer, intSize)
    Do Until Len(strTemp) =  0 
        intTemp = InStr( 1 , strTemp, Chr( 0 ))
        ReDim Preserve arrSection( 1 , Index) As String
        str = Mid(strTemp,  1 , intTemp)
        key = Mid(str,  1 , InStr( 1 , str, "=") -  1 )
        value = Mid(str, InStr( 1 , str, "=") +  1 )
        arrSection( 0 , Index) = key
        arrSection( 1 , Index) = value
        Index = Index +  1 
        strTemp = Mid(strTemp, intTemp +  1 , Len(strTemp))
    Loop
    GetSection = arrSection
    PROC_EXIT:
    Exit Function
    PROC_ERR:
    MsgBox "Ошибка: <" & Err.Number & "> - " & Err.Description, vbExclamation + vbOKOnly, "GetValueString"
    Resume PROC_EXIT
End Function
Данная функция возвращает двумерный массив значений конкретной секции. Вначале, с помощью API-функции в буферизованную строку (strBuffer) считывается значение всей секции и определяется количество знаков (intSize). Далее, обрезаем строку от пустот и передаем это значение переменной strTemp. Затем в цикле Do-Loop считываем значение каждой строки (они разделены символом Chr(0)) и, предварительно разделив их на имя ключа и его значение, сбрасываем в двумерный массив. Первый параметр в массиве – будет означать, что мы считываем: имя ключа (0) или его значение (1).
Давайте сделаем маленький пример, чтобы стало понятнее, как работает наша функция. В качестве примера возьмем всем известную игру "Минер". Расположите на форме кнопку и список. При нажатии на кнопку в список последовательно передаются значения из секции [Сапер].

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Command1_Click()
    Dim i As Integer, arrList As Variant
 
    List1.Clear
    arrList = GetSection("Сапер", "C:\Windows\winmine.ini")
     For i =  0  To UBound(arrList,  2 )
        List1.AddItem arrList( 1 , i)
    Next
End Sub
Обратите внимание, что если мы запишем arrList(0, i), то будем передавать уже не значения, а имена ключей. Думаю на этом раздел, посвященный ini-файлам, можно закончить.
Часть 3. Работа с реестром.
Теперь мы подходим к самому главному: работе с реестром. Реестр в Windows служит хранилищем всех настроек. Любое неадекватное вмешательство может привести к краху всей системы. Поэтому, если Вы не выполнили указаний, данных в самом начале статьи – сейчас самое время их сделать. Остановимся чуть подробнее на структуре реестра. 2 основных его преимущества: сохранение всей информации в едином месте и иерархическая структура. Начнем с "самого верха". Здесь имеется 6 основных разделов (ключей):

Код: plaintext
1.
2.
3.
4.
5.
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA
Каждый из них отвечает за "свой" раздел работы. HKEY_CLASSES_ROOT – содержит данные, связывающие типы файлов (по расширениям) с приложениями, работающими с ними.
Код: plaintext
1.
2.
3.
4.
HKEY_CURRENT_USER – содержит данные, которые описывают профиль пользователя, т.е. внешний вид и поведение рабочего стола, данные различных программ, сетевые соединения. Именно здесь и сохраняются все основные настройки приложений, используемых в Windows, в том числе и VB.
HKEY_LOCAL_MACHINE – здесь хранятся настройки компьютера, общие для всех зарегистрированных пользователей.
HKEY_USERS – этот раздел хранит информацию о профилях каждого из зарегистрированных пользователей.
HKEY_CURRENT_CONFIG – включает в себя информацию о шрифтах, зарегистрированных на данном компьютере, а так же данные о принтерах.
HKEY_DYN_DATA – самый часто обновляемый раздел реестра, т.к. включает в себя часто изменяющиеся динамические данные.
Visual Basic не имеет встроенных функций для работы с любой частью реестра. Тот небольшой участок реестра, к которому допуск из VB напрямую разрешен, был подробно описан в первой части данной статьи. Однако существует "палочка-выручалочка" – это API-функции. Задекларировав их вначале, из программы можно обратиться в любой момент к любому разделу реестра. Перечень функций для работы с реестром (все они начинаются с Reg), а так же константы приведены в листинге. Итак, основные функции и что они выполняют:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
API-функция	 Описание
RegCloseKey	 Освобождает манипулятор раздела
RegCreateKeyEx	 Создает раздел, а если раздел существует, то просто открывает его. Это очень удобно, когда неизвестно: существует данный раздел реестра или нет
RegDeleteKey	 Удаляет раздел со всеми входящими в него подразделами
RegDeleteValue	 Удаляет заданный параметр из конкретного раздела
RegEnumKeyEx	 Возвращает имеющийся подраздел из конкретного раздела. Удобно использовать в цикле для получения всех подразделов конкретного раздела
RegEnumValue	 Аналогична предыдущей функции, с той лишь разницей, что возвращает параметр из конкретного раздела
RegOpenKeyEx	 Открывает заданный раздел
RegQueryValueEx	 Получает информацию о типе и данные для параметра с заданным именем.
RegSetValueEx	 Сохраняет данные в параметре реестра.
Проверять все производимые нами изменения можно через редактор реестра. Обычно он располагается в директории Windows (файл regedit.exe). Не забудьте, что после проведенных изменений в реестре, чтобы эти изменения увидеть, редактор необходимо обновить (клавиша F5). Для наших примеров мы будем использовать стандартную ветку реестра:
HKEY_CURRENT_USER\SOFTWARE\VB AND VBA PROGRAM SETTINGS
А когда Вы поймете суть работы функций, то заменить пути сохранения в реестре необходимых Вам данных не составит труда.
Создание раздела.
Создадим новый подраздел TestRegistry в вышеуказанной ветке. Расположим на форме кнопку
Код: plaintext
1.
2.
3.
4.
Command1. В Form_Load инициализируем наши переменные, отвечающие за путь в реестре.
Private Create As Long
Private SubKey As String
Private hKey As Long
Код: plaintext
1.
2.
3.
Private Sub Form_Load()
    SubKey = "SOFTWARE\VB AND VBA PROGRAM SETTINGS"
    hKey = HKEY_CURRENT_USER
End Sub
Примечание: для значения переменной hKey берется константа, объявленная в модуле.
В обработке события кнопки попросим пользователя ввести Имя Подраздела. Затем проследим, чтобы перед названием стоял знак "\". И, наконец, проверим функцию, создающую новый подраздел.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Private Sub Command1_Click()
    On Error GoTo ErrorRoutineErr:

    Dim Reply As String

    Reply = InputBox("Введите имя для создания подраздела:" & vbCrLf & "в разделе " & SubKey)
    If Reply = "" Then
        Exit Sub
    End If

    If Mid(Reply,  1 ,  1 ) <> "\" Then
        Reply = "\" & Reply
    End If

    If Reply = "" Then
        MsgBox "Не могу создать подраздел."
        Exit Sub
    End If

    If CreateRegKey(Reply) Then
        MsgBox "Создан новый подраздел"
    Else
        MsgBox "Не могу создать подраздел."
    End If
    Exit Sub

    ErrorRoutineErr:
    MsgBox "Ошибка: <" & Err.Number & "> - " & Err.Description, vbExclamation + vbOKOnly, "Созданиие подраздела"
End Sub
И самое главное: внутренняя функция, создающая новый подраздел и возвращающая True, если все завершилось удачно и False, если раздел не был создан. В конце освобождаем манипулятор раздела.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Function CreateRegKey(NewSubKey As String) As Boolean

    On Error GoTo ErrorRoutineErr: 

    Dim phkResult As Long 
    Dim SA As SECURITY_ATTRIBUTES 

    CreateRegKey = (RegCreateKeyEx(hKey, SubKey & NewSubKey,  0 , "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, SA, phkResult, Create) = ERROR_SUCCESS)

    RegCloseKey phkResult
    Exit Function

    ErrorRoutineErr:
    MsgBox "Ошибка: <" & Err.Number & "> - " & Err.Description, vbExclamation + vbOKOnly, "Созданиие подраздела"
    CreateRegKey = False

End Function
Обратите внимание, что если данный раздел уже существует, то ошибки не выдается, а просто данный раздел открывается.
Создание параметра.
После того, как раздел или подраздел создан, необходимо в нем создать параметр и присвоить ему значение. Допустим, в предыдущем шаге мы создали подраздел "TestRegistry". Теперь внесем имя параметра "Test1" и его значение "New Value". Для этого нам понадобится все та же форма и вторая кнопка на ней Command2. Инициализация переменных у нас уже описана выше, в предыдущем шаге. Добавим обработку нажатия на вторую кнопку. Запросим у пользователя сначала имя параметра, а затем его значение. И если все ОК – то сделаем запись.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub Command2_Click()
    Dim Reply1 As String, Reply2 As String

    SubKey = SubKey & "\TestRegistry"

    Reply1 = InputBox("Введите имя параметра:" & vbCrLf & "в разделе: " & SubKey)
    If Reply1 = "" Then
        Exit Sub
    End If

    Reply2 = InputBox("Введите значение параметра:" & vbCrLf & "в разделе: " & SubKey & vbCrLf & "для параметра: " & Reply1)
    If Reply2 = "" Then
        Exit Sub
    End If

    If Not SetRegValue(hKey, SubKey, Reply1, Reply2) Then
        MsgBox "Не могу создать параметр."
    End If
End Sub
Теперь, опишем саму функцию, выполняющую все это. Вначале откроем (а если нет – то создадим) необходимый раздел (подраздел). Затем запишем в него имя и значение параметра. И, в конце, закрываем текущий раздел, освобождая манипулятор.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function SetRegValue(hKey As Long, sSubKey As String, ByVal sSetValue As String, ByVal sValue As String) As Boolean 

    On Error GoTo ErrorRoutineErr:

    Dim phkResult As Long
    Dim lResult As Long
    Dim SA As SECURITY_ATTRIBUTES

    RegCreateKeyEx hKey, sSubKey,  0 , "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, SA, phkResult, Create
    lResult = RegSetValueEx(phkResult, sSetValue,  0 , REG_SZ, sValue, CLng(Len(sValue) +  1 ))
    RegCloseKey phkResult

    SetRegValue = (lResult = ERROR_SUCCESS)
    Exit Function

    ErrorRoutineErr::
    MsgBox "Ошибка: <" & Err.Number & "> - " & Err.Description, vbExclamation + vbOKOnly, "Созданиие параметра"
    SetRegValue = False

End Function
Удалить параметр.
Итак, у нас создан подраздел "TestRegistry", а в нем параметр "Test1". Располагаем на форме третью кнопку – Command3. Как и во всех предыдущих наших манипуляциях, вначале мы должны открыть раздел, а по окончании работы закрыть его, освободив манипулятор. Удаление параметра производится с помощью API-функции RegDeleteValue.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub Command3_Click()
    Dim phkResult As Long
    Dim SA As SECURITY_ATTRIBUTES

    SubKey = "SOFTWARE\VB AND VBA PROGRAM SETTINGS\TestRegistry"

    RegCreateKeyEx hKey, SubKey,  0 , "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, SA, phkResult, Create

    If RegDeleteValue(phkResult, "Test1") = ERROR_SUCCESS Then
        MsgBox "Параметр удален"
    Else
        MsgBox "Не могу удалить параметр"
    End If

    RegCloseKey phkResult
End Sub
Удалить раздел.
В принципе, все различия между удалением параметра и удалением раздела (подраздела), заключаются только в использовании другой API-функции: RegDeleteKey. Все остальное – идентично. Размещаем на форме четвертую кнопку и удаляем раздел "TestRegistry".

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub Command4_Click()
    Dim phkResult As Long
    Dim SA As SECURITY_ATTRIBUTES

    SubKey = "SOFTWARE\VB AND VBA PROGRAM SETTINGS"

    RegCreateKeyEx hKey, SubKey,  0 , "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, SA, phkResult, Create

    If RegDeleteKey(phkResult, "TestRegistry") = ERROR_SUCCESS Then
        MsgBox "Подраздел удален"
    Else
        RegCloseKey phkResult
        MsgBox "Не могу удалить подраздел"
    End If
End Sub
Получение значения раздела.
В связи с тем, что мы удалили в предыдущей работе наш подраздел и его содержимое, давайте сначала восстановим удаленные параметры: Запустим на выполнение сначала первую кнопку, а затем вторую. Проверим через Regedit. У нас должно получиться: подраздел "TestRegistry", а в нем параметр "Test1" со значением "New Value". Добавим очередную кнопку Command5.

Код: plaintext
1.
2.
3.
Private Sub Command5_Click()
    SubKey = "SOFTWARE\VB AND VBA PROGRAM SETTINGS\TestRegistry"
    MsgBox GetValue(hKey, SubKey, "Test1", "Ничего нет")
End Sub
Теперь займемся написанием самой функции. Как всегда, вначале открываем раздел, а в конце не забудем освободить манипулятор раздела. С помощью API-функции RegQueryValueEx получаем значение параметра. Полученный результат возвращаем функции, а в случае его не нахождения – присваиваем значение sDefault.
Обратите внимание, что сама функция возвращает тип Variant, т.к. значение параметра может быть не только строковым числом.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Function GetValue(hKey As Long, sSubKey As String, sKey As String, sDefault As String) As Variant

    On Error GoTo ErrorRoutineErr

    Dim phkResult As Long
    Dim lResult As Long
    Dim sBuffer As String
    Dim lBuffSize As Long

'Создаем буфер
    sBuffer = Space( 255 )
    lBuffSize = Len(sBuffer)

    RegOpenKeyEx hKey, sSubKey,  0 ,  1 , phkResult
    lResult = RegQueryValueEx(phkResult, sKey,  0 ,  0 , sBuffer, lBuffSize)
    RegCloseKey phkResult

    If lResult = ERROR_SUCCESS Then
        GetValue = Left(sBuffer, lBuffSize -  1 )
    Else
        GetValue = sDefault
    End If
    Exit Function

    ErrorRoutineErr::
    MsgBox "Ошибка: <" & Err.Number & "> - " & Err.Description, vbExclamation + vbOKOnly, "Получение параметра"
    GetValue = ""
End Function
Получение всех подразделов конкретного раздела и получение всех значений раздела.
Подробно изучив выше перечисленные функции и процедуры, Вы, при необходимости, можете их использовать для получения названий подразделов или значений всех параметров подраздела. Собирать эти названия можно в массив или, например, напрямую – в ListBox. Перебор параметров осуществляется с помощью цикла Do … Loop (или While … Wend кому как привычнее), до тех пор пока искомое значение равно ERROR_SUCCESS.
Разобравшись со всеми функциями, Вы можете использовать представленный Листинг, как отдельный модуль, или преобразовать его в отдельный класс. Обратите внимание: в представленном листинге функции отображены в несколько ином виде – более глобальном.
Часть 4. Работа с реестром через подключаемые библиотеки.
Изначально эта часть не была запланирована для данной статьи. Подтолкнул меня к написанию один из "Советов…" Андрея Колесова и Ольги Павловой, которые вот уже на протяжении ряда лет публикующих в "Компьютер-Пресс" свои интересные находки по VB и VBA. Так вот, оказывается, что при инсталляции VB происходит установка на Ваш компьютер одной маленькой библиотеки (всего 32 Кб) - REGTOOL5.DLL. Для любознательных указываю полный путь: …\Program Files\Microsoft Visual Studio\Common\Tools\APE\REGTOOL5.DLL. Она содержит всего 4 функции для работы с реестром, однако использование этих функций значительно упрощает доступ к реестру.
Итак, для начала работы подключим данную библиотеку к нашему проекту (Проект Standard EXE; форма + 5 кнопок на ней). Для подключения выберем меню: Project/References и в открывшемся диалоговом окне отметим опцию Registry Access Functions. Не забудем нажать ОК :-). Теперь, когда библиотека подключена к проекту, небходимо объявить переменную. Делаем это в разделе деклараций

Код: plaintext
1.
2.
3.
4.
5.
Option Explicit
Dim Reg As Registry
При загрузке формы – инициализируем ее
Private Sub Form_Load()
    Set Reg = New Registry
End Sub
А при выгрузке – не забудем ее уничтожить.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Form_Unload(Cancel As Integer)
    Set Reg = Nothing
End Sub
Теперь займемся функциями. Как я говорил выше их всего  4 : UpdateKey, DeleteKey, GetKeyValue, GetNextValue. А так же имеется  5  констант:
Const HKEY_CLASSES_ROOT = - 2147483648  (&H80000000)
Const HKEY_CURRENT_USER = - 2147483647  (&H80000001)
Const HKEY_LOCAL_MACHINE = - 2147483646  (&H80000002)
Const HKEY_PERFORMANCE_DATA = - 2147483644  (&H80000004)
Const HKEY_USERS = - 2147483645  (&H80000003)
Результаты работы наших функций можно проверять через Редактор Реестра. Только не забудьте обновлять содержимое его окна после выполненных манипуляций (клавиша F5). Для нашего примера выберем все ту же (самую безопасную в смысле экспериментов) ветку реестра: HKEY_CURRENT_USER\SOFTWARE\VB and VBA Program Settings.
NB! Данная библиотека может работать с любой веткой реестра.
Присвоим нашей ПЕРВОЙ кнопке возможность создания нового параметра и значения для него.
Код: plaintext
1.
2.
3.
4.
Private Sub Command1_Click() 
    Reg.UpdateKey HKEY_CURRENT_USER, "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL", "FirstValue", "Test" 
    Reg.UpdateKey HKEY_CURRENT_USER, "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL", "SecondValue", "Test2" 
    MsgBox "Создана папка TestRegistryDLL и 2 параметра в ней" 
End Sub
Заметили интересную особенность? При отсутствии необходимой папки, она автоматически создается этой функцией. Кроме того, данная функция позволяет изменять значение уже существующего параметра. Что мы и покажем на примере ВТОРОЙ кнопки.
Код: plaintext
1.
2.
3.
Private Sub Command2_Click() 
    Reg.UpdateKey HKEY_CURRENT_USER, "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL", "SecondValue", "New Test"
    MsgBox "Изменено значение 2-го параметра в папке TestRegistryDLL"
End Sub
Т.е. обращение данной функции идет то же самое, однако, в случае нахождения указанного параметра она изменяет у него значение. Ну что ж, двинулись дальше. Создавать и изменять параметры мы научились – теперь самое время научиться их удалять. К ТРЕТЬЕЙ кнопке привяжем функцию удаления. Если Вы внимательно изучали данные функции (например через Object Browser), то, наверное, заметили, что все функции возвращают тип Boolean. Воспользуемся этой замечательной возможностью для проверки эффективности работы нашей функции.
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Command3_Click()
    If Reg.DeleteKey(HKEY_CURRENT_USER,  "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL") Then
        MsgBox "Удалена папка TestRegistryDLL"
    Else
        MsgBox "Ничего не получилось :("
    End If
End Sub
NB! Данная функция удаляет целиком папку и в ней не предусмотрено удаление отдельно взятого параметра. Как мне кажется, это самый главный недостаток данной библиотеки, при всех остальных громадных плюсах.
Ну и, наконец, оставшиеся две функции служат для поиска (получения) значений указанных параметров. Запишем код для ЧЕТВЕРТОЙ кнопки. Основа кода взята из "Советов …" Андрея Колесова

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Command4_Click() 
    Dim KeyFound As Boolean, strValue As String 
    strValue = "" 
    KeyFound = Reg.GetKeyValue(HKEY_CURRENT_USER, "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL", "SecondValue", strValue) 
    If KeyFound Then 
        MsgBox strValue 
    Else 
        MsgBox "Такого параметра нет" 
    End If 
End Sub
Другая функция чуть-чуть посложнее (хотя принцип тот же, что и у предыдущей), она считывает последовательно все параметры и их значения.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Command5_Click() 
    Dim KeyFound As Boolean, strName As String, strValue As String 
    strValue = "" 
    Do 
        KeyFound = Reg.GetNextValue(HKEY_CURRENT_USER, "SOFTWARE\VB and VBA Program Settings\TestRegistryDLL", strName, strValue) 
        If KeyFound = False Then Exit Do 
        MsgBox strName & " = " & strValue 
    Loop While KeyFound 
    MsgBox "Больше параметров нет!" 
End Sub
На этом примере можно закончить работу с подключаемой библиотекой Registry Access Functions. В заключение хочется отметить необчно маленький для Microsoft размер и простоту в работе.
В заключение: Не только эта библиотека имеет доступ к реестру. Если Вы подключили к своему проекту библиотеку Word'а (начиная с версии 8) например для проверки орфографии, то параллельно, для получения значений реестра можно воспользоваться ее объектом System, а конкретнее свойствами PrivateProfileString и ProfileString. Что самое смешное, таких возможностей не имеет ни Excel, ни Access, ни PowerPoint, ни FrontPage. Ох уж этот Microsoft :).
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742299
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин67Shocker.ProА вообще, ты как-то странно подошел к вопросу - мол напишите мне все....
Я старался - написать корректно, но как получилось так получилось и теперь не исправить. Если немного в сторону от темы, то я по национальности поляк и не владею русским яз. на столько,
чтоб не допустить ни единой ошибки. Ну, это так... Я вообще не имел ввиду написать половину программы за меня. И знаете, сколько там еще кроме этого. И интерфейс мне не нужен!
Это я для наглядности материала, чтоб визуально...
Да не, пишешь ты вполне понятно.
Ты просто просишь подсказать, а что подсказать - не указываешь. Получается, что подсказать нужно все.
Тем временем сама эта задача состоит из множества частей, там и загрузка дерева и работа с ини-файлом и работа с реестром, форма создания/редактирвоания значения и т.п. Ты самостоятельно должен разработать общую схему работы приложения, мы можем подсказывать только детали. Ну или рано браться за такой проект, тренируйся на более простых.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742801
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProДа не, пишешь ты вполне понятно.
Ты просто просишь подсказать, а что подсказать - не указываешь. Получается, что подсказать нужно все, мы можем подсказывать только детали.

Признаю - "ступил на старости лет".

Вся проблема "крутится" вокруг семейства объектов Node. В частности метода Add (иерархия).
Каким образом можно построит дерево не ручками, а читая из файла, по структуре напоминающий файлы реестра с расширение REG. То есть,
как научить TreeView при построении дерева различать самому, где раздел реестра, где подраздел (суть отношений с предшествующим узлом).
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742824
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин67как научить TreeView при построении дерева различать самому, где раздел реестра, где подраздел (суть отношений с предшествующим узлом).

гм
ну есть у тебя строка "HKEY_CURRENT_USER\Software\Program A"
прежде всего, ее надо разбить с помощью Split на части.
Потом последовательно добавить узлы, в дерево, игнорируя ошибки (так как некоторые узлы могли туда быть добавлены ранее)

не самое оптимальное решение по скорости (некоторые узлы там уже могут быть, будет много игнорируемых ошибок) - но если узлов не много, то не страшно
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742888
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем нужно писать очередной велосипед, когда уже таких редакторов готтовых и бесплатных пруд-пруди. поищи лучше готовый и не мучайся
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742899
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneзачем нужно писать очередной велосипед, когда уже таких редакторов готтовых и бесплатных пруд-пруди. поищи лучше готовый и не мучайся
Учицца, учицца и еще раз учицца. Вполне себе неплохое учебное задание.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742906
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneзачем нужно писать очередной велосипед, когда уже таких редакторов готтовых и бесплатных пруд-пруди. поищи лучше готовый и не мучайся
Учицца, учицца и еще раз учицца. Вполне себе неплохое учебное задание.

ну если разве что в качестве учебного задания, то тогда да
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742912
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот очень неплохой пример редактора INI-файлов.
можете взять себе за основу.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742919
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proдобавить узлы, в дерево, игнорируя ошибки

Как корректно устроить такую проверку.

Shocker.Proне самое оптимальное решение по скорости, но если узлов не много, то не страшно

Узлов действительно не много наберется.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742934
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин67Как корректно устроить такую проверку.
Название узла давать не только как имя, но и как ключ узла. Тогда повторно узел с таким же ключом не добавится
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742969
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленький пример для чтения ключей из реестра, написал на VB.NET 2008 за 20 минут где-то. Там намного проще... Класс предоставляет много функций для управления, перечисления, а также прав доступа. Добавляет в TreeView ключи, а в ListView имена параметров
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742994
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADМаленький пример для чтения ключей из реестра, написал на VB.NET 2008 за 20 минут где-то. Там намного проще... Класс предоставляет много функций для управления, перечисления, а также прав доступа. Добавляет в TreeView ключи, а в ListView имена параметров

работает, но на некоторых ветках security exception , не хватает прав на чтение из реестра и тп
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36742999
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneзачем нужно писать очередной велосипед, поищи лучше готовый и не мучайся

В том-то и дело, что готовые не подходят по некоторым причинам. Да и делаю я не себе, попросили помочь на одном из форумов.
Пусть лучше эта утилита будет для меня способом больше научиться работать с TreeView.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36743010
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADМаленький пример для чтения ключей из реестра, написал на VB.NET. Там намного проще... Добавляет в TreeView ключи, а в ListView имена параметров

VSVLAD, спасибо!
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36743012
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
ну это и понятно = ) нужно кучу проверок делать, плюс когда в тривью занесём ключ, его уже может и не быть в реестре, поэтому кучу валидации написать. Поэтому и пример это. Если же на VB6 писать - то у меня есть клас для работы с реестром и INI могу прикрепить, но там намного меньше функций чем в .NET
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36743040
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADу меня есть клас для работы с реестром и INI могу прикрепить

Если можно, то Да (прикрепите)! Ребята, я благодарен Вам всем за помощь.
Попробую теперь со всем этим не спеша разобраться, поэкспериментировать с кодом (своим и вашим).
Ну, пожалуй пока не будет больше вопросов.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36743162
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин67,
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36743172
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cRegWork - класс для работы с реестром. Ключи и параметры не перечисляет, ещё не дописано. Удалять ключи уммеет последовательно, целую ветку удалить нельзя.
mINI - модуль для работы с INI файлом
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36743427
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Валентин67
> Да, но он наверное за прошлый раз на меня обиделся за VB.Net,

Валентин, это ж каким зверем я тебе представляюсь, что ты ТАК подумал

На самом деле ничего военного нет, но примера тоже нет, лет 8 назад я делал утилитку, создававшую пользователя и
дававшая этому пользователю определенные права на определенные ветки реестра и папки на диске. "Недавно" находил саму
утилитку, но давно потерял её исходный код. Поэтому если чего то спрашивай, помогу чем смогу, пока идет просто
теоретический разговор :)


> Пусть лучше эта утилита будет для меня способом больше научиться работать с TreeView.

Ты бы лучше изучал работу с TreeView на примере файловой системы :)



Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36744033
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносВалентин, это ж каким зверем я тебе представляюсь

Игорь, ошибся я, а исправить здесь нет такой возможности. Вы не обратили внимание на следующее сообщение.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36744583
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Валентин67

Я видел следующие сообщения и смайлики поставил, пытаясь показать что это шутка :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36746402
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогулявшись по "всемирной паутине" (Интернет), нашел библиотеку для работы с реестром, использование которой значительно упрощает (как пишет автор) доступ к реестру.
Библиотека абсолютно бесплатная. В архиве есть CHM-файл справки по работе с библиотекой. Если кому будет нужна, то здесь
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36746437
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин67Прогулявшись по "всемирной паутине" (Интернет), нашел библиотеку для работы с реестром, использование которой значительно упрощает (как пишет автор) доступ к реестру.
Библиотека абсолютно бесплатная. В архиве есть CHM-файл справки по работе с библиотекой. Если кому будет нужна, то здесь
В принципе мало чем отличается от класса который я вам дал , но есть замечания: читая справку, не увидел функций для работы с параметрами не REG_SZ типа (DWORD, Binary)
Всё же классом лучше, не нужно лишние файлы хранить, регистрировать, и можете его под себя дописать.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36746476
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил много ошибок, но ещё класс не дописан = (
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36746560
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADВалентин67нашел библиотеку, использование которой значительно упрощает (как пишет автор) доступ к реестру.

но есть замечания: читая справку, не увидел функций для работы с параметрами типа DWORD, Binary


Сразу то и не обратил внимания. - действительно - работает только со строковым параметром.
А я "раскатал губу" Хотел еще найти бесплатные TreeView, ListView, добавить Label в качестве разделителя, и сделать связанный элемент управление.
Один раз делать и часто пользоваться - мало где еще придется использовать.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36746599
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну как бы TreeView и другие и так бесплатны. Но если как компоненты не хотите таскать с собой, есть тута написанные очень хорошими людьми контролы, они же, но на чистом API = )
Там и календарики и листвью и прогрессбар, и куча других. Класс с реестром дописал, теперь перечисляет ключи/параметры...
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36746783
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADНу как бы TreeView и другие и так бесплатны.

... не знаю, не знаю, но и отрицать не стану, хотя отдельно (не Common) не встречал TreeView, ListView.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36746794
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то были у меня отдельно из VB 3.0, но не могу теперь найти этот архив . И не знаю, будут ли они работать под XP.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36746903
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин67,

Работать будут но не советую :) так как до 4.0 версии среда была 16-разрядной. Поэтому нормально работать с ними не получится, а VB6 всё равно заменит в проекте на 32-разрядные версии.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36747026
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADВалентин67,

Работать будут но не советую :) так как до 4.0 версии среда была 16-разрядной. Поэтому нормально работать с ними не получится, а VB6 всё равно заменит в проекте на 32-разрядные версии.

Надо будет посмотреть мне 4-ю версию - там, тоже кажется, многие элементы управления отдельно шли.
"Четверка" была уже, как 16-разрядной, так и 32-разрядная
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36747187
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказалось, что в 4-ой версии, отдельных элементов управления, таких как TreeView и ListView нет.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36747920
Валентин67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADКласс с реестром дописал, теперь перечисляет ключи/параметры...

VSVLAD, можете ли выложить окончательный вариант модуля класса (архив) с описанием (назначение процедур, описание элементов синтаксиса ) для данного класса.
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36748494
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не самый окончательный, но пока забил на него до лучших времён. Все функции проверил, возвращают и записывают значения. и от себя:
1) Если параметр не задан, и он устанавливается - ветка создастся.
2) Если параметр задан и он устанавливается, а пути такого нет - ветка тоже создаётся
3) DWORD возвращается как Long
4) Binary возвращается как String - особой разницы от Byte() не заметил, можно потом сконвертировать через StrConv() если нужно
5) EnumKeys(), EnumValues() - перечисляют и возвращают массив String() с именами.

- Получение типов параметров при перечислении я не делал. Иначе нужно будет сделать массив структур (как в примере) и возвращать его. Пока этим не занимался.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Enum REG_PARAM_TYPES
    REG_SZ =  1 
    REG_BINARY =  3 
    REG_DWORD =  4 
End Enum

Type uParamInfo
    sName As String
    iType As REG_PARAM_TYPES
    sValue As String
End Type

Dim Params() As uParamInfo
...
Рейтинг: 0 / 0
Внештатный редактор реестра
    #36748561
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленький пример по работе. Хотя и так всё ясно по коментариям внутри класса.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Private Sub Form_Load()
    Dim Reg As New cRegistry, sList As String, sArr() As String

    'Перечислим все ключи программ в HKLM
    For Each xKey In Reg.EnumKeys(HKEY_LOCAL_MACHINE, "SOFTWARE")
        sList = sList & xKey & vbCrLf
    Next
    
    MsgBox "Ключи программ: " & sList, vbInformation
    'Прочитаем произвольные данные
    
    MsgBox "Размер курсора в cmd: " & Reg.ParamGetDWORD(HKEY_CURRENT_USER, "Console", "CursorSize"), vbInformation
    MsgBox "Время даблклика мыши: " & Reg.ParamGetString(HKEY_CURRENT_USER, "Control Panel\Mouse", "DoubleClickSpeed"), vbInformation
    
    sArr = Reg.EnumParams(HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\SERIALCOMM")
    sList = ""
    For I =  0  To UBound(sArr)
        sList = sList & sArr(I) & vbCrLf
    Next
    
    MsgBox "Ещё чё-то читаем: " & sList, vbInformation
    
    Call Reg.ParamSetDWORD(HKEY_CURRENT_USER, "NEW_VS_SOFT\Settings", "DD",  10 ) 'Запишем наше значение
    MsgBox "Читаем значение: " & Reg.ParamGetDWORD(HKEY_CURRENT_USER, "NEW_VS_SOFT\Settings", "DD")
    
    'Удаляем наш ключ
    Call Reg.DeleteKey(HKEY_CURRENT_USER, "NEW_VS_SOFT\Settings")
    Call Reg.DeleteKey(HKEY_CURRENT_USER, "NEW_VS_SOFT")
End Sub
...
Рейтинг: 0 / 0
48 сообщений из 48, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Внештатный редактор реестра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]