Как проверить, установлено ли программное обеспечение в C # или нет? - PullRequest
0 голосов
/ 01 декабря 2011
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, но оно не работает, что приводит к разрушению String keyName в key.GetSubKeyNames (), ссылка на объект не установлена ​​для экземпляра объекта.кто-нибудь скажи мне, в чем причина,

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

Я думаю, что проблема может быть здесь:

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 голос
/ 01 декабря 2011

Ошибка означает, что OpenSubKey вернул null (вы получаете NullReferenceException при попытке получить доступ к члену переменной, установленному в null). Это, в свою очередь, означает, что искомый раздел реестра не существует.

Добавьте проверку null перед использованием объекта key.

key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
if(key != null)
{
    foreach (String keyName in key.GetSubKeyNames())
    {
      // .... 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...