2013-03-12 2 views
0

Мой упрощенный код:Чтение значение строки из реестра ключ

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. Все пути и имена значений правильные. Записи были добавлены в реестр вручную.

В чем проблема? Есть ли какие-либо полномочия? Благодаря!

+0

Вы Хэ опечатка в строке: 'ЖРД = RegOpenKeyExW (HKEY_LOCAL_MACHINE,«SOFTWARW \\ Wow6432Node \\ 'Это должно быть. "SOFTWARE" Кроме того, вам не нужно включать' \\ Wow6432Node \\. 'при открытии ключа реестра. ОС Windows сделает это за вас. Вам просто нужно знать об этом, когда вы сами смотрите LOOK в реестре с помощью инструмента RegEdit.exe. – StarPilot

ответ

0

Примечание: Первоначальный вопрос в этом заключается в том, какая разница между использованием 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 - это «истинный» путь к реестру, поэтому все взаимодействие с реестром, для которого требуется доступ на запись, должно пройти через него из-за соображений безопасности. Какая ветка зависит от того, обновляете ли вы только настройки пользователя в реестре или все пользовательские настройки в реестре.

+1

Как это объясняет' FILE_NOT_FOUND', полученный при чтении из 'HKEY_LOCAL_MACHINE'? – Sanich

+0

Запись, которую вы просили, не существует, или вы не можете получить к ней доступ с вашими текущими версиями. Вы должны проверить, что вы просите, и проверить реестр, чтобы убедиться, что путь верен для записи, которую вы пытаетесь для достижения. Если вы используете 32-битное приложение на 64-битной ОС, например Windows 7, вы обнаружите, что фактический раздел реестра не там, где вы думаете, когда они вставляют «Wow643 2Node "после клавиши" SOFTWARE ". – StarPilot

+0

Как раз в следующий раз - OS позаботится о 32-разрядных приложениях, работающих под «WoW64» (и, следовательно, при сопоставлении их вызовов реестра в Wow6432Node), но если вы заглянете в реестр самостоятельно, вам нужно понять что дополнительный куст есть. – StarPilot