C# 在C中获取注册表项和值#

C# 在C中获取注册表项和值#,c#,C#,很抱歉,如果这很简单,我从大学起就没有编码过。我正在尝试编写一个程序来查看Windows7中的注册表项。我想先检查注册表值是否存在,然后检查值是什么。如果它不存在,我想要一条消息,如果它存在,我想要一条消息反映值1,另一条消息反映值0。如果注册表项不存在,我可以让代码工作,但是如果我添加注册表项和值,它就会崩溃。不知道我做错了什么。如有任何建议,将不胜感激。这是我的密码 using (RegistryKey Key = Registry.LocalMachine.OpenSubKey(@"SYS

很抱歉,如果这很简单,我从大学起就没有编码过。我正在尝试编写一个程序来查看Windows7中的注册表项。我想先检查注册表值是否存在,然后检查值是什么。如果它不存在,我想要一条消息,如果它存在,我想要一条消息反映值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("");
}

注册表可以保存字符串以外的数据类型。发生的情况是,您可能会返回一个
int
,这就是为什么当您试图将
int
强制转换为
字符串时会崩溃的原因

获取该值并将其存储在
对象中
,然后中断调试器。然后,您应该能够查看对象中存储的数据类型,并更改代码以进行正确的转换


另一个选项是使用
.ToString()
而不是强制转换,您需要比较字符串1(就像现在一样)而不是值1。但是,我总是喜欢使用正确的类型,而不是将所有内容都转换为字符串。

注册表可以保存字符串以外的数据类型。发生的情况是,您可能会返回一个
int
,这就是为什么当您试图将
int
强制转换为
字符串时会崩溃的原因

获取该值并将其存储在
对象中
,然后中断调试器。然后,您应该能够查看对象中存储的数据类型,并更改代码以进行正确的转换

另一个选项是使用
.ToString()
而不是强制转换,您需要比较字符串1(就像现在一样)而不是值1。但是,我总是喜欢使用正确的类型,而不是将所有内容都转换为字符串。

使用follow

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("");
}
使用跟随

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("");
}
据我所知,该注册表项的值是一个
DWORD
值,当您使用
GetValue()
检索它时,它将为您提供一个
int
。试图将
int
强制转换为
字符串
将产生
无效的CastException

相反,您应该尝试以下方法:

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")
    {
        // ...
    }
}
一般来说,请记住提供您所拥有的所有错误信息。说“it crash”并不是很有用。

据我所知,该注册表项的值是一个
DWORD
值,当您使用
GetValue()
检索它时,它会给您一个
int
。试图将
int
强制转换为
字符串
将产生
无效的CastException

相反,您应该尝试以下方法:

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")
    {
        // ...
    }
}


一般来说,请记住提供您所拥有的所有错误信息。说“it崩溃”并不是很有用。

引发了什么异常?看起来这可能是一个权限错误,用什么验证?将值强制转换为字符串可能是
InvalidCastException
吗?对不起,我应该包含异常。是的,上面说InvalidCastException未处理。无法将“System.Int32”类型的对象强制转换为“System.String”类型。将引发什么异常?看起来这可能是一个权限错误,用什么验证?将值强制转换为字符串可能是
InvalidCastException
吗?对不起,我应该包含异常。是的,上面说InvalidCastException未处理。无法将“System.Int32”类型的对象强制转换为“System.String”类型。为什么需要强制转换为String
ToString()
已经返回了一个字符串。由于他的变量
val
string
类型,我们需要为其分配一个sting值(这就是为什么使用
ToString()
)@OscarMederos-I理解我的答案中的问题。这是一个输入错误。我尝试了新开发人员的建议,当值存在且为1或0时,它工作正常,但当值不存在(null)时,它崩溃并出现NullReferneceException未处理错误。对象引用未设置为对象的实例。谢谢大家到目前为止的建议,我真的很感谢大家的帮助!你为什么要扮演弦乐演员
ToString()
已经返回了一个字符串。由于他的变量
val
string
类型,我们需要为其分配一个sting值(这就是为什么使用
ToString()
)@OscarMederos-I理解我的答案中的问题。这是一个输入错误。我尝试了新开发人员的建议,当值存在且为1或0时,它工作正常,但当值不存在(null)时,它崩溃并出现NullReferneceException未处理错误。对象引用未设置为对象的实例。谢谢大家到目前为止的建议,我真的很感谢大家的帮助!谢谢你的建议,杰里什。我试试看会发生什么。很抱歉,没有包括错误信息,我知道得更多,只是盯着代码看了太长时间,然后被划分出来了。我使用了你的第一个示例,效果非常好!非常感谢你的帮助!谢谢你的建议,杰里什。我试试看会发生什么。很抱歉,没有包括错误信息,我知道得更多,只是盯着代码看了太长时间,然后被划分出来了。我使用了你的第一个示例,效果非常好!非常感谢你的帮助!谢谢你的建议,斯科特。我也会研究这个问题,然后再报告。我会使用
int?
操作符,它会最好地解决您的问题。谢谢您的建议,Scott。我也会研究这个问题,然后再报告。我会使用
int?
操作符,它会最好地解决您的问题。