Получить значение раздела реестра C#

#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() );
        }
    }
}