DeviceIoControl时,总是返回失败,错误码是87(参数错误)

indexhome08 2010-03-25 01:16:20
直接上代码,各位看看,调用时总是失败,调用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



请大家帮我看看,谢谢,分数我尽量多点,我的分也不多
...全文
1676 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
寒竹凌冬 2010-12-17
  • 打赏
  • 举报
回复
不知道上面那位仁兄怎么解决的,我的也是类似的问题啊@@
cnzdgs 2010-03-26
  • 打赏
  • 举报
回复
DeviceIoControl的倒数第2个参数要给一个DWORD变量的地址,用于接收返回长度,不能给0.
indexhome08 2010-03-26
  • 打赏
  • 举报
回复
打开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成功
indexhome08 2010-03-26
  • 打赏
  • 举报
回复
已经搞定,参数都没有问题,只是端口用得不对,谢谢各位
indexhome08 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 cnzdgs 的回复:]

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

只能传DWORD或Cardinal类型的,不能传指针
indexhome08 2010-03-25
  • 打赏
  • 举报
回复
其中声明
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;
这部分我已经修改成这样子,还是不行的
金卯刀 2010-03-25
  • 打赏
  • 举报
回复
問題應該是在這里 outPBulkControl:=@outBulkControl;

先聲明
pBULK_TRANSFER_CONTROL = ^BULK_TRANSFER_CONTROL
把outPBulkControl聲明為pBULK_TRANSFER_CONTROL
outPBulkControl^ := outBulkControl
gyk120 2010-03-25
  • 打赏
  • 举报
回复
把你的buffer设置大点看看
indexhome08 2010-03-25
  • 打赏
  • 举报
回复
是FALSE的,问题应该不在这儿
天火 2010-03-25
  • 打赏
  • 举报
回复
不懂,帮顶。
金卯刀 2010-03-25
  • 打赏
  • 举报
回复
要知道一點 if 中的表達式類型是boolean,而deviceIoControl返回的是Bool,非0則為True,而這對boolean來說,并不是都一的(取決于返回的數值)
金卯刀 2010-03-25
  • 打赏
  • 举报
回复
要知道一點 if 中的表達式類型是boolean,而deviceIoControl返回的是Bool,非0則為True,而這對boolean來說,并不是都一直的(取決于返回的數值)
金卯刀 2010-03-25
  • 打赏
  • 举报
回复
1、你看一下msdn關于此函數的說明,提到了返回值;
2、BOOL和Boolean還是有區別的

綜上兩點,所以建議換判斷方法...
indexhome08 2010-03-25
  • 打赏
  • 举报
回复
DeviceIoControl 这个返回的是BOOL形的,我再想一想办法
金卯刀 2010-03-25
  • 打赏
  • 举报
回复
判斷條件改一下看看:
if DeviceIoControl(m_Usb_Handle,IOCTL_EZUSB_BULK_WRITE, @outBulkControl,SizeOf(BULK_TRANSFER_CONTROL),@dataBuffer,dataBufferSize,lpBytesReturned,nil) <>0 then
...//成功
else
...//失敗
indexhome08 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 avan_lau 的回复:]

若按原先做法,這樣試過嗎? //outPBulkControl
DeviceIoControl(m_Usb_Handle,IOCTL_EZUSB_BULK_WRITE, @outBulkControl,SizeOf(BULK_TRANSFER_CONTROL),
@dataBuffer,dataBufferSize,lpByte……
[/Quote]

做过的,都偿试过,不行,系统错误码都为 87,一样的,郁闷中
dd_zhouqian 2010-03-25
  • 打赏
  • 举报
回复
和驱动通信还是挺麻烦的
dd_zhouqian 2010-03-25
  • 打赏
  • 举报
回复
看看DeviceIoControl暂时还没用过
金卯刀 2010-03-25
  • 打赏
  • 举报
回复
若按原先做法,這樣試過嗎? //outPBulkControl
DeviceIoControl(m_Usb_Handle,IOCTL_EZUSB_BULK_WRITE, @outBulkControl,SizeOf(BULK_TRANSFER_CONTROL),
@dataBuffer,dataBufferSize,lpBytesReturned,nil)
indexhome08 2010-03-25
  • 打赏
  • 举报
回复
好像只能加到100分,如解决,送上所有的分

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