2013-04-25 6 views
4

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

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

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(); 
       } 
      } 
2

ManagementException «Не найдено» вызывается, если в WQL-запросе нет соответствия. Возможно, вы указали неверный KeyPath или KeyPath больше не доступен.

+0

Я проверил в реестре путь или папку (Key также) доступны. –

+0

Вы проверили журналы событий для каких-либо подробностей? –

+0

Да, я получаю эту ошибку, приведенную ниже в журнале событий logEvent с запросом «SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA« Win32_Processor »AND TargetInstance.LoadPercentage> 99« не может быть реактивирован в пространстве имен »////root/ CIMV2 "из-за ошибки 0x80041003. События не могут быть доставлены через этот фильтр, пока проблема не будет исправлена. –

Смежные вопросы