大家好,小弟有一个问题想请教
我想用一个程序来移除U盘,现在程序单独运行就可以实现,但我由U盘上的另一个程序调用它却移除不了,请问有什么方法解决吗?帮帮我
我想用一个程序来移除U盘,现在程序单独运行就可以实现,但我由U盘上的另一个程序调用它却移除不了,请问有什么方法解决吗?帮帮我
解决方案 »
- vb6.0 Mschar 获取X轴(注脚)的值、改变图例位置(默认右边)
- 关于数据库录入选择的问题
- 如何获得http://www.xxx.com/xxx.exe文件的大小?
- 高分求教:vbscript控件中如何使用字符型变量呢??
- 记录集更新问题,郁闷
- 问个很菜的问题
- datagrid处出现91错误,对象变量未设置,忘各位高手帮忙解答一下啊!
- 打印窗体
- 大家来访问我的论坛呀!!!! 〓【 上海甲鱼天地 】〓
- 我有一个PICTURE控件,然后想以这个控件为背景,再在上面放一个透明的PICTURE控件,怎么办?谢谢
- 如何获取 程序加载后的内存起始地址
- 想用VB写一个程序,请大家指点~会鼠标取IE值的进来谢谢
'
' written by Daniel Aue (http://www.activevb.de/)Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
Alias "RegOpenKeyExA" ( _
ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, phkResult As Long _
) As LongPrivate Declare Function RegCloseKey Lib "advapi32.dll" ( _
ByVal hKey As Long _
) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
Alias "RegQueryValueExA" ( _
ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
lpType As Long, lpData As Any, lpcbData As Any _
) As LongPrivate Const HKEY_LOCAL_MACHINE As Long = &H80000002Private Const KEY_QUERY_VALUE As Long = &H1
Private Const KEY_ENUMERATE_SUB_KEYS As Long = &H8
Private Const KEY_NOTIFY As Long = &H10
Private Const SYNCHRONIZE As Long = &H100000
Private Const STANDARD_RIGHTS_READ As Long = &H20000Private Const KEY_READ As Long = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))Private Const ERROR_SUCCESS As Long = 0&Private Declare Function CM_Request_Device_EjectA Lib "setupapi.dll" ( _
ByVal hDevice As Long, lVetoType As Long, lpVetoName As Any, _
ByVal cbVetoName As Long, ByVal dwFlags As Long _
) As LongPrivate Declare Function CM_Locate_DevNodeA Lib "setupapi.dll" ( _
hDevice As Long, lpDeviceName As Any, ByVal dwFlags As Long _
) As Long
Private Declare Function CM_Get_Device_IDA Lib "setupapi.dll" ( _
ByVal hDevice As Long, ByVal lpIDBuffer As Long, _
ByVal cbIDBuffer As Long, ByVal dwFlags As Long _
) As LongPrivate Declare Function CM_Get_Device_ID_Size Lib "setupapi.dll" ( _
ByRef lSize As Long, ByVal hDevice As Long, ByVal dwFlags As Long _
) As LongPrivate Declare Function CM_Get_Parent Lib "setupapi.dll" ( _
hParentDevice As Long, ByVal hDevice As Long, ByVal dwFlags As Long _
) As Long
Private Declare Function CM_Get_Child Lib "setupapi.dll" ( _
hChildDevice As Long, ByVal hDevice As Long, ByVal dwFlags As Long _
) As Long
Private Declare Function CM_Get_Sibling Lib "setupapi.dll" ( _
hSiblingDevice As Long, ByVal hDevice As Long, ByVal dwFlags As Long _
) As LongPrivate Declare Function CM_Get_DevNode_Status Lib "setupapi.dll" ( _
lStatus As Long, lProblem As Long, ByVal hDevice As Long, _
ByVal dwFlags As Long _
) As LongPrivate Const DN_REMOVABLE As Long = &H4000
Private Const CR_SUCCESS As Long = 0Private Const REG_PATH_MOUNT As String = "SYSTEM\MountedDevices"
Private Const REG_VALUE_DOSDEV As String = "\DosDevices\"Public Function EjectDevice(ByVal DriveLetter As String) As Boolean
Dim strDeviceInstance As String
Dim btRegData() As Byte
Dim hDevice As Long
Dim lngStatus As Long
Dim lngProblem As Long DriveLetter = UCase$(Left$(DriveLetter, 1)) & ":"
If Not HKLMRegBinaryRead(REG_PATH_MOUNT, REG_VALUE_DOSDEV & DriveLetter, btRegData) Then
Exit Function
End If
strDeviceInstance = btRegData
If Not Left$(strDeviceInstance, 4) = "\??\" Then Exit Function
strDeviceInstance = Mid$(strDeviceInstance, 5, InStr(1, strDeviceInstance, "{") - 6)
strDeviceInstance = Replace$(strDeviceInstance, "#", "\")
If CR_SUCCESS <> CM_Locate_DevNodeA(hDevice, ByVal strDeviceInstance, 0) Then
Exit Function
End If If CR_SUCCESS <> CM_Get_DevNode_Status(lngStatus, lngProblem, hDevice, 0) Then
Exit Function
End If
Do While Not (lngStatus And DN_REMOVABLE) > 0
If CR_SUCCESS <> CM_Get_Parent(hDevice, hDevice, 0) Then Exit Do
If CR_SUCCESS <> CM_Get_DevNode_Status(lngStatus, lngProblem, hDevice, 0) Then Exit Do
Loop
If (lngStatus And DN_REMOVABLE) > 0 Then
EjectDevice = CR_SUCCESS = CM_Request_Device_EjectA(hDevice, 0, ByVal Space$(255), 255, 0)
End If
End FunctionPrivate Function HandleToDeviceID(hDevice As Long) As String
Dim strDeviceID As String
Dim cDeviceID As Long
If CM_Get_Device_ID_Size(cDeviceID, hDevice, 0) = 0 Then
strDeviceID = Space(cDeviceID)
If CM_Get_Device_IDA(hDevice, StrPtr(strDeviceID), cDeviceID, 0) > 0 Then
strDeviceID = StrConv(strDeviceID, vbUnicode)
strDeviceID = Left(strDeviceID, cDeviceID)
Else
strDeviceID = ""
End If
End If
HandleToDeviceID = strDeviceID
End FunctionPrivate Function HKLMRegBinaryRead(ByVal strPath As String, ByVal strValueName As String, btValue() As Byte) As Boolean
Dim hKey As Long
Dim lngDataLen As Long
Dim lngResult As Long
Dim regType As Long
Dim btDataBuf() As Byte
If RegOpenKeyEx(HKEY_LOCAL_MACHINE, strPath, 0, KEY_READ, hKey) = ERROR_SUCCESS Then
If RegQueryValueEx(hKey, strValueName, 0, regType, ByVal 0&, lngDataLen) = ERROR_SUCCESS Then
ReDim btDataBuf(lngDataLen - 1) As Byte
If RegQueryValueEx(hKey, strValueName, 0, regType, btDataBuf(0), lngDataLen) = ERROR_SUCCESS Then
btValue = btDataBuf
HKLMRegBinaryRead = True
End If
End If
RegCloseKey hKey
End If
End Function
如果你运行解锁的程序在U盘上可能会失败,因为文件还处于咱用状态
提示现在无法卸载该USB设备,