Получить значение ключа реестра C # - PullRequest
5 голосов
/ 22 мая 2011

Я уже просмотрел существующие темы, поэтому, пожалуйста, постарайтесь не пропускать ссылки здесь.

Я хочу получить значение ключа реестра - просто и понятно.Вот что у меня есть.

Реестр: 1) Сделал ключ в

Current_User \ Software \ Custom_Subkey \ Custom_Value \ Custom_key \ string_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());
            }
        }

Надеюсь, это простое исправление.Я с нетерпением жду ваших ответов.Спасибо, Эван

Ответы [ 3 ]

8 голосов
/ 22 мая 2011

Полагаю, вы хотите root.GetSubKeyNames() в цикле, а не GetValueNames()

Пока значения работают для получения значений, я бы предложил следующий цикл:

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());
    }
 }
3 голосов
/ 22 мая 2011

Метод OpenSubKey не выдает исключение, если указанный подраздел не найден.Вместо этого он просто возвращает null.Как программист, вы обязаны убедиться, что соответствующий ключ был найден и открыт, проверив возвращаемое значение вызова метода.

Таким образом, я подозреваю, что указанный вами ключ реестра недействителен.Откройте редактор реестра (regedt32.exe) и убедитесь, что вы можете найти ключ в реестре точно так, как написано .

Если вы обнаружите, что ключ реестра действительно находится именно там, где выКак и предполагалось, проблема может быть связана с подсистемой WOW64, которая позволяет 64-разрядным версиям Windows запускать 64-разрядные приложения.Если значение было записано в реестр 32-разрядной программой, вы не сможете прочитать его с помощью приведенного выше кода из 64-разрядной программы (или наоборот).Самый простой способ проверить это - изменить настройки компиляции для вашего проекта.Например, если вы сейчас компилируете для x86, то перейдите на компиляцию для x64 или наоборот. Перенаправление реестра также может мешать вам;это также проверит.

1 голос
/ 22 декабря 2011

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

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