|
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Работа с реестром в C++ Builder17.08.2010, 22:37. Показов 119783. Ответов 12
Метки нет (Все метки)
Вступление:
Данный FAQ тестировался и писался на системе Windows XP SP2. Используемый компилятор: Borland C++ Builder 6.0. Для начала, немного теории о реестре Windows. История появления реестра Давным-давно все настройки программ хранились в Ini-файлах, которые представляли из себя обычные текстовые файлы с структурированной записью всех параметров программ. Со временем программы стали расти, как и количество их параметров, и в следствии чего INI-файлы превратились в настоящую свалку, в которой что-либо разобрать было очень сложно. Поэтому в Microsoft решили создать одну единую базу данных, где хранились бы все настройки и параметры Windows - так появился реестр. Что из себя теперь представляет реестр Windows Итак, сегодняшний реестр - это структурированая база данных, в которой хранятся настройки операционной системы, установленных программ, профилей пользователей, сведения о типах файлов и много чего еще. Теперь, обычный двоичный файл размером в 64 кб(Win 3.1) стал одним из основных компонентов Windows, от которого отказаться будет очень сложно... Реестр состоит из 5 основных разделов, которые включают в себя огромное множество под-разделов, на описание которых уйдет не одно сотня страниц. Поэтому опишу только главные разделы: HKEY_CLASSES_ROOT - в этом разделе хранится информация о зарегистрированных типах файлов, а также об обьектах COM и ActiveX. HKEY_CURRENT_USER - в этом разделе хранится информация о пользователе, вошедшем в данный момент в систему: папки пользователя, параметры панели управления и другие настройки. HKEY_LOCAL_MACHINE - в этом разделе содержится информация о параметрах конфигурации всех пользователей. HKEY_USERS - в этом разделе находится информация о всех загруженных профилях пользователей данного комьютера. HKEY_CURRENT_CONFIG - в этом разделе содержится информация о профиле обурудования, которую локальный компьютер использует при запуске системы. Минусы реестра Реестр подвержен фрагментации, поэтому чем больше в нем записей, тем медленнее он работает. Поэтому засорять его своими настройками не хорошо, если эти настройки не будут впоследствии удалены. В реестре хранится системная информация от которой записит работа всего компьютера, и если что-то нечаянно испортить, то вам будет плохо. А теперь практика Для того чтобы работать с реестром нужно подключить файл "Registry.hpp"
Запись параметров в реестр Для записи параметров в реестр у класса TRegistry существует множество функций, которые очень похожи и различаются только в типе записываемой информации. Для обычных строк это WriteString("Name","Value"), для записи целых чисел это WriteInteger("Name",int) и так далее... Список наиболее часто-используемых функций будет приведен ниже. Прежде чем записать какой-то параметр в определенную ветку реестра, ее нужно открыть Для этого используется функция OpenKey("Key",CanCreate). Первым параметром функции идет имя ключа, открываемого для записи, а вторым параметром идет значение типа bool - при включении этого значения, в случае отсутствия открываемого ключа, он будет создан автоматически. В противном случае, запись в несуществующий ключ не произойдет (что и вполне логично ).Доступ к подключам происходит точно так же как и к самим ключам: допустим, у нас есть ветка реестра "TestProgramm\\Options\\ID". Для того, чтобы записать какой-то параметр в ключ "TestProgramm" нужно написать так:
Теперь пример записи обычной строки в реестр:
Список наиболее часто-используемых функций для записи ключей в реестр:
Чтение параметров из реестра Чтение параметров из реестра происходит точно также, как и запись, только в этом случае каждая функция возвращает значение определенного типа. К примеру, чтобы прочитать параметр, содержащий обычную строку, сделать это стоит следующим образом:
Теперь простой пример считывания параметра из реестра:
Список основных функций для чтения параметров из реестра
Удаление ключей и разделов Мусорить не хорошо, потому нужно после себя убирать (удалять параметры из реестра, естественно, нужно тогда, когда программа больше не будет к ним обращаться, на пример, при деинсталяции(удалении с компьютера) программы. Для этого существует две функции: DeleteValue() - удаление параметра:
Переименовывание параметров Для того, чтобы переименовать параметр нужно чтобы этот параметр существовал и чтобы параметра, который бы соответствовал новому имени не существовало:
Как узнать, имеется-ли в определенном ключе какой-то параметр? Для этого существует функция ValueExists("Name"), которая вовращает 1, если параметр существует и 0, если параметра не существует:
Как скопировать, переместить ключ? Для этого можно воспользоваться функцией MoveKey(String OldName, String NewName, bool Delete) - копируем ключ "OldName" в "NewName", если Delete=true, то автоматически удаляется ключ OldName:
Сохранение и загрузка ключей в файл Для сохранения и загрузки ключей в TRegistry существует 2 функции: SaveKey("Key","FileName") и LoadKey("Key","FileName"). Первым параметром в этих функциях идет имя ключа, над которым будет происходить загрузка/сохранения, а вторым - имя файла в который будет сохранен или загружен ключ реестра. Пример:
Как получить список всех параметров заданного ключа? Для этого предназначена функция GetValueNames(TStringList *List), которая передает все параметры ключа в заданный список List. Пример использования:
Как получить список всех подключей заданного ключа? Для этого предназначена функция GetKeyNames(TStringList *List), которая передает все параметры ключа в заданный список List. Пример использования:
Автор: NiTan
35
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 17.08.2010, 22:37 | |
|
Ответы с готовыми решениями:
12
Работа с реестром Работа с реестром |
|
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
|||||||||||||||||||||
| 21.08.2010, 16:06 | |||||||||||||||||||||
|
По этой статье есть небольшое дополнение.
Класс TRegistry имеет перегруженный конструктор, задекларированный как:
Параметр AAccess может принимать следующие значения:
Соответственно, могут возникнуть моменты, когда доступ к определённым действиям в реестре ограничить. В таком случае, программа может прервать выполнение нужного действия. Для того, чтобы избежать подобных проблем, необходимо выполнять проверку на успешность создания объекта. Вариант 1 (упрощённый):
После завершении использования не забываем очищать память:
18
|
|||||||||||||||||||||
|
Маэстро
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
|
|
| 21.08.2010, 18:18 | |
|
А как создать и работать с TRegistry со следующими параметрами:
1. Мультистроковой параметр 2. Расширяемый строковой параметр Спасибо.
0
|
|
|
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
|
||||||
| 21.08.2010, 18:46 [ТС] | ||||||
|
Я не уверен, но, по-моему, в Билдере с мультистроковым параметром работать нельзя, если я не прав, то подправьте меня, а вот с расширяемым строковым параметром, вроде, так:
1
|
||||||
|
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
|
||||||
| 21.08.2010, 18:55 | ||||||
|
Maestro, с расширяемым строковым параметром всё просто - реализован метод WriteExpandString.
Для работы с мультистроковым параметром в своё время пришлось реализовать вот такую функцию:
3
|
||||||
|
Маэстро
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
|
|||||||||||||||||
| 21.08.2010, 19:47 | |||||||||||||||||
|
Ребят, если не будете смеяться, то могу предложить работать с мультистроковым параметром вот так. Файл .cpp
P.S. Дополнительные команды можно узнать через Пуск - Выполнить - cmd - Enter, в консольном окошке ввести
4
|
|||||||||||||||||
|
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 4
|
|
| 05.12.2010, 17:23 | |
|
Для простоты работы с реестром я написал компонент который вставляется в любую форму и в любом количестве. Исходники прилагаются.
1
|
|
|
|
|
| 04.04.2011, 15:19 | |
|
Так как TRegistry класс делфи, то влезьть в него и кое что изменить С++ не дает, но нет ничего невозможного, я нашел этот файлик в делфи кое что добавил и перекомпилил его под С++...
теперь класс называется TReg вот нововведения в класе TReg в отличии от TRegistry, все что было в TRegistry осталось не тронуто +: __property String RootString- тоже что и RootKey но строковой тип; __property String Path - открывает указанный или возвращает текущий ключь при открытии использует AutoCreate если ключь не удалось открыть питается открыть только для чтения.... bool AutoCreate - свойство определяющее будет ли создан ключь заданный по Path если его нет ExistOldPath - возвращает истину если последний ключь заданный по Path удалось открыть или создать property string Z_String[const Name:string] пишет\читает строковой параметр property String Z_MultiString[const Name:string] пишет\читает мульти-строковой параметр property Z_..... - их еще много которые пишут\читают соответствующие типы TStrings Keys и Values, возвращает список ключей/параметров (удаление списка нужно осуществлять в ручную)TStrings *u=g->Keys();Memo1->Text=u->Text;delete u; DataTypeToStr переводит типы REG_... в строку закрывать ключи более не нужно\ они закрываются автоматом при открытии нового или удвлении класса помоему все.... делимся впечатлениями
2
|
|
|
|
||||||
| 04.04.2011, 16:12 | ||||||
|
Твои коды очень сложно читать, потому что появляется горизонтальный скроллбар. Куда удобнее, когда комментарий написан не справа от строки, а перед строкой. И нормально разбитна несколько строк.
В примере
*** Update Хотя удали этот пост. А точнее, перенеси в общий FAQ. А то здесь одни дельные советы в теме и мой пост выглядит не в кассу
0
|
||||||
|
154 / 146 / 20
Регистрация: 12.03.2011
Сообщений: 806
|
|
| 20.05.2011, 23:17 | |
|
Возможно подключать программно чужой реестр? Ну как в редакторе "Загрузить куст"?
0
|
|
|
18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181
|
||
| 18.02.2012, 00:25 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 19.07.2010
Сообщений: 22
|
|
| 13.05.2012, 19:17 | |
|
Здравствуйте, подскажите пожалуйста как считывать значение параметра *По умолчанию*
0
|
|
|
|
|||||||||||
| 14.05.2012, 13:31 | |||||||||||
|
XLammer:
0
|
|||||||||||
| 14.05.2012, 13:31 | |
|
Помогаю со студенческими работами здесь
13
Работа с реестром Работа с реестром Работа с реестром Работа с реестром Работа с реестром Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|