Вопрос, поднятый в данном запросе, касается проблемы удаления ключа реестра в коде, написанном на Delphi. Разработчик столкнулся с ситуацией, когда после успешной регистрации панели управления (Control Panel applet) в Windows 7 x64, ключ реестра, который был создан для этой цели, не удаляется при выполнении соответствующего кода. Несмотря на то, что ключ успешно создавался, при попытке его удаления ошибок не возникало, но и сам ключ не удалялся. В данном ответе будет рассмотрен подход к решению данной проблемы, а также альтернативные методы, которые могут быть полезны при работе с реестром в Delphi.
Проблема
Разработчик использует компонент TRegistry для выполнения операций с реестром. В частности, при создании ключа и его последующем удалении возникают затруднения. Код для создания ключа выглядит следующим образом:
var reg1: TRegistry; key: string;
begin
key := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\ {0052D9FC-6764-4D29-A66F-2F3BD9E2BB40}';
reg1 := TRegistry.Create;
reg1.RootKey := HKEY_LOCAL_MACHINE;
reg1.Access := KEY_WOW64_64KEY + KEY_ALL_ACCESS;
if reg1.OpenKey(key, True) = True then ShowMessage('ok');
reg1.CloseKey;
reg1.Free;
end;
Код для удаления ключа:
procedure TForm1.Button1Click(Sender: TObject);
var reg1: TRegistry; key: string;
begin
reg1 := TRegistry.Create;
reg1.RootKey := HKEY_LOCAL_MACHINE;
reg1.Access := KEY_WOW64_64KEY + KEY_ALL_ACCESS;
key := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\{0052D9FC-6764-4D29-A66F-2F3BD9E2BB40}';
if reg1.KeyExists(key) = True then ShowMessage('Key exists');
if reg1.DeleteKey(key) = True then ShowMessage('Ok');
// ! Ошибка: здесь не работает !
ShowMessage(IntToStr(GetLastError)); // Отображает "0"
reg1.Free;
end;
Ошибок в коде не наблюдается, но ключ удалить не удаётся. Программа запускается от имени администратора, который также создаёт данный ключ в реестре. Удаление ключа через редактор реестра (regedit.exe) выполняется успешно.
Комментарии и подсказки
В комментариях к вопросу пользователя приведена полезная информация:
TRegistry обёртка для функций Windows API. Используйте отладчик для проверки возвращаемых функций API, особенно RegDeleteKey.
У пользователя есть права администратора для удаления ключей в данной ветке реестра.
Удаление ключей в других ветках реестра происходит успешно.
При использовании ShowMessage(reg1.LastErrorMsg) вместо ShowMessage(IntToStr(GetLastError)) отображается сообщение "not found", что указывает на отсутствие ключа и объясняет, почему KeyExists возвращает истину.
Подтверждённый ответ
Для решения проблемы попробуйте следующий подход:
IF reg1.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace') THEN
TRY
reg1.DeleteKey('{0052D9FC-6764-4D29-A66F-2F3BD9E2BB40}')
FINALLY
reg1.CloseKey
END;
Убедитесь также, что под удаляемым ключом нет подключей. Если они есть, их необходимо удалить перед удалением родительского ключа.
Выводы
При работе с реестром важно обращать внимание на детали, такие как наличие подключей и правильный порядок вызова функций OpenKey и DeleteKey. Использование отладчика и проверка последней ошибки могут помочь выявить и устранить проблемы, связанные с операциями над реестром в Delphi.
Проблема разработчика заключается в том, что при попытке удалить ключ реестра, созданный с помощью компонента `TRegistry` в Delphi, ключ не удаляется, несмотря на отсутствие явных ошибок в коде.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS