Проверка, существует ли раздел реестра - PullRequest
8 голосов
/ 28 августа 2009

Я ищу чистый способ проверить, существует ли раздел реестра. Я предполагал, что RegOpenKey потерпит неудачу, если я попытаюсь открыть ключ, который не существует, но это не так.

Я мог бы использовать обработку строк, чтобы найти и открыть родительский ключ того, который я ищу, и затем перечислить подключи этого ключа, чтобы выяснить, существует ли тот, который мне интересен, но это похоже на оба снижение производительности и странный способ реализовать такую ​​простую функцию.

Я бы предположил, что вы могли бы как-то использовать RegQueryInfoKey, но MSDN не дает слишком много подробностей о том, как, даже если это возможно.

Обновление : мне нужно решение в Win32 API, а не в управляемом коде, .NET или любой другой библиотеке.

Документы в MSDN, по-видимому, указывают на то, что вы должны иметь возможность открыть ключ для разрешения на чтение и получить ошибку, если она не существует, например:

lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);

if (lResult != ERROR_SUCCESS) 
{
    if (lResult == ERROR_FILE_NOT_FOUND) {

Однако я получаю ERROR_SUCCESS, когда пытаюсь это сделать.

Обновление 2 : мой точный код:

HKEY subKey = nullptr;
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
if (result != ERROR_SUCCESS) {

... но result - это ERROR_SUCCESS, хотя я пытаюсь открыть ключ, который не существует.

Обновление 3 : Похоже, вы правы, ребята. Это терпит неудачу на одном конкретном тестовом примере (загадочно). Если я попробую его на любом другом ключе, он вернет правильный результат. Двойная проверка с помощью редактора реестра по-прежнему не показывает ключ. Не знаю, что с этим делать.

Ответы [ 3 ]

10 голосов
/ 28 августа 2009

Прежде всего, не беспокойтесь о производительности для подобных вещей. Если вы не запрашиваете его 100 раз в секунду, это будет более чем достаточно быстро. Преждевременная оптимизация вызовет у вас все виды головных болей.

RegOpenKeyEx вернет ERROR_SUCCESS, если найдет ключ. Просто сверьтесь с этой константой, и все готово.

6 голосов
/ 28 августа 2009

RegOpenKey возвращает ошибку, если ключ не существует. Как ты это используешь? Ожидаемое возвращаемое значение ERROR_FILE_NOT_FOUND.

Из вашего кода:

HKEY subKey = nullptr;
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
if (result != ERROR_SUCCESS) {

Я бы посмотрел на значения key и subPath и убедился, что они соответствуют вашим ожиданиям, и что ключ на самом деле не существует. Каково значение subKey после этого? Это, очевидно, что-то открывает - попробуйте перечислить это, чтобы увидеть, какие ключи и значения под ним.

Нет никаких проблем с тем, что RegOpenKey не возвращает ошибку, если ключ не существует - я бы не стал предполагать, что есть какая-то странная ошибка ОС в чем-то, столь же часто используемом как реестр.

Может быть, у вас есть раздел реестра, который не виден вам, пользователю, который запускает редактор реестра, но не является вашим кодом? Возможно, проблема с разрешениями? Ваш код работает как пользователь с повышенными правами в Windows Vista или Server 2008? Вы пытались запустить редактор реестра от имени администратора?

1 голос
/ 28 августа 2009

Обратите внимание, что помимо «основных» функций реестра, которые начинаются с «Reg», есть также вспомогательные функции, начинающиеся с «SHReg». Они предназначены для использования Shell , т. Е. Explorer, но задокументированы и могут использоваться в обычных приложениях. Обычно это тонкие обертки, которые облегчают выполнение некоторых общих задач. Они являются частью "Shell LightWeight API" (shlwapi.dll)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...