Исключение ManagementObject GetInstances () - PullRequest
1 голос
/ 11 августа 2011

Среда: приложение Windows Forms, C # .NET 3.5, VS2008

Когда я вызываю следующую функцию из переопределенного обработчика WndProc, я получаю это исключение в строке mc.GetInstances (). COMExcepion не обрабатывается -Приложение вызвало интерфейс, который был упорядочен для другого потока. (Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)) "

Это гораздо более загадочное сообщение фактически отображается перед ранее упомянутым исключением:

"Обнаружен DiconnectedContext - контекст 0x3333b40 отключен. Прокси-сервер не будет использоваться для обслуживания запроса на COM-компонент. Это может привести к повреждению или потере данных. Чтобы избежать этой проблемы, убедитесь, что все контексты / апартаменты остаются живыми, пока приложение не будет полностьюсделано с RuntimeCallableWrappers, которые представляют COM-компоненты, которые живут внутри них. "

private bool IsRemovableDevice(char dl)
 {
  ManagementClass mc = new ManagementClass("Win32_LogicalDisk");
  ManagementObjectCollection partitions = mc.GetInstances();
  string bleh = "";
  foreach (ManagementObject p in partitions)
  {
  if (Convert.ToString(p["Caption"])[0] == dl && (int)p["DriveType"] == 2)
   return true;
  }

  return false;
 }

Дело в том, что перечисленная выше функция прекрасно работает, когда она вызывается из любого контекста, отличного от fu WndProcnction.

Как я могу исправить это?

1 Ответ

0 голосов
/ 11 августа 2011

Я не совсем уверен в ошибке, но я нашел ее в MSDN:

http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/bbe38513-977c-456f-ae81-9b8c2aa1feb1

Не уверен, поможет ли это вам.

Я бы рассмотрел необходимость помещать подобные вещи в WndProc, WMI иногда может быть дорогим. Возможно, лучше использовать относительно быстрый таймер вместо насоса сообщений интерфейса пользователя.

Быстрый поиск по событиям WMI и обнаружение съемных дисков позволяет найти следующие источники:

http://msdn.microsoft.com/en-us/library/ms179315.aspx

http://blogs.technet.com/b/heyscriptingguy/archive/2006/02/13/how-can-i-determine-when-a-removable-drive-gets-connected.aspx

...