Очистка реестра
октября 12 2009 by admin in АдминистрированиеКак я уже неоднократно отмечал, ответственность за поддержание порядка в реестре несет разработчик приложения. Ваш сервер (или любое другое приложение) должно не только эффективно использовать реестр, но и очищать его при своем завершении.
Для удаления данных из реестра предназначены функции RegDeleteKey и RegDeleteValue. Они объявлены так:
LONG RegDeleteValue( HKEY hkey, PCTSTR pszValueName);
LONG RegDeleteKey( HKEY hkey, PCTSTR pszSubKey);
Возможно, вы удивитесь, когда узнаете, что удаление данных из реестра не такая уж и тривиальная задача. Функция RegDeleteValue просто выглядит и так же проста в использовании при условии, что приложению разрешено удалить данный раздел. Однако возможность того, что приложение не имеет права на удаление раздела, побудило разработчиков реализовать RegDeleteKey с одним важным ограничением: она может удалить только раздел, не имеющий подразделов. Причины такого решения, если подумать, ясны: процесс может не иметь разрешения на удаление подраздела удаляемого раздела. Система не может пройти по всему дереву и проверить права, установленные для подразделов до запуска процедуры удаления, так как эта операция может оказаться очень длительной, к тому же права подразделов могут измениться уже после такой проверки. А это может вызвать ошибку удаления подраздела во время процедуры удаления всего раздела, что частично его разрушит.
И хотя RegDeleteKey не удаляет раздел, содержащий подразделы, разработчики оболочки Windows реализовали функцию, выполняющую такую операцию, — SHDeleteKey-.
DWORD SHDeleteKey( HKEY hkey, PCTSTR pszSubKey);
Перед вызовом SHDeleteKey ваш процесс должен иметь разрешение на удаление всех подразделов раздела. Если таких прав у него нет, функция определит это и вернет сообщение «Access denied» («Доступ запрещен»). Заметьте: SHDeleteKey обладает теми же недостатками, что описаны выше: если права процесса изменятся во время вызова функции, раздел может оказаться частично разрушенным.