Здравствуйте, уважаемые форумчане!
Пусть Вас не вводит в заблуждение повторяемость названия данной темы. Я не нашел ничего похожего, поэтому и обращаюсь за помощью к Гуру.
Проблема, собственно, состоит в семантическом парадоксе.
У меня есть процедура, которая, по выбору пользователя, либо создает, либо удаляет некий параметр реестра:
Код:
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;
Все работает. Параметр создается и удаляется. Но я наткнулся семантическую проблему. Если приложение запущено с ограниченными правами, то при попытке выполнить данную операцию я получаю сообщение "Параметр блокировки отсутствует или удален!", что не соответствует действительности. Он и не отсутствует и не удален. С ним просто ничего не происходило, но я не могу подобрать правильный алгоритм проверки. Какой может быть выход? Дважды за операцию проверять существование параметра? Перед началом и в конце? Помогите советом, пожалуйста.