Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb.net createfile,WinUsb,必须释放资源吗?_Vb.net - Fatal编程技术网

vb.net createfile,WinUsb,必须释放资源吗?

vb.net createfile,WinUsb,必须释放资源吗?,vb.net,Vb.net,我必须在某个VB.NET项目中使用从kernel32.dll导入的CreateFile来获取WinUSB进一步函数的句柄 问题是,当我不再需要句柄时,我是否需要在CreateFile之后以某种方式销毁某些东西 第二个问题是,我使用带有CreateFile返回句柄的WinUsb_Initialize()来获取另一个句柄以用于WinUsb目的。我也需要打扫一下吗 提前感谢, _ 私有共享函数CreateFile(ByVal lpFileName作为字符串, ByVal DWD希望访问Int32,

我必须在某个VB.NET项目中使用从kernel32.dll导入的CreateFile来获取WinUSB进一步函数的句柄

问题是,当我不再需要句柄时,我是否需要在CreateFile之后以某种方式销毁某些东西

第二个问题是,我使用带有CreateFile返回句柄的WinUsb_Initialize()来获取另一个句柄以用于WinUsb目的。我也需要打扫一下吗

提前感谢,


_
私有共享函数CreateFile(ByVal lpFileName作为字符串,
ByVal DWD希望访问Int32,
ByVal dwShareMode作为UInt32,
ByVal lpSecurityAttributes作为IntPtr,
ByVal dwCreationDisposition作为UInt32,
ByVal dwFlagsAndAttributes作为UInt32,
ByVal hTemplateFile(作为IntPtr)作为SafeFileHandle
端函数
作为布尔值的公共共享函数CloseHandle(ByVal句柄为整数)
端函数
现在我在某个地方读到,如果我在CreateFile中使用SafeHandler,就不需要CloseHandle。 这是我的“断开”代码

Dim ErrorStatus为整数=0
如果HwinusInterface的句柄值无效,则
WinUsb_免费(硬件接口)
HwinusInterface=无效的句柄值
如果结束
如果hDevice的句柄值无效,则
'hDevice=无效的\u句柄\u值
'RaiseEvent错误(错误状态,“断开”)
如果关闭手柄(hDevice),则
hDevice=无效的句柄值
RaiseEvent断开连接()
其他的
ErrorStatus=Err.LastDllError
RaiseEvent错误(错误状态,“断开”)
如果结束
如果结束

您从
CreateFile()
获得的
句柄必须通过pinvoking
CloseHandle()
释放

WINUSB\u Initialize()
获得的
WINUSB\u接口\u句柄必须通过pinvoking
WINUSB\u Free()
释放


请注意,这些功能的MSDN库文章详细阐述了这些要求。

非常感谢,这是我需要知道的。事实上,我应该更仔细地阅读MSDN库条目。无论如何,谢谢你的帖子。还有一点,我已经照你说的做了,CloseHandle没有按预期工作。句柄确实是关闭的,因为我可以在同一对象(usb设备)上立即打开一个新的句柄,但是当我关闭表单时,会出现一些错误{“External component has should a exception.”并且我怀疑我导入的kernel32.dll函数有什么问题。这不是一个你可以不断提出新问题的论坛。这是一个问答网站,每次一个问题。当您有一个新问题时,单击“提问”按钮。当然,至少用一个调用堆栈和一个代码段来正确地记录它。
   <DllImport("kernel32.dll",
            SetLastError:=True,
            CharSet:=CharSet.Auto)> _
    Private Shared Function CreateFile(ByVal lpFileName As String,
                                       ByVal dwDesiredAccess As Int32,
                                       ByVal dwShareMode As UInt32,
                                       ByVal lpSecurityAttributes As IntPtr,
                                       ByVal dwCreationDisposition As UInt32,
                                       ByVal dwFlagsAndAttributes As UInt32,
                                       ByVal hTemplateFile As IntPtr) As SafeFileHandle
    End Function

    <DllImport("kernel32.dll",
        CharSet:=CharSet.Auto,
        SetLasterror:=True)>
    Public Shared Function CloseHandle(ByVal Handle As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function
Dim ErrorStatus As Integer = 0

If hWinUSBInterface <> INVALID_HANDLE_VALUE Then
    WinUsb_Free(hWinUSBInterface)
    hWinUSBInterface = INVALID_HANDLE_VALUE
End If

If hDevice <> INVALID_HANDLE_VALUE Then

    'hDevice = INVALID_HANDLE_VALUE
    'RaiseEvent Error(ErrorStatus, "Disconnect")

    If CloseHandle(hDevice) Then
        hDevice = INVALID_HANDLE_VALUE
        RaiseEvent Disconnected()
    Else
        ErrorStatus = Err.LastDllError
        RaiseEvent Error(ErrorStatus, "Disconnect")
    End If

End If