Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Удаление ключей реестра через Delphi: решение проблемы

Delphi , ОС и Железо , Реестр

Вопрос, поднятый в данном запросе, касается проблемы удаления ключа реестра в коде, написанном на 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) выполняется успешно.

Комментарии и подсказки

В комментариях к вопросу пользователя приведена полезная информация:

  1. TRegistry обёртка для функций Windows API. Используйте отладчик для проверки возвращаемых функций API, особенно RegDeleteKey.
  2. У пользователя есть права администратора для удаления ключей в данной ветке реестра.
  3. Удаление ключей в других ветках реестра происходит успешно.
  4. При использовании 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Реестр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 20:48:40/0.0020411014556885/0