直接上代码,各位看看,调用时总是失败,调用GetLastError时错误码是87(参数错误)//---------------------------------------定义
  BULK_TRANSFER_CONTROL=record
    pipeNum:Cardinal;//对应ULONG
  end;
m_Usb_Handle:THandle;//已经成功打开
//功能码是对的
function IOCTL_EZUSB_BULK_WRITE:DWORD; 
begin
  result:=CTL_CODE(FILE_DEVICE_UNKNOWN,Ezusb_IOCTL_INDEX+20,METHOD_IN_DIRECT,FILE_ANY_ACCESS);
end;  dataBuffer:Array[0..32] of Char;
  dataBufferSize,lpBytesReturned:DWORD;
  outBulkControl:BULK_TRANSFER_CONTROL;
  outPBulkControl:Pointer;//--------------------------------调用代码
  //要下发16个字节的 1
  dataBufferSize:=16;
  for i:=0 to dataBufferSize-1 do
  begin
    dataBuffer[i]:=#1;
    //dataBuffer[2*i]:='1';
    //dataBuffer[2*i+1]:='1';
    //dataBuffer[2*i+2]:=#0;
  end;  outBulkControl.pipeNum:=2; //输出端点 0 Endpoint:  2 OUT
  outPBulkControl:=@outBulkControl;
  if (m_Usb_Handle<>Windows.INVALID_HANDLE_VALUE) then
  begin
    lpBytesReturned:=0;
    if DeviceIoControl(m_Usb_Handle,IOCTL_EZUSB_BULK_WRITE,outPBulkControl,SizeOf(BULK_TRANSFER_CONTROL),
                @dataBuffer,dataBufferSize,lpBytesReturned,nil) then
    begin
      //发送成功
      Memo1.Lines.Add(Format('发送数据成功 Result=%d',[lpBytesReturned]));
    end
    else begin
      iErrorCode:=windows.GetLastError;
      Memo1.Lines.Add(Format('发送数据失败 ErrorCode=%d(%s) Result=%d   OutBufferSize=%d',[iErrorCode,getErrorTextByCode(iErrorCode),lpBytesReturned,dataBufferSize]));
      // GetLastError =87 〖87〗-参数错误。
    end;//执行后输出的结果是:打开USB成功
发送数据失败 ErrorCode=87(参数错误) Result=0   OutBufferSize=16
Data->> 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
关闭USB成功
***** IOCTL_Ezusb_GET_PIPE_INFO ****** 
获得端口点列表数据成功 Result=56
Pipe  Endpoint  Direction  Type  Size
 0      2       IN     BLK    16
 1      6       OUT     BLK   512请大家帮我看看,谢谢,分数我尽量多点,我的分也不多

解决方案 »

  1.   

    問題應該是在這里 outPBulkControl:=@outBulkControl;先聲明
     pBULK_TRANSFER_CONTROL = ^BULK_TRANSFER_CONTROL
    把outPBulkControl聲明為pBULK_TRANSFER_CONTROL 
      outPBulkControl^ := outBulkControl
      

  2.   

    其中声明
      BULK_TRANSFER_CONTROL=record
        pipeNum:Cardinal;//对应ULONG
      end;
      PBULK_TRANSFER_CONTROL=^BULK_TRANSFER_CONTROL;  outPBulkControl:PBULK_TRANSFER_CONTROL;  outPBulkControl:=new(PBULK_TRANSFER_CONTROL);
      outPBulkControl.pipeNum:=2;
    这部分我已经修改成这样子,还是不行的
      

  3.   

    若按原先做法,這樣試過嗎?                                 //outPBulkControl
    DeviceIoControl(m_Usb_Handle,IOCTL_EZUSB_BULK_WRITE, @outBulkControl,SizeOf(BULK_TRANSFER_CONTROL),
    @dataBuffer,dataBufferSize,lpBytesReturned,nil) 
      

  4.   

    看看DeviceIoControl暂时还没用过
      

  5.   

    判斷條件改一下看看:
    if DeviceIoControl(m_Usb_Handle,IOCTL_EZUSB_BULK_WRITE, @outBulkControl,SizeOf(BULK_TRANSFER_CONTROL),@dataBuffer,dataBufferSize,lpBytesReturned,nil) <>0 then
      ...//成功
    else
      ...//失敗
      

  6.   

    DeviceIoControl 这个返回的是BOOL形的,我再想一想办法
      

  7.   

    1、你看一下msdn關于此函數的說明,提到了返回值;
    2、BOOL和Boolean還是有區別的綜上兩點,所以建議換判斷方法...
      

  8.   

    要知道一點 if 中的表達式類型是boolean,而deviceIoControl返回的是Bool,非0則為True,而這對boolean來說,并不是都一直的(取決于返回的數值)
      

  9.   

    要知道一點 if 中的表達式類型是boolean,而deviceIoControl返回的是Bool,非0則為True,而這對boolean來說,并不是都一的(取決于返回的數值)
      

  10.   

    是FALSE的,问题应该不在这儿
      

  11.   

    DeviceIoControl的倒数第2个参数要给一个DWORD变量的地址,用于接收返回长度,不能给0.
      

  12.   


    只能传DWORD或Cardinal类型的,不能传指针
      

  13.   

    打开USB成功
    **************************写数据...
    发送数据成功 Result=16
    Data->> 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
    **************************读数据...
    读取数据成功 Result=512
    Data->>
    01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 A6 E1 32 07 90 82 76 01 95 FA 00 D9 92 3F E5 9F 39 FD 3D 8A FF 07 F3 56 DF 4D 38 FA C9 8F 05 B3 29 C8 F9 4A FE 7A 9E 0B FC 3F 1C 2B 4A 5B 23 A4 00 48 C7 91 BF 51 AB 16 F1 B0 52 B6 4C 40 21 51 C3 00 CF AE E5 43 D3 0C 9F 6B 44 E3 C2 E7 10 7F 46 0C B4 C6 FB 0D 92 11 3F 77 A8 66 CC D0 0C 3E 0A A5 DE 4F C3 88 D3 29 4F 3D 49 13 44 3F B4 63 08 00 F3 D2 BD 32 BE 21 72 18 A1 8A 17 A6 40 9A 80 2A F3 97 AC 4B 48 40 EF BF 4E CB 94 07 11 E4 03 0F F2 94 EF B8 B7 99 46 59 1A F3 6D FF EB 39 30 4A 6F 60 B9 26 EA 41 9D FB 50 FC 5A DC 99 99 78 0E 74 23 D3 92 6A 8C 7E CA 87 6B 01 16 90 A3 DD C9 9F 00 45 20 BC 10 9D 3F CF BF C2 D6 C9 4E 0C 8E 6F 18 57 56 FD 23 DF 4B 03 4F 06 3B 62 FF 6C 89 FF CC F2 6A BB CB EE BD 02 C9 C9 7E 53 4E 67 42 94 91 DF 45 E3 C0 6A CA A0 FB 53 E7 35 D5 90
    **************读写操作1次,所用时间 31 ms
    **读操作成功1次,失败0次 **写操作成功1次,失败0次
    关闭USB成功