public static bool IsApplictionInstalled(string p_name)
{
string displayName;
RegistryKey key;
// search in: CurrentUser
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// search in: LocalMachine_32
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// search in: LocalMachine_64
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// NOT FOUND
return false;
}
此方法检查32位或64位Win OS中的软件,但它无法正常工作,在key.GetSubKeyNames()中的String keyName处压缩,Object引用未设置为对象的实例。任何人告诉我的原因是什么,
答案 0 :(得分:4)
我认为问题可能在这里:
key = Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
在32位上该键不存在。
所以你应该使用(对你检查的每一把钥匙)
key = ....
if (key != null)
{
foreach (String keyName in key.GetSubKeyNames())
// ....
}
另一个信息:请注意,某些(很多?)注册表项不包含displayName
值,因此您的比较可能会失败。如果不存在,请尝试(仅作为示例)使用密钥名称代替displayName
。
答案 1 :(得分:1)
错误表示OpenSubKey
返回了null
(当您尝试访问设置为NullReferenceException
的变量的成员时,您获得了null
。这反过来意味着您要查找的注册表项不存在。
在尝试使用null
对象之前添加key
检查。
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
if(key != null)
{
foreach (String keyName in key.GetSubKeyNames())
{
// ....
}
}