Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6   вперед  Ctrl      все
 Запись в реестр  [new]
Mizer73
Member

Откуда: Питер
Сообщений: 251
Храню в регистре некоторые данные.
Пытался хранить в ветке HKCU HKEY_LOCAL_MACHINE; - но там совсем плохо с возможностью записи
на некоторых машинах даёт писать в HKEY_CURRENT_USER; а на других - нет
как решить проблему доступа к записи в реестр?

TRegistry *reg = new TRegistry(KEY_ALL_ACCESS); //Создали обьект класса TRegistry
reg->RootKey = HKEY_CURRENT_USER;	//присваивание объекту 'reg' пути HKCU HKEY_LOCAL_MACHINE;   //
reg->OpenKey("Software\\йцукr", true);
if (reg)
{	
	reg->WriteBool("Connect", true);
	reg->WriteString("pwd", Edit3->Text);
	reg->WriteString("plz", Edit2->Text);
	reg->WriteString("srv", Edit1->Text);
}
if (reg) delete reg;
26 дек 20, 00:58    [22254483]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
petrav
Member

Откуда:
Сообщений: 2861
Вы уверены, что вам обязательно нужна возможность намусорить в реестр? Может лучше обойтись файлами ini, xml или json?
26 дек 20, 01:19    [22254488]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Mizer73
как решить проблему доступа к записи в реестр?

Путём отладки найти ошибку и исправить. Подсказка: OpenKey это функция, возвращающая
значение.
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Registry_TRegistry_OpenKey.html

HKEY_CURRENT_USER по определению доступен для записи текущему пользователю.

Posted via ActualForum NNTP Server 1.5

26 дек 20, 01:20    [22254489]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
petrav
Member

Откуда:
Сообщений: 2861
Mizer73,

И да, лучше завязать с Борландом. Возьмите православный Qt.
26 дек 20, 01:21    [22254491]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Mizer73
а на других - нет
не верю
26 дек 20, 11:34    [22254561]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Mizer73
Member

Откуда: Питер
Сообщений: 251
PetroNotC Sharp
Mizer73
а на других - нет
не верю

тем не менее - это из практики.
не поднял бы эту тему, если бы не столкнулся с этим.
Сейчас переделываю все по правилам букварей. Работает.
27 дек 20, 11:37    [22254971]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
petrav
Вы уверены, что вам обязательно нужна возможность намусорить в реестр? Может лучше обойтись файлами ini, xml или json?

Что значит намусорить? Это штатная возможность Windows архитектур. И ей надо пользоваться.
27 дек 20, 12:29    [22254987]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

mayton
Это штатная возможность Windows архитектур. И ей надо пользоваться.

При её создании не учли пару моментов, включая производительность. Более свежие
рекомендации по дизайну приложений обратно рекомендуют файловую систему для хранения
информации приложений.

Posted via ActualForum NNTP Server 1.5

27 дек 20, 14:12    [22255032]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Dima T
Member

Откуда:
Сообщений: 15689
Dimitry Sibiryakov

mayton
Это штатная возможность Windows архитектур. И ей надо пользоваться.

При её создании не учли пару моментов, включая производительность. Более свежие
рекомендации по дизайну приложений обратно рекомендуют файловую систему для хранения
информации приложений.

Значит SQLite надо юзать.
27 дек 20, 14:58    [22255054]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Dimitry Sibiryakov

mayton
Это штатная возможность Windows архитектур. И ей надо пользоваться.

При её создании не учли пару моментов, включая производительность. Более свежие
рекомендации по дизайну приложений обратно рекомендуют файловую систему для хранения
информации приложений.

Ну реестр не предназначен для хранения баз данных. Свойства разве что.
Вопрос с файлами нужно рассмотреть с позиции например администрирования
Windows домена с массой пользователей и настройками.

И сравнить варианты развертывания на файлах и на реестре.
27 дек 20, 15:56    [22255078]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

mayton
И сравнить варианты развертывания на файлах и на реестре.

Вариант с файлами победит, поскольку их-то можно разогнать на local profile и roaming
profile, а вот с реестром это не прокатит.

Posted via ActualForum NNTP Server 1.5

27 дек 20, 16:09    [22255084]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Mizer73
Member

Откуда: Питер
Сообщений: 251
Dimitry Sibiryakov,

столкнулся с проблемой. Этот код проходит нормально

