Я ищу чистый способ проверить, существует ли раздел реестра. Я предположил, что 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: Похоже, вы, ребята, правы. Это не работает на одном конкретном тестовом примере (таинственно). Если я попробую его на любом другом ключе, он вернет правильный результат. Двойное удаление его с помощью редактора реестра по-прежнему не отображает ключ. Не знаю, что с этим делать.
Каков путь к ключу, который вы проверяете? Возможно ли, что вы работаете в один из магических путей, которые перенаправляются (например, Wow6432Node)? У меня есть смутное воспоминание о том, чтобы увидеть эту проблему раньше. Я думаю, вы можете открыть несуществующий ключ. При попытке установить или запросить значение в этом ключе вы получите сбой. –
Он также может быть в [registry VirtualStore] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspx). – ghord