2009-08-27 8 views
7

Я ищу чистый способ проверить, существует ли раздел реестра. Я предположил, что 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 когда Я пробую это.

Update 2: Мой точный код заключается в следующем:

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

... но результат выходит как ERROR_SUCCESS, несмотря на то, что я положил в ключ, который не существует.

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

+4

Каков путь к ключу, который вы проверяете? Возможно ли, что вы работаете в один из магических путей, которые перенаправляются (например, Wow6432Node)? У меня есть смутное воспоминание о том, чтобы увидеть эту проблему раньше. Я думаю, вы можете открыть несуществующий ключ. При попытке установить или запросить значение в этом ключе вы получите сбой. –

+1

Он также может быть в [registry VirtualStore] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspx). – ghord

ответ

7

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

RegOpenKeyEx вернет ERROR_SUCCESS, если он найдет ключ. Просто проверьте эту константу, и вам хорошо идти.

+1

Ну, это не столько случай преждевременной оптимизации, сколько нежелания добавить такую ​​сложность в код. – slicedlime

4

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 или на сервере 2008 года? Вы пытались запустить редактор реестра в качестве администратора?

+0

Вы также можете получить ERROR_PATH_NOT_FOUND –

0

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

Смежные вопросы