TRegistry* reg2 = new TRegistry(KEY_ALL_ACCESS);
		reg2->RootKey = HKEY_LOCAL_MACHINE;
		reg2->Access = KEY_WRITE;
		if (!reg2->KeyExists("Software\\Extra\\"))
		{
			reg2->CreateKey("Software\\Extra\\");
			reg2->WriteBool("Connect", false);
			reg2->WriteString("pwd", "");
			reg2->WriteString("plz", "");
			reg2->WriteString("srv", "");
		}

а в этом коде создаётся только заголовок SOFTWARE\\nsoftware\\RT\\IPBBA2\\, а дальше
они идут друг за другом
try
		{
			if (!reg2->KeyExists("SOFTWARE\\nsoftware\\RT\\IPBBA2\\"))
			{
				reg2->CreateKey("SOFTWARE\\nsoftware\\RT\\IPBBA2\\"); - отрабатывает, 

				reg2->WriteString("RTK", "31500000000000000000000485958303956504A000056465336524A500");
				//reg2->WriteString("", "IP");
				reg2->WriteString("*", "JZ");

			}


Сообщение было отредактировано: 27 дек 20, 16:20
27 дек 20, 16:24    [22255088]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Mizer73
Member

Откуда: Питер
Сообщений: 251
Mizer73
Dimitry Sibiryakov,

столкнулся с проблемой. Этот код проходит нормально

TRegistry* reg2 = new TRegistry(KEY_ALL_ACCESS);
		reg2->RootKey = HKEY_LOCAL_MACHINE;
		reg2->Access = KEY_WRITE;
		if (!reg2->KeyExists("Software\\Extra\\"))
		{
			reg2->CreateKey("Software\\Extra\\");
			reg2->WriteBool("Connect", false);
			reg2->WriteString("pwd", "");
			reg2->WriteString("plz", "");
			reg2->WriteString("srv", "");
		}

а в этом коде создаётся только заголовок SOFTWARE\\nsoftware\\RT\\IPBBA2\\, а дальше
они идут друг за другом
try
		{
			if (!reg2->KeyExists("SOFTWARE\\nsoftware\\RT\\IPBBA2\\"))
			{
				reg2->CreateKey("SOFTWARE\\nsoftware\\RT\\IPBBA2\\"); - отрабатывает, 

				reg2->WriteString("RTK", "31500000000000000000000485958303956504A000056465336524A500");
				//reg2->WriteString("", "IP");
				reg2->WriteString("*", "JZ");

			}

на самом деле и это не отрабатывает

reg2->WriteBool("Connect", false);
reg2->WriteString("pwd", "");
reg2->WriteString("plz", "");
reg2->WriteString("srv", "");
27 дек 20, 16:35    [22255095]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

И это логично, поскольку ты так и не прислушался к советам выше. Какой смысл в продолжении?..

Posted via ActualForum NNTP Server 1.5

27 дек 20, 17:40    [22255112]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Mizer73
Member

Откуда: Питер
Сообщений: 251
Dimitry Sibiryakov,
попробуй объяснить
27 дек 20, 20:22    [22255175]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Dima T
Member

Откуда:
Сообщений: 15689
Mizer73, билдер это дельфи. То что Паскаль заменили на С++ оно не стало С++, болячки компоненты какие были, те и остались. Спрашивай в форуме по Дельфи, оно им понятней.
27 дек 20, 20:43    [22255187]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Dima T
Спрашивай в форуме по Дельфи, оно им понятней.

Думаешь, там до него лучше дойдёт, что значения, возвращаемые функциями, надо проверять, а
ошибки - протоколировать?..

Posted via ActualForum NNTP Server 1.5

27 дек 20, 21:11    [22255195]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Dimitry Sibiryakov

mayton
И сравнить варианты развертывания на файлах и на реестре.

Вариант с файлами победит, поскольку их-то можно разогнать на local profile и roaming
profile, а вот с реестром это не прокатит.

IMHO и AFAIK.

Хм... может быть. Еще приведу один довод в пользу реестра. Его API - прост. И действия атомарны.
С конфигурациями типа .properties, .ini e.t.c. У вас появляется новый контракт. Нужно проверять валидность
файла и иметь третье состояние - файл невалиден (был отредактирован вручную неверно) и принмать
какое-то решение. И вообще редко какой разработчик заморачивается с правильным текстовым парсером
вследствие чего конфиги могут быть долгое время сломаны но никто об этом не знает т.к. нет механизма проверки
их валидности. Тоесть пока вы не упали в явном виде - неизвестно валиден-ли конфиг.

Еще довод. На реестре проще следовать принципу Conversion Over Configuration для много-пользовательских систем.
Для текстовых конфигов у вас придется дробить крупный файл на россыпь мелких по принципу 1 ключ == 1 текстовый
файл что само по себе создает некие неудобства при ведении файлового хозяйства. Дробление может возникать от
кастомизации настроек. Чем больше юзер кастомизировал - тем больше дробления. Кроме того значения в реестре - типизированы.
Есть булевые значения. Есть числа и так далее. Это все - дополнительные уровни строгости конфигураций.

Еще довод. Реестр проще бэкапить и реплицировать. Как с БД у админа будет сфокусировано внимание на одной сущности. А не на тысяче
директорий и еще бох его знает надо их бэкапить или нет т.к. в файловой системе обычно создается некий флуд скрытых
фолдеров-конфигов которые могут быть не нужны (не релевантны) к ведению админской деятельности.

Сообщение было отредактировано: 27 дек 20, 22:37
27 дек 20, 22:42    [22255213]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

mayton
Как с БД у админа будет сфокусировано внимание на одной сущности.

Ну, админы, конечно, бывают разные, но лично у меня одним махом бэкапилось всё дерево
роуминговых профилей, а там и данные приложения и документы пользователя и всё остальное
(включая реестр ЕМНИП).

Posted via ActualForum NNTP Server 1.5

27 дек 20, 23:02    [22255218]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Mizer73
Member

Откуда: Питер
Сообщений: 251
Dimitry Sibiryakov,
пургу несешь в эфире.
28 дек 20, 01:01    [22255251]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Офф. То регистр это плохо, это миф с 2000х годов.
Mizer73,
>на самом деле и это не отрабатывает
Удалите лишний код.
Сделайте минимальный пример с комментарием на строчке ошибки и скрином ошибки.
28 дек 20, 08:10    [22255294]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Dima T
Member

Откуда:
Сообщений: 15689
mayton
Еще довод. Реестр проще бэкапить и реплицировать. Как с БД у админа будет сфокусировано внимание на одной сущности. А не на тысяче
директорий и еще бох его знает надо их бэкапить или нет т.к. в файловой системе обычно создается некий флуд скрытых
фолдеров-конфигов которые могут быть не нужны (не релевантны) к ведению админской деятельности.

Спорный довод. Вся прога вместе в конфигами может жить в одной папке, тогда ее очень легко бэкапить или переносить.

С другой стороны есть вирусы-шифровальщики, которые реестр не трогают.
Буквально на днях разбирались: админ пишет что наша прога тупит сильно, по логам выясняем что постоянно выполняются тяжелые служебные операции, которые должны раз в сутки ночью отработать. Оказывается админ защитился от шифровальщиков, убрал права на запись в инишник , а прога пытается писать туда дату последнего запуска.
28 дек 20, 08:47    [22255297]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Реестр, это всего лишь следующий этап автоматизации после ini.
Например, автоматическое создание каждому новому юзверю своей папки...профили.
Они не конкурируют а дополняют решения по IT
28 дек 20, 09:30    [22255313]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
Mizer73
Member

Откуда: Питер
Сообщений: 251
PetroNotC Sharp, имею это

TRegistry* reg2 = new TRegistry(KEY_ALL_ACCESS);
		reg2->RootKey = HKEY_LOCAL_MACHINE;
 g63:
		if (!reg2->KeyExists("Software\\ExtraMaster\\"))
		{
			reg2->CreateKey("Software\\ExtraMaster\\");
			goto g63;
		}
	/*	bool openResult = reg2->("Software\\ExtraMaster\\", true);
		if(!openResult)
		{
			MessageDlg("Unable to create key! Exiting.", mtError, TMsgDlgButtons() << mbOK, 0);
			Application->Terminate();
		} */
		if (!reg2->ValueExists("Connect"))
			reg2->WriteBool("Connect", false);
		if (!reg2->ValueExists("pwd"))
			reg2->WriteString("pwd", "");
		if (!reg2->ValueExists("plz"))
			reg2->WriteString("plz", "");
		if (!reg2->ValueExists("svr"))
			reg2->WriteString("srv", "");
		reg2->CloseKey();
		delete reg2;


вся ветка нормально записано в реестре, но...
при выполнении данного кода, это строка if (!reg2->ValueExists("Connect")) не определяет наличие параметра Connect и пытается его снова создать. Видимо, не определено, где искать этот параметр.
28 дек 20, 09:42    [22255319]     Ответить | Цитировать Сообщить модератору
 Re: Запись в реестр  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Mizer73,
Поставь перед проверкой if вывод в лог или консоль что там записано.
28 дек 20, 10:09    [22255330]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6   вперед  Ctrl      все
Все форумы / C++ Ответить