Показать сообщение отдельно
  #1  
Старый 28.03.2017, 06:23
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
Вопрос Проверка существования ключа реестра

Здравствуйте, уважаемые форумчане!
Пусть Вас не вводит в заблуждение повторяемость названия данной темы. Я не нашел ничего похожего, поэтому и обращаюсь за помощью к Гуру.
Проблема, собственно, состоит в семантическом парадоксе.
У меня есть процедура, которая, по выбору пользователя, либо создает, либо удаляет некий параметр реестра:

Код:
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;

Все работает. Параметр создается и удаляется. Но я наткнулся семантическую проблему. Если приложение запущено с ограниченными правами, то при попытке выполнить данную операцию я получаю сообщение "Параметр блокировки отсутствует или удален!", что не соответствует действительности. Он и не отсутствует и не удален. С ним просто ничего не происходило, но я не могу подобрать правильный алгоритм проверки. Какой может быть выход? Дважды за операцию проверять существование параметра? Перед началом и в конце? Помогите советом, пожалуйста.
Ответить с цитированием