1

环境:Windows 窗体应用程序、C# .NET 3.5、VS2008

当我从重写的 WndProc 处理程序内部调用以下函数时,我在 mc.GetInstances() 行“COMExcepion 未处理 - 应用程序调用了一个为不同线程编组的接口。(来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD ))”

这个更神秘的消息实际上显示在前面提到的异常之前:

“检测到 DiconnectedContext - 上下文 0x3333b40 已断开连接。不会使用代理来为 COM 组件上的请求提供服务。这可能会导致损坏或数据丢失。为避免此问题,请确保所有上下文/公寓保持活动状态,直到应用程序运行完全使用 RuntimeCallableWrapper 完成,它们代表了存在于其中的 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 函数以外的任何上下文调用时都可以正常工作。

我该如何补救?

4

1 回答 1

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

于 2011-08-11T15:05:35.080 回答