1

環境:Windowsフォームアプリケーション、C#.NET 3.5、VS2008

オーバーライドされたWndProcハンドラー内から次の関数を呼び出すと、mc.GetInstances()行でこの例外が発生します。「COMExcepionは処理されませんでした-アプリケーションは、別のスレッド用にマーシャリングされたインターフェイスを呼び出しました。 ))」

このはるかに不可解なメッセージは、前述の例外の前に実際に表示されます。

「DiconnectedContextが検出されました-コンテキスト0x3333b40が切断されました。COMコンポーネントでリクエストを処理するためにプロキシは使用されません。これにより、破損やデータ損失が発生する可能性があります。この問題を回避するには、アプリケーションが内部に存在するCOMコンポーネントを表すRuntimeCallableWrappersで完全に実行されます。」

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 に答える