Не найдено исключение при запуске ManagementEventWatcher

Исключение не найдено несколько раз при запуске MaagementEventWatcher

Мой пример кода приведен ниже:

 try
        {
            string scopePath = @"\\.\root\default";
            ManagementScope managementScope = new ManagementScope(scopePath);
            WqlEventQuery query =
                new WqlEventQuery(
                    "SELECT * FROM RegistryKeyChangeEvent WHERE " + "Hive = 'HKEY_LOCAL_MACHINE'"
                    + @"AND KeyPath = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'");
            registryWatcher = new ManagementEventWatcher(managementScope, query);
            registryWatcher.EventArrived += new EventArrivedEventHandler(SerialCommRegistryUpdated);

            registryWatcher.Start();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            if (registryWatcher != null)
            {
                registryWatcher.Stop();
            }
        }

Исключение:

  Not found
  at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
  at System.Management.ManagementEventWatcher.Start()
  at MTTS.LabX.RockLog.AppService.USBMonitor.AddRegistryWatcherHandler()]

Примечание: я проверил в реестре, папки и файлы найдены.

2 ответа

Решение

На самом деле проблема была, в ноутбуках (ПК, имеющих последовательные порты, поэтому порт COM1) при первом запуске папки SERIALCOMM не были созданы в реестре, потому что,

в основном мы подключили устройство к USB-порту или последовательному порту, который создаст папка SERIALCOMM, в этом случае мы используем WMI для получения подключенных коммуникационных портов из реестра.

в некоторых ноутбуках USB-порты и последовательные порты не подключены. Итак, папка SERIALCOMM не создана. В это время мы обращаемся к этому пути в реестре и получаем ошибку.

так что решение,

try
            {
                string scopePath = @"\\.\root\default";
                ManagementScope managementScope = new ManagementScope(scopePath);

                string subkey = "HARDWARE\\DEVICEMAP\\SERIALCOMM";

                using (RegistryKey prodx = Registry.LocalMachine)
                {
                    prodx.CreateSubKey(subkey);
                }

                WqlEventQuery query = new WqlEventQuery(
                    "SELECT * FROM RegistryKeyChangeEvent WHERE " +
                   "Hive = 'HKEY_LOCAL_MACHINE'" +
                  @"AND KeyPath = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'");

                registryWatcher = new ManagementEventWatcher(managementScope, query);

                registryWatcher.EventArrived += new EventArrivedEventHandler(SerialCommRegistryUpdated);
                registryWatcher.Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                if (registryWatcher != null)
                {
                    registryWatcher.Stop();
                }
            }

Исключение ManagementException "Not found" генерируется, когда в WQL-запросе нет совпадения. Возможно, вы указали неправильный KeyPath или KeyPath больше не доступен.

Другие вопросы по тегам