首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

散分,通过USB VID和PID卸载USB设备,该怎么解决

2012-02-04 
散分,通过USB VID和PID卸载USB设备原贴地址:http://blog.csdn.net/chenhui530/archive/2009/12/23/5063211

散分,通过USB VID和PID卸载USB设备
原贴地址:http://blog.csdn.net/chenhui530/archive/2009/12/23/5063211.aspx

Private Sub cmdUnload_Click()
  Dim strUsbHubs() As String
  Dim KeyCount As Long, SerialNumberCount As Long
  Dim i As Long, j As Long
  Dim strSerialNumbers() As String
  Dim strDrive As String
  Dim strWQL As String
  Dim objSWbemServices As SWbemServices, objWmiObject As SWbemObject, objWmiObjectSet As SWbemObjectSet
  Dim objPattions As SWbemObjectSet, objPattion As SWbemObject
  Dim strDeviceId As String
  Dim strDeviceInstanceId As String
  Dim strSerialNumber As String
  Dim lngRet As Long, dwDevInst As Long
   
  On Error GoTo ErrorHandle
  strDrive = Mid(cboUsbDriveList.List(cboUsbDriveList.ListIndex), InStr(cboUsbDriveList.List(cboUsbDriveList.ListIndex), "(") + 1, 2)
  strWQL = "Associators of {Win32_LogicalDisk='" & strDrive & "'} where ResultClass = Win32_DiskPartition"
  If ConnectWmiServer(objSWbemServices, ".") Then
  '这里获取了所有磁盘的DeviceId这里面包括了磁盘的SerialNumber,下面我们需要用SerialNumber去查找USB的VID和PID
  Set objPattions = objSWbemServices.ExecQuery(strWQL)
  For Each objPattion In objPattions
  strWQL = "Select * From win32_DiskDrive where Index=" & objPattion.DiskIndex
  Set objWmiObjectSet = objSWbemServices.ExecQuery(strWQL)
  For Each objWmiObject In objWmiObjectSet
  strDeviceId = objWmiObject.PNPDeviceID
  strSerialNumber = GetSerialNumber(strDeviceId)
  If InStr(strSerialNumber, "&") Then
  strSerialNumber = Left(strSerialNumber, InStr(strSerialNumber, "&") - 1)
  End If
  '遍历所有USB设备,这里包括正在使用的和曾经使用过的我们通过SerialNumber去查找目前正在使用的
  strUsbHubs = GetSubKeys("\Registry\Machine\SYSTEM\CurrentControlSet\Enum\USB")
  KeyCount = UBound(strUsbHubs) + 1
  For i = 0 To KeyCount - 1
  '查找所有USB设备的SerialNumber
  strSerialNumbers = GetSubKeys("\Registry\Machine\SYSTEM\CurrentControlSet\Enum\USB\" & strUsbHubs(i))
  SerialNumberCount = UBound(strSerialNumbers) + 1
  For j = 0 To SerialNumberCount - 1
  If strSerialNumber = strSerialNumbers(j) Then
  strDeviceInstanceId = "USB\" & strUsbHubs(i) & "\" & strSerialNumbers(j)
  '这里这种方法不是很好,是通过U盘的SerialNumber去查找VID和PID对于一些没有SerialNumber的显然这种方法是不行的
  '目前我还没想到怎么直接从U盘的盘符取到VID和PID现在只有将就用这种方法了
  lngRet = CM_Locate_DevNodeA(VarPtr(dwDevInst), strDeviceInstanceId, 0)
  If lngRet = 0 Then
  lngRet = CM_Request_Device_Eject_ExA(dwDevInst, 0, vbNullString, 0, 0, 0)
  Exit For
  End If
  End If
  Next
  Erase strSerialNumbers
  Next
  Erase strUsbHubs
  Next
  Next
  End If

ErrorHandle:
  Set objSWbemServices = Nothing
  Set objWmiObject = Nothing
  Set objWmiObjectSet = Nothing
  Set objPattions = Nothing
  Set objPattion = Nothing
  cmdRefresh_Click
End Sub




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chenhui530/archive/2009/12/23/5063211.aspx

[解决办法]
接分。
[解决办法]
有情接分!
[解决办法]
路过JF
[解决办法]
感谢分享
[解决办法]
路过,谢谢分享
[解决办法]
接分~~
[解决办法]
学习,接分
[解决办法]
接分
[解决办法]
我也来顶..............
[解决办法]
还有分不,呵呵?
[解决办法]
up
[解决办法]
up
[解决办法]
JF
[解决办法]
jf
[解决办法]
路过,谢谢分享
[解决办法]
来接分。

热点排行