shishanjiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-11
  • 最后登录2005-05-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1563回复:0

VB中调用DeviceIoControl出错ERROR_CRC

楼主#
更多 发布于:2004-05-25 13:42
    本人正尝试以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)。

哪位大侠能帮帮忙,看一看,帮我指出问题出在哪里。感激不尽!
游客

返回顶部