Не найдено исключение при запуске 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 больше не доступен.