2013-04-25 101 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