2012-12-06 38 views
2

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

现在,我不觉得它会传递所有的值,就像它跳过一些,最后变成空白并崩溃。

这是一个控制台程序,主要是这样的:

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

现在,主要调用这一空白

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

我从注册表类最佳工作很远,但我的知识应该没问题吧? ,我已经盲目地主演了太久,我认为这将是另一双眼睛:)

崩溃发生在:字符串值= SubKey.GetValue(valueName).ToString() ; 与NullReferenceException 另外,它不显示一个messageBox与一个键内的所有值,这就像它只是随机选择EM。

该问题的视觉效果。 http://peecee.dk/uploads/122012/Untitled2.png

+0

如果您收到一个错误,请发布消息和堆栈跟踪。 –

+0

对不起,我忘记了它产生的实际错误。 –

+0

然后,您需要再次运行代码并捕获它。 –

回答

2

MSDN

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

您更好地处理这种情况(至少用一个简单的if):

object RawValue = SubKey.GetValue(valueName); 
string Value = RawValue != null ? RawValue.ToString() : ""; 
+0

如果仅仅是这样,可惜的是它也出现在DWORD中,这也应该是可以读取的,对吗? - 我已经更新了我的帖子,图片应该显示视觉方面 –

+0

@SimonLausten您可以将日志放在foreach之前吗?检查哪个值返回null? –