kingta
驱动牛犊
驱动牛犊
  • 注册日期2001-04-16
  • 最后登录2006-03-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1150回复:3

哪位高手能帮我诊断这段程序?

楼主#
更多 发布于:2002-05-12 08:01
已有一个经“Cypress控制面板程序”验证能正常Bulk输入输出的Bix 文件;在我自己的Delphi5应用程序中不能成功。
这个问题在调试跟踪时,DeviceIoControl 函数总是返回False,是否此函数的参数我送的不对?

-----------------------------
procedure TForm1.BtnBulk1Click(Sender: TObject);
// Bulk传输,将文本框Edit2里的字符内容,通过端点2OUT送到AN2131里去
type
_BulkBuffer = array[0..63] of char;
pBulkBuffer = ^_BulkBuffer;
var
sTmp:string; iTmp:integer;
pipeID: ULONG;
Buffer: pBulkBuffer;
Size: Byte;
dataLen: DWORD;
InterfaceInfo:USBD_INTERFACE_INFORMATION;
ioctl_valWORD;
bulkControl:BULK_TRANSFER_CONTROL;
nBytes: DWORD;
bResult: Boolean;
begin
if not(bOpenDriver(hDevice, pcDriverName)) then exit;
Size := Edit2.GetTextLen;
Inc(Size);
GetMem(Buffer, Size); // 申请内存
Edit2.GetTextBuf(Buffer^,Size); // 将文本框Edit2的字符内容送到Buffer所指的内存区域
dataLen:= Size; //
pipeID := 2; // 选择第 2 号管道,Endpoint 2 OUT,BULK模式
bulkControl.pipeNum:= pipeID;

bResult := GetInterfaceInfo(hDevice, InterfaceInfo, nBytes);
if (not bResult) then showmessage(\'获取接口信息出错\');
If (InterfaceInfo.Pipes[pipeID].EndpointAddress > 128) Then
ioctl_val:= IOCTL_EZUSB_BULK_READ // 读
else
ioctl_val:= IOCTL_EZUSB_BULK_WRITE; // 写
nBytes:= 0;

bResult := DeviceIoControl(hDevice,
ioctl_val,
@bulkControl, // 指向 BULK_TRANSFER_CONTROL 结构的指针
Sizeof(BULK_TRANSFER_CONTROL), // BULK_TRANSFER_CONTROL 结构的长度
Buffer, // 指向Bulk传输(收/发)缓冲区的指针,????????????错了么?
dataLen, // 缓冲区长度,?????????????????????????????????错了么?
nBytes, //
0);
if(not bResult) then showmessage(\'Bulk传输失败\');
// 为什么 DeviceIoControl 函数总是返回False ????????????????????????????????????

CloseHandle (hDevice); // 关设备
FreeMem(Buffer); // 释放内存
end;

最新喜欢:

sunmaculasunmac...
kingta
lcy
lcy
驱动牛犊
驱动牛犊
  • 注册日期2001-07-17
  • 最后登录2005-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-12 10:06
bResult := DeviceIoControl(hDevice,
ioctl_val,
@bulkControl, // 指向 BULK_TRANSFER_CONTROL 结构的指针
Sizeof(BULK_TRANSFER_CONTROL), // BULK_TRANSFER_CONTROL 结构的长度
Buffer, // 指向Bulk传输(收/发)缓冲区的指针,????????????错了么?
dataLen, // 缓冲区长度,?????????????????????????????????错了么?
nBytes, // 注意,这儿必须传递指针!!!!!!!!
0);
对了,给点分!!!!!!
kingta
驱动牛犊
驱动牛犊
  • 注册日期2001-04-16
  • 最后登录2006-03-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-12 10:21
bResult := DeviceIoControl(hDevice,
ioctl_val,
@bulkControl, // 指向 BULK_TRANSFER_CONTROL 结构的指针
Sizeof(BULK_TRANSFER_CONTROL), // BULK_TRANSFER_CONTROL 结构的长度
Buffer, // 指向Bulk传输(收/发)缓冲区的指针,????????????错了么?
dataLen, // 缓冲区长度,?????????????????????????????????错了么?
nBytes, // 注意,这儿必须传递指针!!!!!!!!
0);
对了,给点分!!!!!!
 


不对呀,编译无法通过?
kingta
kingta
驱动牛犊
驱动牛犊
  • 注册日期2001-04-16
  • 最后登录2006-03-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-05-12 10:41
bResult := DeviceIoControl(hDevice,
ioctl_val,
@bulkControl, // 指向 BULK_TRANSFER_CONTROL 结构的指针
Sizeof(BULK_TRANSFER_CONTROL), // BULK_TRANSFER_CONTROL 结构的长度
Buffer, // 指向Bulk传输(收/发)缓冲区的指针,????????????错了么?
dataLen, // 缓冲区长度,?????????????????????????????????错了么?
nBytes, // 注意,这儿必须传递指针!!!!!!!!
0);
对了,给点分!!!!!!
 


>>>>>>这儿必须传递指针!!!!!!!!
不对,在Windows API原型这里应是指针,但是Delphi的Windows.pas里对这个API包装后是:
function DeviceIoControl(
    hDevice: THandle;
    dwIoControlCode: DWORD;
    lpInBuffer: Pointer;
    nInBufferSize: DWORD;
    lpOutBuffer: Pointer;
    nOutBufferSize: DWORD;
    var lpBytesReturned: DWORD;   // <<<<<<<<<<
    lpOverlapped: POverlapped): BOOL; stdcall;

  就是说这个参数是按变量传递的参数,这个参数须是DWORD型,不是指针了。
kingta
游客

返回顶部