C # Windows реестр Ошибка GetValue - PullRequest
2 голосов
/ 06 декабря 2010

У меня есть программа, которая выводит различные значения реестра из "Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ComDlg32 \ LastVisitedMRU".

Однако программа выдает ошибку при невозможности преобразования типа ʻobject 'в' string 'в переменной s в части GetValue или в программе! И программа выдает ошибку «Не удается получить доступ к закрытому ключу реестра».

Может кто-нибудь дать совет по кодам? Спасибо!

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;

namespace RegKeys
{
class ConsoleApplication1
{
    static void Main(string[] args)
    {
        try
        {
            RegistryKey rk = Registry.CurrentUser;

            rk = rk.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU", false);
            PrintKeys(rk);
        }

        catch (Exception MyError)
        {
            Console.WriteLine("An error has occurred: " + MyError.Message);
        }
    }

    static void PrintKeys(RegistryKey rk)
    {
        if (rk == null)
        {
            Console.WriteLine("No specified registry key!");
            return;
        }

        String[] names = rk.GetValueNames();

        Console.WriteLine("Subkeys of " + rk.Name);
        Console.WriteLine("-----------------------------------------------");

        foreach (String s in names)
        {
            try
            {
                if (s == "MRUList")
                {
                    continue;
                }

                else
                {
                    String val = rk.GetValue(s);
                    Console.WriteLine(s + " Contains the value of : " + val);
                }

                rk.Close();
            }

            catch (Exception MyError)
            {
                Console.WriteLine("An error has occurred: " + MyError.Message);
            }

            Console.WriteLine("-----------------------------------------------");
            rk.Close();
        }
    }
}
}

Ответы [ 6 ]

3 голосов
/ 06 декабря 2010

Вот несколько советов по кодам:

GetValue возвращает object, а не string. Вам нужно либо привести его к строке, либо вызвать ToString (всегда используйте первый, если вы знаете, что это на самом деле строка).

2 голосов
/ 06 декабря 2010

Как и совет Матти, неясно, почему вы просматриваете все подзначения. Почему бы просто не получить тот, который вы хотите? Примерно так:

using System;
using Microsoft.Win32;

class Test
{
    static void Main()
    {
        using (var key = Registry.CurrentUser.OpenSubKey
               (@"Software\Microsoft\Windows\CurrentVersion\" + 
                @"Explorer\ComDlg32\LastVisitedMRU", false))
        {
            string value = (string) key.GetValue("MRUList");
            Console.WriteLine(value);            
        }
    }
}

(обратите внимание на оператор using, чтобы всегда закрывать раздел реестра.)

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

0 голосов
/ 31 мая 2013

Я использую структуру и пытаюсь сделать это.Я продолжал возвращать объекты, когда хотел строки и когда .ToString () вся программа просто зависала.Я понял, что свойства, которые я хотел получить, также являются полями.Мне потребовался целый день, чтобы понять это:

string value = myObjectInstance.GetType().
   GetField("myFieldName").GetValue(newEntry) as string;

Это отлично сработало для меня.

0 голосов
/ 06 декабря 2010

Используйте метод Convert.ToString() для преобразования object в строку. Вы также можете использовать .ToString(), но это может привести к исключению нулевой ссылки, если ключ не существует.

Во-вторых, за исключением того, что вы получаете с закрытым ключом. Измените ваш for each цикл и переместите вызов rk.Close () вне цикла.

    foreach (String s in names)
    {
        try
        {
            if (s == "MRUList")
            {
                continue;
            }

            else
            {
                String val = rk.GetValue(s);
                Console.WriteLine(s + " Contains the value of : " + val);
            }


        }

        catch (Exception MyError)
        {
            Console.WriteLine("An error has occurred: " + MyError.Message);
        }

        Console.WriteLine("-----------------------------------------------");

    }
    rk.Close();
0 голосов
/ 06 декабря 2010

Я полагаю, что GetValue ожидает строчную 's' строку, которая является примитивом, в отличие от прописной 'S' String, которая является объектом. Попробуйте это:

String val = rk.GetValue(s.toString());

Или вообще замените использование 'string' на 'String', за исключением случаев, когда 'String' подходит.

0 голосов
/ 06 декабря 2010

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

String val = (String) rk.GetValue(s);
//or
String val = rk.GetValue(s) as String;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...