Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Контроль за добавлениями новых данных в реестр  (Прочитано 15528 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« : 10-04-2008 12:05 » 

День добрый,- вопрос следующий. Не секрет, что пользователь может запустить .рег файл который добавит информацию в реестр и это надо отслеживать. Если организовать это через
Код:
WM_SIZE:
 // Заполнение дерева заного
то это работоспособно, но т.к. дерево ключей очень большое- окно подвисает на 3-4 секунды( это только у меня ). Мб возможна какая-то другая реализация ?
Записан
zubr
Гость
« Ответ #1 : 10-04-2008 13:55 » 

Юзай функцию RegNotifyChangeKeyValue, в MSDN есть пример.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 10-04-2008 14:06 » 

Хмммм на вскидку:

пользователь может запустить .рег файл который добавит информацию в реестр

Само по себе ничего не просиходит. В данном случае regedit.exe "%1".
Самое простое - зарегить тип .reg на свою прогу, а потом вызывать из неё уже оригинал. В промежутке можно делать всё, что угодно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #3 : 10-04-2008 14:18 » 

Джон, а если пользователь вручную добавил данные в реестр?
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 10-04-2008 14:20 » 

Хмммм на вскидку:

пользователь может запустить .рег файл который добавит информацию в реестр

Само по себе ничего не просиходит. В данном случае regedit.exe "%1".
Самое простое - зарегить тип .reg на свою прогу, а потом вызывать из неё уже оригинал. В промежутке можно делать всё, что угодно.

Вопрос в том, если программа уже запущена и пользователь открывает .рег файл- можно ли сделать добавление в уже построенное дерево взяв информацию о изменении только одного ключа/значения из "обновлённого реестра" а не полный реестр переписывать? (или как-то из командной строки если пропускать имя- %1 и содержимое файла .рег через программу)

2zubr.

      
Код:
case WM_SIZE:
for(i=0;i<6;i++)
{
if(RegNotifyChangeKeyValue(hTopKeys[i],TRUE,REG_NOTIFY_CHANGE_NAME|REG_NOTIFY_CHANGE_ATTRIBUTES|
REG_NOTIFY_CHANGE_LAST_SET|REG_NOTIFY_CHANGE_SECURITY,NULL,FALSE)==ERROR_SUCCESS)
{
MessageBox(NULL,"1","1",MB_OK);
}
}
Окно зависает =(
« Последнее редактирование: 10-04-2008 14:22 от FallenSoul » Записан
zubr
Гость
« Ответ #5 : 10-04-2008 16:48 » 

FallenSoul, непонятно
1. Зачем 6-кратный цикл
2. Почему в WM_SIZE? Логичнее было бы чтобы в бесконечном цикле в отдельном потоке с ожиданием на WaitForSingleObject
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 10-04-2008 17:02 » 

1. Цикл по ключам
2. Про отдельный поток,-не представил как это выглядит
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 10-04-2008 21:32 » 

Джон, а если пользователь вручную добавил данные в реестр?

Да я вроде процитировал условия задачи. Там ясно стоит "пользователь запустит .рег-файл". Или?

Вопрос в том, если программа уже запущена и пользователь открывает .рег файл- можно ли сделать добавление в уже построенное дерево взяв информацию о изменении только одного ключа/значения из "обновлённого реестра"

Хммм..., а если в рег-файле 20 ключей? А если 200 ключей? А если 2000? Какой именно ОДИН из них тебя интересует? Ага

FallenSoul, правильно сформулированная задача = половина решёния. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 11-04-2008 15:07 » 

Стараюсь максимально ясно изъясняться Улыбаюсь

Смысл в том, чтоб приложение работало как бы в интерактивном режиме- с "автообновлением данных" в дереве. В случае добавления пользователем данных вручную, запуская .рег файл,-чтоб они автоматически добавлялись в дерево( полный аналог regedit'a).

Перерисовывать всё содержимое дерева- нецелесообразно т.к. занимает очень много времени.
Использовать функцию, которую привёл zubr не представляю как.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 11-04-2008 15:42 » 

Те я вижу на экране брата-близнеца regedit? Хм... Зачаем... Ну да ладно. Кстати regedit тоже не обновляет данные автоматически. Для этого у него есть F5 (интересно почему? Ага ).

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

Два, я так понял, что ты делаешь замену regedit (или нет?) те пользователь должен в твоей программе изменять значения в реестре, а не в regedit. Проблема автоапдейта отпадает.

Три. Поэтому я совершенно нормально воспринял твой вопрос про рег-файл. Это действительно ещё одно возможность, на которую ты можешь реагировать. Тут бы я отлавливал этот файл ещё до запуска, парсил бы его и получал таким образом все ключи, которые должны были быть обновлены. После этого я бы определил - находится изменённый ключ в видимой области и если да - сделал бы обновление. Все остальные обновления тебя не интересуют тк будут всё-равно заново прочитаны при непосредственном установлении "видимости".

зы все допущения сделаны на основе моего понимания задачи. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #10 : 11-04-2008 17:16 » 

На самом деле задача нетривиальная. Если ты хочешь это сделать по ссобщениям винды, то сначала запусти regmon и посмотри сколько всякой всячины постоянно опрашивается, перезаписывается и тд в реестр. ХОчешь на всё это реагировать? Ведь я же как пользователь могу и простые ф-ции работы с реестром задействовать. Это раз.
Ну опрашивается на порядок больше, чем записывается перезаписывается.
FallenSoul, если надо проверять какую то ветку реестра, то функция RegNotifyChangeKeyValue вполне справляется.
Я не совсем понимаю назначение программы, но если изменения в реестре не влияют на работу программы, а только нужны для информации когда делать апдейт, то работа этой функции из отдельного потока решит твои проблемы с зависанием программы. Что именно не понятно с отдельным потоком?
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 11-04-2008 17:26 » 

Те я вижу на экране брата-близнеца regedit? Хм... Зачаем... Ну да ладно. Кстати regedit тоже не обновляет данные автоматически. Для этого у него есть F5 (интересно почему? Ага ).

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

Два, я так понял, что ты делаешь замену regedit (или нет?) те пользователь должен в твоей программе изменять значения в реестре, а не в regedit. Проблема автоапдейта отпадает.

Три. Поэтому я совершенно нормально воспринял твой вопрос про рег-файл. Это действительно ещё одно возможность, на которую ты можешь реагировать. Тут бы я отлавливал этот файл ещё до запуска, парсил бы его и получал таким образом все ключи, которые должны были быть обновлены. После этого я бы определил - находится изменённый ключ в видимой области и если да - сделал бы обновление. Все остальные обновления тебя не интересуют тк будут всё-равно заново прочитаны при непосредственном установлении "видимости".

зы все допущения сделаны на основе моего понимания задачи. Ага

Курсовая работа по дисциплине "Операционные системы". Тема- "Редактор реестра". Улыбаюсь

---
zubr, делается программа с тем умыслом, что изменения в программе (добавление ключей,данных,удаление,переименование)- отображается напрямую на реестре.


Записан
zubr
Гость
« Ответ #12 : 12-04-2008 05:43 » 

FallenSoul,  тогда вообще зачем отслеживать изменения в реестре? Просто отключи программно regedit и все действия по редактированию реестра делай из своей программы. Единственное не забудь по закрытию своей программы включить regedit.
Для отключения regedit:
 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System
 параметр DisableRegistryTools(DWORD) = 2 (отключить regedit), 0 (включить regedit)
На данную тему (администрирование regedit) в MSDN есть статья: “Prevent Access to Registry Editing Tools” policy changes in Windows XP
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines