- 題名: USBメモリのシリアル取得について
- 日時: 2010/09/02 11:07:28
- ID: 27263
- この記事の返信元:
- (なし)
- この記事への返信:
- [27264] Re[1]: USBメモリのシリアル取得について2010/09/02 11:32:09
- ツリーを表示
魔界の仮面弁士さんの方法で試したところうまくいきました。
簡易に別スレッドを立ててテストしてみました。
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Select Case m.Msg
Case WM_DEVICECHANGE
Select Case m.WParam.ToInt32
Case DBT.DBT_DEVICEARRIVAL
Dim t As New Thread(New ThreadStart(AddressOf worker))
t.Start()
Case DBT.DBT_DEVICEREMOVECOMPLETE
End Select
Case Else
End Select
MyBase.WndProc(m)
End Sub
Sub worker()
Try
Dim Licences() As String = {"XXXXXXX", "XXXXXXX"} '指定したシリアル
Dim searcher As New ManagementObjectSearcher( _
"root\CIMV2", _
"SELECT * FROM Win32_DiskDrive where InterfaceType='USB'")
For Each queryObj As ManagementObject In searcher.Get()
Find_Flg = False
For i As Int16 = 0 To Licences.Length - 1
If Licences(i) <> queryObj("PNPDeviceID") Then 'シリアルが一致しない場合
'省略・・・・
Eject(queryObj("DeviceID")) 'CM_Request_Device_Ejectにて取り外し
End If
Next
Next
Catch err As ManagementException
MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
End Try
End Sub
USBメモリ検知 → あらかじめ登録されているシリアルか確認 →
未登録 → デバイスの自動取り外し
という流れでうまくテストできました。
有難う御座いました。
分類:[.NET]
いつも勉強させて頂いています。 USBメモリを差し込んだ時にシリアルを取得したいと考えています。 WM_DEVICECHANGEにて判断し、ManagementObjectでシリアル取得の際にエラーが 出てしまいます。(DisconnectedContextが検出されました) 以下ソースです。 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) Select Case m.Msg Case WM_DEVICECHANGE Select Case m.WParam.ToInt32 Case DBT.DBT_DEVICEARRIVAL Try Dim searcher As New ManagementObjectSearcher( _ "root\CIMV2", _ "SELECT * FROM Win32_DiskDrive where InterfaceType='USB'") For Each queryObj As ManagementObject In searcher.Get() Console.WriteLine("-----------------------------------") Console.WriteLine("Win32_USBController instance") Console.WriteLine("-----------------------------------") Console.WriteLine("DeviceID: {0}", queryObj("DeviceID")) Console.WriteLine("PNPDeviceID: {0}", queryObj("PNPDeviceID")) Next Catch err As ManagementException MessageBox.Show("An error occurred while querying for WMI data: " & err.Message) End Try MessageBox.Show("USB挿し込み") Case DBT.DBT_DEVICEREMOVECOMPLETE End Select Case Else End Select MyBase.WndProc(m) End Sub searcher.Get()の部分でエラーが発生します。 コンテキスト 0x210358 が切断されました。 COM コンポーネント上の要求のサービスに使用されるプロキシは存在しません。 これは、破損またはデータの損失を発生させる可能性があります。 この問題を回避するには、その内部に存在する COM コンポーネントを示す RuntimeCallableWrappers の使用が完了するまで、 すべてのコンテキストおよびアパートメントが完全に有効であることを 確認してください。 基本的なエラーかと想像できますが、初心者の為理解できません。 どなたかご教授お願い致します。