2

场景:我们不关心性能。我们有一个需要在注册表中检查的值数组。//这些值前面可以有任何东西。我们需要改变这一点。

现在,我不觉得它迭代了所有的值,就像它跳过了一些,最后变成了 null 并崩溃了。

这是一个控制台程序,主要看起来像这样:

static void Main(string[] args)
    {

        string[] FASKeyWords = new string[] { "DummyValue1", "DummyValue2" };
        RegistryKey BaseKey = Registry.LocalMachine;
        foreach (string FASKeyWord in FASKeyWords)
        {
            Console.WriteLine("Looking in " + BaseKey.Name);
            Console.WriteLine("Looking for : " + FASKeyWord);
            GetSubKeys(BaseKey, FASKeyWord);
        }
    }

现在,Main 称之为 Void

private static void GetSubKeys(RegistryKey SubKey,string KeyWord)
        {
            foreach (string valueName in SubKey.GetValueNames())
            {
                string Value = SubKey.GetValue(valueName).ToString();
//Check for any values at all.
                MessageBox.Show(valueName + " with data : " + Value);

                if (Value.Contains(KeyWord))
                    MessageBox.Show("Found '" + KeyWord + "' At " + SubKey.Name);
            }

            foreach (string Key in SubKey.GetSubKeyNames())
            {
                MessageBox.Show(SubKey.Name);
                GetSubKeys(SubKey.OpenSubKey(Key), KeyWord);
            }
        }

我与 Registry 类的合作远非最佳,但据我所知,这应该没问题吧?,我一直在盲目地主演它太久了,我认为再有一双眼睛会很好:)

崩溃发生在:string Value = SubKey.GetValue(valueName).ToString(); 带有 NullReferenceException 此外,它不会显示带有键内所有值的消息框,就像它只是随机挑选出来一样。

视觉问题。 http://peecee.dk/uploads/122012/Untitled2.png

4

1 回答 1

2

来自MSDN

GetValue 不支持读取 REG_NONE 或 REG_LINK 类型的值。在这两种情况下,都会返回默认值 (null) 而不是实际值。

您最好处理这种情况(至少使用简单的if):

object RawValue = SubKey.GetValue(valueName);
string Value = RawValue != null ? RawValue.ToString() : "";
于 2012-12-06T13:08:48.210 回答