Чтение строкового значения из ключа реестра

Мой упрощенный код:

HKEY hKey;

if(someCondition)
    lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_READ, &hKey);
else
    lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, "SOFTWARW\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_READ, &hKey);

if(lRes == ERROR_SUCCESS)
{
    std::wstring strKeyValue;
    lRes = GetStringRegKey(hKey, L"valueName", strKeyValue, L"bad");
    if(lRes == ERROR_SUCCESS)
    {
         //doSomething
    }
}

Оба RegOpenKeyExW() возвращают ERROR_SUCCESS, но в одном случае (чтение из Wow6432Node) GetStringRegKey() возвращает ERROR_SUCCESS и инициализирует strKeyValue, а в другом случае возвращает ERROR_FILE_NOT_FOUND. Все пути и имена значений правильные. Записи были добавлены в реестр вручную.

В чем проблема? Есть ли проблема с учетными данными? Спасибо!


person Sanich    schedule 12.03.2013    source источник
comment
У вас есть опечатка в строке: lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, "SOFTWARW\\Wow6432Node\`. It should be "SOFTWARE". Also, you don't need to include the \\Wow6432Node\` при открытии ключа реестра. ОС Windows сделает это за вас. Вам просто нужно знать об этом, когда вы сами идете ПОСМОТРЕТЬ в реестре с помощью инструмента RegEdit.exe.   -  person StarPilot    schedule 13.03.2013


Ответы (1)


Примечание. Первоначальный вопрос для этого заключался в том, в чем разница между использованием HKEY_CLASSES_ROOT и HKEY_LOCAL_MACHINE и почему использование одного работает, а другого нет. Это ответ, опубликованный на этот вопрос.

Взято из источника Microsoft: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724475(v=vs.85).aspx

Ключ HKEY_CLASSES_ROOT (HKCR) содержит ассоциации расширений имен файлов и регистрационную информацию COM-класса, такую ​​как идентификаторы ProgID, CLSID и IID. Он в первую очередь предназначен для совместимости с реестром в 16-битной Windows.

Информация о регистрации класса и расширении имени файла хранится в ключах HKEY_LOCAL_MACHINE и HKEY_CURRENT_USER. Раздел HKEY_LOCAL_MACHINE\Software\Classes содержит настройки по умолчанию, которые могут применяться ко всем пользователям на локальном компьютере. Раздел HKEY_CURRENT_USER\Software\Classes содержит параметры, применимые только к интерактивному пользователю. Раздел HKEY_CLASSES_ROOT предоставляет представление реестра, объединяющее информацию из этих двух источников. HKEY_CLASSES_ROOT также обеспечивает это объединенное представление для приложений, разработанных для предыдущих версий Windows.

Таким образом, разница заключается в следующем: HKEY_CLASSES_ROOT представляет унифицированное представление реестра для предыдущей версии Windows и объединяет пользовательские настройки по умолчанию с текущими пользовательскими настройками. Он в первую очередь предназначен для чтения настроек интерактивного пользователя. Он не должен использоваться для хранения значений, только для чтения, как можно найти в предоставленной ссылке, и он фактически отображается в куст `HKEY_CURRENT_USER'.

HKEY_CURRENT_USER — это «истинный» путь реестра, поэтому все взаимодействия с реестром, требующие доступа для записи, должны проходить через него из соображений безопасности. Выбор ветки зависит от того, обновляете ли вы только настройки пользователя в реестре или все настройки пользователя в реестре.

person StarPilot    schedule 12.03.2013
comment
Как это объясняет FILE_NOT_FOUND, полученное при чтении из HKEY_LOCAL_MACHINE? - person Sanich; 13.03.2013
comment
Запись, которую вы запросили, не существует, или вы не можете получить к ней доступ с вашими текущими кредитными данными. Вы должны проверить, что вы запрашиваете, и проверить реестр, чтобы убедиться, что путь к записи, которую вы пытаетесь получить, верен. Если вы используете 32-битное приложение в 64-битной ОС, такой как Windows 7, вы обнаружите, что фактический раздел реестра находится не там, где вы думаете, поскольку они вставляют Wow6432Node после ключа ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ. - person StarPilot; 13.03.2013
comment
В качестве дополнения --- ОС позаботится о 32-битных приложениях, работающих под управлением WoW64 (и, следовательно, о сопоставлении их вызовов реестра с Wow6432Node), но если вы сами заглянете в реестр, вам нужно понять, что дополнительные улей есть. - person StarPilot; 13.03.2013
comment
Запись, которую я пытаюсь прочитать, — это запись, которую я добавил вручную в путь HKEY_LOCAL_MACHINE. - person Sanich; 13.03.2013
comment
На самом деле я успешно читаю значения из пути Wow6432Node. В чем проблема с удостоверениями? Путь: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run - person Sanich; 13.03.2013
comment
Процесс, обращающийся к разделу реестра, должен иметь необходимые привилегии, предоставленные ему. Если администратор создает раздел реестра, простой пользователь иногда не может прочитать этот созданный раздел реестра. лучше всего, чтобы пользователь создал свои собственные ключи реестра (с помощью программного обеспечения), чтобы у них были необходимые права для чтения. - person StarPilot; 13.03.2013
comment
Давайте продолжим обсуждение в чате - person Sanich; 13.03.2013