1

これが単純な場合は申し訳ありませんが、私は大学以来コーディングしていません。Windows 7でレジストリエントリを表示するプログラムを作成しようとしています。最初にレジストリ値が存在するかどうかを確認してから、値が何であるかを確認します。存在しない場合は1つのメッセージが必要であり、存在する場合は値1を反映するメッセージと値0を反映するメッセージが必要です。レジストリキーが存在しない場合でもコードが機能するようになりました。しかし、キーと値を追加するとクラッシュします。ここで何が間違っているのかわかりません。任意の提案をいただければ幸いです。これが私のコードです。

using (RegistryKey Key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\services\LanmanServer\Parameters"))
if (Key != null)
{
    string val = (string)Key.GetValue("EnableOplocks");
    if (val == null)
    {
        oplockTextBox.Text = "Not Present In Registry";
        oplockTextBox.BackColor = Color.Yellow;
    }
    else if (val == "1")
    {
        opslockTextBox.Text = "NO";
        opslockTextBox.BackColor = Color.Red;
    }
    else
    {
        oplockTextBox.Text = "YES";
        oplockTextBox.BackColor = Color.Green;
    }
}
else
{
    MessageBox.Show("");
}
4

3 に答える 3

4

私の知る限り、EnableOplocksそのレジストリキーの値はDWORD値であり、これを使用して取得するintときに値が表示されます。GetValue()をにキャストしようとするintと、stringが生成されInvalidCastExceptionます。

代わりに、これを試す必要があります。

int? val = Key.GetValue("EnableOplocks") as int?;
if (val == null)
{
    // ..
}
else if (val == 1)
{
    // ...
}

またはこれ:

object val = Key.GetValue("EnableOplocks");
if (val == null)
{
    // ...
}
else
{
    string strVal = val.ToString();
    if (strVal == "1")
    {
        // ...
    }
}

一般的に、あなたが持っているすべてのエラー情報を提供することを忘れないでください。「クラッシュする」と言うことはあまり有益ではありません。

于 2013-02-08T04:43:15.197 に答える
1

レジストリは、文字列以外のデータ型を保持できます。何が起こっているのintかというと、返品される可能性が高いため、をキャストしようとするとクラッシュしますintstring

値を取得してに保存し、objectデバッガーを中断します。これで、オブジェクトに格納されているデータ型を確認し、コードを変更して正しいキャストを作成できるようになります。

もう1つのオプションは.ToString()、キャストの代わりに使用することです。値1の代わりに文字列1(現在のように)を比較する必要があります。ただし、すべてを文字列に変換するのではなく、常に正しいタイプを使用することを好みます。

于 2013-02-08T04:42:30.283 に答える
1

フォローを使用します。

string val = Key.GetValue("EnableOplocks").ToString();  

編集

using (RegistryKey Key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\services\LanmanServer\Parameters"))
if (Key != null)
{
    var val = Key.GetValue("EnableOplocks");
    if (val == null)
    {
        oplockTextBox.Text = "Not Present In Registry";
        oplockTextBox.BackColor = Color.Yellow;
    }
    else if (val.ToString() == "1")
    {
        opslockTextBox.Text = "NO";
        opslockTextBox.BackColor = Color.Red;
    }
    else
    {
        oplockTextBox.Text = "YES";
        oplockTextBox.BackColor = Color.Green;
    }
}
else
{
    MessageBox.Show("");
}
于 2013-02-08T04:43:04.250 に答える