lalit.mca2006 Ответов: 2

Получение проблемы для чтения значения реестра . Он всегда возвращает "null"


Привет
Я использовал следующий код в c# для чтения значения реестра --
RegistryKey regkey;
            regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(path);


мое окружение таково --

Операционная система --- windows server 2008-R5 (64 бит)
visual studio 2008
а в project property platform target-это "x86 "

Мое требование заключается в том, что я хочу написать код, который должен работать с целевой платформой как "x86 ".
когда тот же код я использовал и менял целевую платформу x64 или любой процессор , он работал нормально .
но мне нужна платформа target только как x86 .

я погуглил его и обнаружил, что нам нужно использовать @"SOFTWARE\Wow6432Node\", но даже это не решило мою проблему .

Поэтому , пожалуйста, помогите мне в этом, заранее спасибо .

2 Ответов

Рейтинг:
7

Sergey Alexandrovich Kryukov

Это просто означает, что поиск по ключу не удался: http://msdn.microsoft.com/en-us/library/z9f66s0a.aspx[^].

Причина проста: ключ path не найти. Используйте Regedit, чтобы проверить это. Я также могу сказать вам, что проблема не связана с отсутствием требуемых привилегий: в таком случае вызов вызовет исключение.

[Правка #1]

Пожалуйста, смотрите мой комментарий ниже.

Вот ваша проблема: вы работаете с x86 архитектура набора инструкций через эмулятор WoW64 на 64-а. Ваш реестр имеет отдельные различные представления для каждой архитектуры, поэтому по умолчанию вы используете это представление Microsoft.Win32.RegistryView.Registry32. Если вы проверяете путь с помощью Regedit, вы можете увидеть другие данные, потому что вы смотрите на RegistryView.Registry64.

Таким образом, если вам нужно получить доступ к некоторым данным реестра в одном представлении, вы должны решить, какой из них. Затем, в общем случае, вы должны явно указать представление:

RegistryKey baseKey = RegistryKey.OpenBaseKey(
     RegistryHive.LocalMachine,
     RegistryView.Registry64);
RegistryKey key = baseKey.OpenSubKey(yourPath, RegistryKeyPermissionCheck.ReadSubTree); 


Кроме того, вы можете работать с различными наборами данных для различных представлений/архитектур.

Вы получаете картину?

[Правка #2]

Кроме того, вам может потребоваться иметь разный код для разных целевых архитектур наборов команд. Например, в 32-разрядной системе вам может потребоваться использовать Default ключ.

Во-первых, вам нужно выяснить "битность" текущего процесса. Для этого достаточно просто получить размер IntPtr:
http://msdn.microsoft.com/en-us/library/system.intptr.size.aspx[^].

Оставшийся вариант, если это 4 (32-битные), находится там, где он выполняется, на WoW64 или родной платформе. Вот как это делается:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx[^].

Примените немного логики. Обратите внимание, что вам не нужно точно определять 64-битную архитектуру для вашей цели (x86-64 или Itanium), что было бы сложнее.

Смотреть также:
http://en.wikipedia.org/wiki/WOW64[^],
http://en.wikipedia.org/wiki/X86[^],
http://en.wikipedia.org/wiki/X86-64[^],
http://en.wikipedia.org/wiki/Itanium[^].

—СА


lalit.mca2006

спасибо Сергею за ответ, но путь правильный, потому что он работает в платформе target 64 или "любом процессоре".

полный путь был :- "SOFTWARE\mycomanayname\Settings\ActiveDirectory\"

Sergey Alexandrovich Kryukov

Откуда вы знаете, что этот путь действительно существует? (Это действительно "mycomanayname"? странное имя...) Вы понимаете, что, чтобы использовать этот призыв, весь путь должен существовать до вызова- А вы его проверяли? И вам нужно открыть улей RegistryView32, так как целевая архитектура x86 работает через WoW64 на каждой из 64-битных архитектур.
—СА

Sergey Alexandrovich Kryukov

Пожалуйста, смотрите обновленный ответ после редактирования. (И спасибо за разъяснения.)
—СА

Sergey Alexandrovich Kryukov

А теперь [правка №2]...
—СА

lalit.mca2006

Спасибо за такую ценную информацию, но Сергей все же я хочу еще одну услугу ,потому что я использую .net framework 3.5, а в 3.5 я не могу найти RegistryKey.Метод OpenBaseKey (....).

Sergey Alexandrovich Kryukov

ОП! Я не обратил внимания, извините. Действительно, этот метод отсутствует в 3.5.
Вероятно, вам следует использовать вместо этого Wow6432Node...
—СА

lalit.mca2006

Да, СА , я пытался, но все равно безуспешно . Поэтому не могли бы вы предложить мне какой-нибудь другой способ сделать то же самое .

Sergey Alexandrovich Kryukov

Давай еще раз. Вы можете скомпилировать свой код для x86, а также x86-64 (x64), не так ли?

Похоже, что эквивалентные пути должны быть:

для x86 код :
"ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\..."

код для х64 :
"Программное обеспечение\Wow6432Node\..."

Может быть, вы пытаетесь сделать все наоборот? Пожалуйста, поймите: вы получаете доступ к x86 (32-разрядному) представлению из x64 (x86-64), а не наоборот.

—СА

lalit.mca2006

Позвольте мне объяснить еще раз :-
у меня есть 64-битная машина windows server -2008, и мой проект-это приложение windows(desktop) в .net framework 3.5 .теперь я хочу прочитать некоторые значения реестра .

это следующие результаты, которые я получаю :-
path =SOFTWARE\xxx\Settings\ActiveDirectory\
RegistryKey regkey = Microsoft.Win32.Registry.Местная машина.OpenSubKey(путь);
В качестве целевой платформы x86 в раздел реестра = значение null
целевые платформы x64 &амп; любой процессор = получаю правильное значение
---------------------------------------------------------

path =SOFTWARE\Wow6432Node\xxx\Settings\ActiveDirectory\
RegistryKey regkey = Microsoft.Win32.Registry.Местная машина.OpenSubKey(путь);
если целевая платформа x86 , regkey = null
если платформа target x64 & any cpu regkey== null


SA , у меня есть ограничение , что я должен использовать только платформу target как x86, поэтому, если я использую x86, то что я должен сделать, чтобы получить значение реестра .
пожалуйста, дайте мне знать, могу ли я объяснить свою фактическую проблему .

Sergey Alexandrovich Kryukov

Именно это я и имел в виду с самого начала. Все выглядит согласованно.
У вас нет ничего на этом ключе в представлении x86, вот и все. В чем проблема? Либо не используйте этот ключ, либо добавьте туда что-то, чтобы сделать его таким же, как в представлении x64. Вы видите эту картину?

Когда вы пытаетесь сравнить этот факт с тем, что вы видите с помощью Regedit, вы путаетесь, но только потому, что это приложение скомпилировано для x64 target. Вот почему поддерживается узел Wow6432Node, чтобы отобразить то, что вы увидите в представлении x86.

Если представления показывают разные результаты, то так оно и есть... просто по-другому. Либо сделайте их такими же, либо уходите с ними. Все последовательно.

—СА

lalit.mca2006

спасибо SA за этот вывод , я получил так много вещей, очищенных о моих результатах вывода .
Но, пожалуйста , последний вопрос заключается в том, что если я построю проект на x86, смогу ли я получить ключевое значение в целевой платформе x86 ?

наконец, мне нужно получить реестр в x86 . :(

Sergey Alexandrovich Kryukov

Я не совсем понимаю. Вы получите доступ ко всему реестру, но только в его представлении x86, Registry32. Этот реестр должен быть согласован с реестром 32-разрядной системы, но код может выполняться на всех 32-разрядных и 64-разрядных платформах одинаково. Это связано с тем, что он будет работать либо на родной платформе, либо на WoW64, которая является 32-разрядной подсистемой в версиях ОС, основанных на архитектурах x86-64 или IE64...

Кстати, вы все-таки примете формальный ответ (зеленая кнопка "принять")?

—СА

lalit.mca2006

Спасибо SA , извините, что я не проверил эту функцию (зеленая кнопка "принять") .
В любом случае, приятно видеть ваш ответ .

Sergey Alexandrovich Kryukov

Вообще никаких проблем...
—СА

lalit.mca2006

я не видел никакой картины СА .

Sergey Alexandrovich Kryukov

И я думаю, что теперь это становится очевидным...
—СА

lalit.mca2006

да, это очевидно, но нужно найти, что как я могу получить значение x64, когда целевая платформа x86 ?

Sergey Alexandrovich Kryukov

В вашем случае значения нет, ключ отсутствует в представлении Registry32. Уходите вместе с ним.
—СА

Рейтинг:
20

Bernhard Hiller

Будьте осторожны с перенаправлением в 64-битных операционных системах. Когда ты это сделаешь

string path = @"Software\Microsoft\Office"
RegKey regkey = Registry.LocalMachine.OpenSubKey(path);

в 64-битной системе с 32-битным приложением ключ, открытый приведенными выше строками, На самом деле является
HKLM\Software\Wow6432Node\Microsoft\Office
- обратите внимание на Wow6432Node в пути! Поэтому будьте осторожны, когда вы смотрите в реестр с помощью regedit.


Sergey Alexandrovich Kryukov

5ed, но ОП остается в замешательстве. Пожалуйста, ознакомьтесь с нашим обсуждением представления x86 в разделе WoW64 в комментариях к моему ответу.
Не могли бы вы объяснить ОП, что картина выглядит последовательной, вы говорите свое мнение о проблеме. OP озабочен идеей "правильных значений", в то время как в представлении x86 значение (точнее, отсутствие какого-то под-ключа) также является "правильным", это то, что действительно есть в реестре...
—СА

Bernhard Hiller

Спасибо. Тем временем ОП принял ваш ответ и, возможно, понял проблему.
Проблемы x86/x64 могут быть очень запутанными. Но есть также две доступные версии regedit: он может открыть его из C:\Windows\SysWOW64 и выяснил, что нет никакого Wow6432Node, и при сравнении с "нормальным" regedit он мог видеть, что он на самом деле показывает Wow6432Node...

Sergey Alexandrovich Kryukov

О, Спасибо за записку.
Хорошая идея, кстати, я не знал о WoW64 regedit, спасибо. С .NET 3.5 (где представления еще не были напрямую поддержаны API) это может быть очень полезно.
—СА