ManagementObject GetInstances()异常

时间:2011-08-11 14:30:18

标签: .net volume drive

环境:Windows窗体应用程序,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;
 }

这是交易,当从WndProc函数以外的任何上下文调用时,上面列出的函数工作正常。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我不完全确定错误,但我在MSDN上发现了这个:

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

不确定它是否对您有帮助。

我认为需要将这类内容放在WndProc中,WMI有时会很昂贵。使用相对快速的计时器而不是UI消息泵可能会更好。

快速搜索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