#c# #.net #windows #null #registry
#c# #.net #Windows #null #реестр
Вопрос:
Я уже просмотрел существующие разделы, поэтому, пожалуйста, постарайтесь воздержаться от размещения ссылок здесь.
Я хочу получить значение раздела реестра — простое и понятное. Вот что у меня есть на данный момент.
Реестр: 1) Создал ключ под
Current_UserSoftwareCustom_SubkeyCustom_ValueCustom_keystring_value
Я пытаюсь найти string_value
string reg_subKey = "Software\Custom_Subkey\Custom_Value";
RegistryKey root = Registry.CurrentUser.CreateSubKey(reg_subKey);
foreach (string keyname in root.GetValueNames())
{
textBox4.AppendText(keyname.ToString() Environment.NewLine);
// Appends the following data to textBox4 once the foreach is completed:
// Header1
// Header2
// Header3
// Header4
// Header5
// Now I want to get the VALUES of each header:
using (RegistryKey key = root.OpenSubKey(keyname))
{
**// THIS LINE GETS HIGHLIGHTED WITH THE FOLLOWING ERROR:
"Object reference not set to an instance of an object.**"
MessageBox.Show(key.ValueCount.ToString());
}
}
Надеюсь, это простое исправление. Я с нетерпением жду ваших ответов.
Спасибо,
Эван
Комментарии:
1.
root.OpenSubKey(keyname)
возвращает значение null. Вот почему вы получаете эту ошибку.2. Тогда это неправильный код? Я предполагаю… Есть ли другой способ открыть ключ?
3. Из документации » Если указанный подраздел не может быть найден, то возвращается значение null».
4. Да, я согласен — путь указан неверно… (каким-то образом) но меня смущает эта часть, поскольку ключ действительно существует. Позвольте мне трижды проверить!
5. Я зашел в реестр и выполнил команду «скопировать имя ключа», и он вернул тот же ключ, который я использую в своей программе. Я также убедился, что «ключевое имя» существует — и у него ДЕЙСТВИТЕЛЬНО есть значение. Таким образом, путь здесь кажется правильным.
Ответ №1:
Я полагаю, вы хотите root.GetSubKeyNames()
, чтобы в цикле не GetValueNames()
Пока values работает над получением значений, я бы предложил следующий цикл:
foreach(string keyname in root.GetSubKeyNames())
{
// use key to get value and set textbox4
using (RegistryKey key = root.OpenSubKey(keyname))
{
MessageBox.Show(key.ValueCount.ToString());
}
}
Комментарии:
1. GetValueNames() работает нормально — он получает все значения для данного подраздела. Но затем я хочу найти строковое значение значений, найденных выше. Здесь я сталкиваюсь с проблемами. Я на 99,99 процента уверен, что имя записано точно так, как оно найдено в реестре. Похоже, мне придется провести еще некоторое расследование.
2. Значение не совпадает с ключом. Смотрите пример кода выше.
3. попал в самую точку. 1 / Правильный ответ.
Ответ №2:
OpenSubKey
Метод не выдает исключение, если указанный подраздел не найден. Вместо этого он просто возвращается null
. Вы как программист несете ответственность за то, чтобы убедиться, что соответствующий ключ был найден и открыт, путем проверки возвращаемого значения вызова метода.
Таким образом, я подозреваю, что указанный вами раздел реестра недействителен. Откройте редактор реестра ( regedt32.exe
) и убедитесь, что вы можете найти ключ в реестре точно так, как написано.
Если вы обнаружите, что раздел реестра действительно расположен именно там, где вы думали, то проблема может быть связана с подсистемой WOW64, которая позволяет 64-разрядным версиям Windows запускать 64-разрядные приложения. Если значение было записано в реестр 32-разрядной программой, вы не сможете прочитать его с помощью приведенного выше кода из 64-разрядной программы (или наоборот). Самый простой способ проверить это — изменить настройки компиляции для вашего проекта. Например, если вы в данный момент выполняете компиляцию для x86, затем перейдите на компиляцию для x64 или наоборот. Перенаправление реестра также может мешать вам; это также будет проверено.
Комментарии:
1. Я знаю, что это звучит как полная чушь, но не стесняйтесь просто отказаться… Не могли бы вы создать раздел реестра в разделе «HKCU software», а затем добавить другой ключ под этим ключом, а затем… присвоить этому конечному ключу значение? Как только ключи будут там, вы сможете увидеть, где я ошибаюсь? Я не думаю, что проблема в моей операционной системе, поскольку я делаю все это на одной машине прямо сейчас (32-разрядная версия).
2. @Evan: Черт возьми, я думал, что 64-разрядное предложение будет ответом. Полагаю, я могу это сделать… Дайте мне минуту.
3. @Evan: Проблема в том, что
root
в нем нет никаких подразделов! У него есть одно значение , но нет подразделов.4. Итак, вы бы предложили мне использовать предоставленный Hogan? Он получает значение просто отлично, но не возвращает имя ключа. Кое-что, что я, безусловно, могу изменить для работы, но — просто спрашиваю.
5. @Evan: Понятия не имею. Трудно сказать, что вы пытаетесь сделать. Я думаю, вы путаете терминологическое значение и ключ. Если код делает то, что вы хотите, тогда используйте его.
Ответ №3:
Я хотел того же самого, и ваш код помог мне, но, как вы сказали, он не работал должным образом. Итак, я внес некоторые изменения, и я думаю, что теперь все работает нормально! Попробуйте это:
//Just make the reference until "custom_subkey", not to the next one ("custom value")
string reg_subKey = "Software\Custom_Subkey";
RegistryKey root = Registry.CurrentUser.CreateSubKey(reg_subKey);
//Use GetSubKeyNames, instead of GetValueNames, because now you are in a higher level
foreach (string keyname in root.GetSubKeyNames())
{
using (RegistryKey key = root.OpenSubKey(keyname))
{
foreach (string valueName in key.GetValueNames())
{
MessageBox.Show(valueName);
MessageBox.Show(key.GetValue(valueName).ToString() );
}
}
}