2013-04-25 60 views
4

未发现异常有时在启动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

其实问题是,在笔记本电脑开始在注册表中没有创建第一次SERIALCOMM文件夹时,因为

基本上我们在USB端口或串行插入的设备(有这么COM1端口串行端口的PC)端口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查询中不匹配时会抛出ManagementException“未找到”。也许你指定了错误的KeyPath或KeyPath不再可用。

+0

我在注册表检查路径或文件夹(键也)可供选择。 – 2013-05-02 06:20:40

+0

您是否检查事件日志以了解任何详细信息? – 2013-05-06 08:20:27

+0

是的,我得到这个错误,在事件logEvent过滤器中查询“SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA”Win32_Processor“AND TargetInstance.LoadPercentage> 99”无法在命名空间中重新激活“//./root/ CIMV2“,因为错误0x80041003。直到问题得到纠正,才能通过此过滤器传递事件。 – 2013-05-06 09:06:41