C# 在C中获取注册表项和值#
很抱歉,如果这很简单,我从大学起就没有编码过。我正在尝试编写一个程序来查看Windows7中的注册表项。我想先检查注册表值是否存在,然后检查值是什么。如果它不存在,我想要一条消息,如果它存在,我想要一条消息反映值1,另一条消息反映值0。如果注册表项不存在,我可以让代码工作,但是如果我添加注册表项和值,它就会崩溃。不知道我做错了什么。如有任何建议,将不胜感激。这是我的密码C# 在C中获取注册表项和值#,c#,C#,很抱歉,如果这很简单,我从大学起就没有编码过。我正在尝试编写一个程序来查看Windows7中的注册表项。我想先检查注册表值是否存在,然后检查值是什么。如果它不存在,我想要一条消息,如果它存在,我想要一条消息反映值1,另一条消息反映值0。如果注册表项不存在,我可以让代码工作,但是如果我添加注册表项和值,它就会崩溃。不知道我做错了什么。如有任何建议,将不胜感激。这是我的密码 using (RegistryKey Key = Registry.LocalMachine.OpenSubKey(@"SYS
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”类型。为什么需要强制转换为StringToString()
已经返回了一个字符串。由于他的变量val
是string
类型,我们需要为其分配一个sting值(这就是为什么使用ToString()
)@OscarMederos-I理解我的答案中的问题。这是一个输入错误。我尝试了新开发人员的建议,当值存在且为1或0时,它工作正常,但当值不存在(null)时,它崩溃并出现NullReferneceException未处理错误。对象引用未设置为对象的实例。谢谢大家到目前为止的建议,我真的很感谢大家的帮助!你为什么要扮演弦乐演员ToString()
已经返回了一个字符串。由于他的变量val
是string
类型,我们需要为其分配一个sting值(这就是为什么使用ToString()
)@OscarMederos-I理解我的答案中的问题。这是一个输入错误。我尝试了新开发人员的建议,当值存在且为1或0时,它工作正常,但当值不存在(null)时,它崩溃并出现NullReferneceException未处理错误。对象引用未设置为对象的实例。谢谢大家到目前为止的建议,我真的很感谢大家的帮助!谢谢你的建议,杰里什。我试试看会发生什么。很抱歉,没有包括错误信息,我知道得更多,只是盯着代码看了太长时间,然后被划分出来了。我使用了你的第一个示例,效果非常好!非常感谢你的帮助!谢谢你的建议,杰里什。我试试看会发生什么。很抱歉,没有包括错误信息,我知道得更多,只是盯着代码看了太长时间,然后被划分出来了。我使用了你的第一个示例,效果非常好!非常感谢你的帮助!谢谢你的建议,斯科特。我也会研究这个问题,然后再报告。我会使用int?
操作符,它会最好地解决您的问题。谢谢您的建议,Scott。我也会研究这个问题,然后再报告。我会使用int?
操作符,它会最好地解决您的问题。