散分,通过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
[解决办法]
路过,谢谢分享
[解决办法]
来接分。