john1990_1 Ответов: 1

Когда я пытаюсь связать расширение файла с моей программой, почему я получаю эту ошибку?


<pre>public static void SetAssociation(string Extension, string KeyName, string OpenWith, string FileDescription)
        {
            RegistryKey BaseKey;
            RegistryKey OpenMethod;
            RegistryKey Shell;
            RegistryKey CurrentUser;

            BaseKey = Registry.ClassesRoot.CreateSubKey(Extension);
            BaseKey.SetValue("", KeyName);

            OpenMethod = Registry.ClassesRoot.CreateSubKey(KeyName);
            OpenMethod.SetValue("", FileDescription);
            OpenMethod.CreateSubKey("DefaultIcon").SetValue("", "\"" + OpenWith + "\",0");
            Shell = OpenMethod.CreateSubKey("Shell");
            Shell.CreateSubKey("edit").CreateSubKey("command").SetValue("", "\"" + OpenWith + "\"" + " \"%1\"");
            Shell.CreateSubKey("open").CreateSubKey("command").SetValue("", "\"" + OpenWith + "\"" + " \"%1\"");
            BaseKey.Close();
            OpenMethod.Close();
            Shell.Close();


            // Delete the key instead of trying to change it
            CurrentUser = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.ucs", true);
            CurrentUser.DeleteSubKey("UserChoice", false);// ERROR HERE  System.NullReferenceException object reference not set to an instant of an object
            CurrentUser.Close();

            // Tell explorer the file association has been changed
            SHChangeNotify(0x08000000, 0x0000, IntPtr.Zero, IntPtr.Zero);
        }

        [DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);


Что я уже пробовал:

я отлаживаю программу в Visual Studio после щелчка правой кнопкой мыши на visual studio и выбора запуска от имени администратора.

Richard MacCutchan

Это также поможет ты если вы введете в свой код правильную проверку ошибок.

john1990_1

смотрите ниже пожалуйста

Richard MacCutchan

Что?

john1990_1

пожалуйста, посмотрите, что я прокомментировал в ответ

Richard MacCutchan

Не понимаю, какое это имеет отношение к моему предложению. Независимо от того, являетесь ли вы любителем или профессионалом, вы должны использовать все функции, которые облегчают вам жизнь. А ловить нулевые ссылки - это самое основное.

1 Ответов

Рейтинг:
11

F-ES Sitecore

Вы получаете его, потому что "CurrentUser" равен нулю, если вы научитесь отлаживать свой код или погуглите сообщение об ошибке, вы могли бы обнаружить это сами. Это будет null, потому что строка OpenSubKey выше возвращает null.

Если вы обратитесь к документации по OpenSubKey

Регистрационный ключ.Метод OpenSubKey (String, Boolean) (Microsoft. Win32)[^]

вы увидите, что он возвращает null, когда ключ не существует. Поэтому измените свой код, чтобы создать узел, если он не существует.


john1990_1

я любитель, но немного продвинутый и знаю, что такое исключение null, но что мне делать, чтобы оно не возвращало null?

F-ES Sitecore

после выполнения открытого ключа вы проверяете, является ли CurrentUser нулевым, и если это так, то вы создаете ключ. Таким образом, при первом запуске кода он создаст ключ, а затем будет использовать ранее созданный ключ. Или если он работает на машине с уже имеющимся ключом, он используется.

john1990_1

я частично понял, не могли бы вы объяснить подробнее или отредактировать код, пожалуйста?

F-ES Sitecore

код будет выглядеть так

CurrentUser = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.ucs", правда);
если (текущий пользователь == нуль)
{
// создайте ключ здесь
}

Однако если вы посмотрите документацию для CreateSubKey

https://msdn.microsoft.com/en-us/library/ad51f2dx(v=против 110). aspx

он действительно делает то, что вы хотите, он открывает его, если он существует, или создает его, если его нет, поэтому вместо OpenSubKey просто используйте CreateSubKey

john1990_1

может быть, мне стоит заменить "UserChoice" чем-то другим?

Я звоню:
SetAssociation (". sudoku"," SUDOKU_File", Application.ExecutablePath, " файл судоку");