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

今、メインはこれをボイドと呼んでいます

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を追加すると、キー内のすべての値を含むmessageBoxは表示されません。これは、ランダムにemを選択するようなものです。

問題のビジュアル。 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 に答える