阅读:1564回复:0
VB中调用DeviceIoControl出错ERROR_CRC
本人正尝试以VB来做D12的应用程序,现在看来CreateFile,ReadFile,WriteFile,CloseHandle都没有什么问题,就是在DeviceIoControl函数上出错了,并且GetLastError返回的是23(ERROR_CRC)。怎么也找不出为什么会这样。怀疑在涉及的结构IO_BLOCK和IO_REQUEST从VC到VB的转换中有问题。在VC中两者是这样定义的:
typedef struct _IO_BLOCK { IN unsigned uOffset; IN unsigned uLength; IN OUT PUCHAR pbyData; IN unsigned uIndex; } IO_BLOCK, *PIO_BLOCK; typedef struct _IO_REQUEST { unsigned short uAddressL; unsigned char bAddressH; unsigned short uSize; unsigned char bCommand; } IO_REQUEST, *PIO_REQUEST; 在我的VB中我是这样定义它们的: Public Type IO_REQUEST uAddressL As Integer bAddressH As Byte uSize As Integer bCommand As Byte End Type Public Type IO_BLOCK uOffset As Long uLength As Long pbyData As Long uIndex As Long End Type DeviceIoControl在我的VB程序中的声明如下: Public Declare Function DeviceIoControl _ Lib \"kernel32\" _ (ByVal hDevice As Long, _ ByVal dwIoControlCode As Long, _ ByVal lpInBuffer As Long, _ ByVal nInBufferSize As Long, _ ByVal lpOutBuffer As Long, _ ByVal nOutBufferSize As Long, _ lpBytesReturned As Long, _ ByVal lpOverlapped As Long) _ As Long 调用如下: Dim ioRequest As IO_REQUEST Dim ioBlock As IO_BLOCK ioRequest.uAddressL = 0 ioRequest.bAddressH = 0 ioRequest.uSize = 64 ioRequest.bCommand = &H80 \'start, write ioBlock.uOffset = 0 ioBlock.uLength = Len(ioRequest) ioBlock.pbyData = VarPtr(ioRequest) ioBlock.uIndex = SETUP_DMA_REQUEST \'Const SETUP_DMA_REQUEST = &H471 Dim IOCTL_READ_REGISTERS As Long Dim IOCTL_WRITE_REGISTERS As Long IOCTL_READ_REGISTERS = CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 3, METHOD_BUFFERED, FILE_ANY_ACCESS) IOCTL_WRITE_REGISTERS = CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 4, METHOD_BUFFERED, FILE_ANY_ACCESS) Dim nBytes As Long Dim lResult as Long lResult = DeviceIoControl(HIDHandle, _ IOCTL_WRITE_REGISTERS, _ VarPtr(ioBlock), _ Len(ioBlock), _ 0, _ 0, _ nBytes, _ 0) \'其中HIDHandle为已经打开的USB设备。 If Not lResult Then lLastError = GetLastError MsgBox \"Setup DMA request failed!\" & vbCrLf & vbCrLf & \"Error no. \" & lLastError CloseHandle (HIDHandle) Exit Sub End If 主要是对IO_BLOCK和IO_REQUEST两个结构的VB定义没把握,尝试了各种可能,都出错,GetLastError总是返回23(查了查,是ERROR_CRC)。 哪位大侠能帮帮忙,看一看,帮我指出问题出在哪里。感激不尽! |
|