|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Проверка существования ключа реестра
Здравствуйте, уважаемые форумчане!
Пусть Вас не вводит в заблуждение повторяемость названия данной темы. Я не нашел ничего похожего, поэтому и обращаюсь за помощью к Гуру. Проблема, собственно, состоит в семантическом парадоксе. У меня есть процедура, которая, по выбору пользователя, либо создает, либо удаляет некий параметр реестра: Код:
if (Radiobutton6.Checked = True) then // Проверяем выбор begin WKey := TRegistry.Create(KEY_WRITE); try WKey.RootKey := HKEY_LOCAL_MACHINE; RegPath:=regDataPath; WKey.OpenKey(RegPath, False); if ComboBox2.ItemIndex = 0 then begin for i := 1 to length(AllW) do Buf[i] := AllW[i]; //заполняем наш буфер значениями из массива WKey.WriteBinaryData('Scancode Map',Buf,SizeOf(Buf)); // Отключение обеих клавиш WIN end; if ComboBox2.ItemIndex = 1 then begin for i := 1 to length(LWin) do Buf1[i] := LWin[i]; //заполняем наш буфер значениями из массива WKey.WriteBinaryData('Scancode Map',Buf1,SizeOf(Buf1)); // Отключение левой клавиши WIN end; if ComboBox2.ItemIndex = 2 then begin for i := 1 to length(RMWin) do Buf[i] := RMWin[i]; //заполняем наш буфер значениями из массива WKey.WriteBinaryData('Scancode Map',Buf,SizeOf(Buf)); // Отключение правой клавиши WIN и клавиши MENU end; if ComboBox2.ItemIndex = 3 then begin for i := 1 to length(AllMWin) do Buf2[i] := AllMWin[i]; //заполняем наш буфер значениями из массива WKey.WriteBinaryData('Scancode Map',Buf2,SizeOf(Buf2)); // Отключение всех клавиш WIN и MENU end; if ComboBox2.ItemIndex = 4 then begin WKey.DeleteValue('Scancode Map'); // Отмена всех блокировок end; finally CheckRegistry; WKey.free; end; end; Для проверки того, что в необходимой мне ветке создалась нужная мне переменная была объявлена новая процедура CheckRegistry: Код:
procedure TForm1.CheckRegistry; var CheckKey: TRegistry; // Объявление переменной для работы с реестром begin CheckKey := TRegistry.Create(KEY_READ); try CheckKey.RootKey := HKEY_LOCAL_MACHINE; CheckKey.OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\Keyboard Layout'); if CheckKey.ValueExists('Scancode Map') then ShowMessage('Блокировка выполнена успешно!') else ShowMessage('Параметр блокировки отсутствует или удален!'); finally CheckKey.free; end; end; Все работает. Параметр создается и удаляется. Но я наткнулся семантическую проблему. Если приложение запущено с ограниченными правами, то при попытке выполнить данную операцию я получаю сообщение "Параметр блокировки отсутствует или удален!", что не соответствует действительности. Он и не отсутствует и не удален. С ним просто ничего не происходило, но я не могу подобрать правильный алгоритм проверки. Какой может быть выход? Дважды за операцию проверять существование параметра? Перед началом и в конце? Помогите советом, пожалуйста. |