Мой упрощенный код:
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
, Все пути и имена значений правильные. Записи были добавлены в реестр вручную.
В чем проблема? Есть ли какие-либо проблемы с учетными данными? Спасибо!
Примечание. Первоначальный вопрос для этого заключался в том, в чем разница между использованием 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-битной винде.Информация о регистрации класса и расширении имени файла хранится в
ключи 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
это «истинный» путь к реестру, поэтому все взаимодействие с реестром, для которого требуется доступ на запись, должно проходить через него по соображениям безопасности. Выбор ветви зависит от того, обновляете ли вы только пользовательские настройки в реестре или все пользовательские настройки в реестре.
Других решений пока нет …