打印

为什么要两次

[复制链接]
9880|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lium|  楼主 | 2010-11-11 22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前从没有做过USB,头给我一个Cypress的Ezusb的控制面板程序,让我读然后模仿写一个自己的应用程序,我看的头大了,当我我模仿写到获取字符串信息时,原程序发送了两次DeviceIoControl命令,为什么呢要两次呢?
沙发
hanwe| | 2010-11-11 22:32 | 只看该作者
能把你的代码贴出来嘛?

使用特权

评论回复
板凳
lium|  楼主 | 2010-11-11 22:38 | 只看该作者
正打算要发呢

使用特权

评论回复
地板
lium|  楼主 | 2010-11-11 22:38 | 只看该作者
char       temp[64]     =   " ";
GET_STRING_DESCRIPTOR_IN   input;
pvBuffer   =   malloc   (sizeof   (Usb_String_Descriptor)   +   128);
if   (bOpenDriver   (&hDevice,   pcDriverName)   !=   TRUE)       //   Open   the   driver
{
        显示信息
}
#ifdef   USING_MFC
input.Index   =   (UCHAR)   pTh-> index;
input.LanguageId   =   27;   //   NOTE:   frameworks   ignores   it   anyway
wsprintf   (temp,   "GetStringDescripter:   Index=%d ",   input.Index);
EzSendMessage   (hOutputBox,   LB_ADDSTRING,   0,   (LPARAM)emp);
#endif
//   Get   the   first   bytes   of   the   descriptor   to   determine   the   size   of
//   the   entire   descriptor.
if   (hDevice   !=   NULL)   
{//   Perform   the   Get-Descriptor   IOCTL
        bResult   =   DeviceIoControl   (hDevice,
                    IOCTL_Ezusb_GET_STRING_DESCRIPTOR,
&input,
sizeof   (GET_STRING_DESCRIPTOR_IN),
pvBuffer,
sizeof   (Usb_String_Descriptor),
(unsigned   long   *)&nBytes,
NULL);
}/*   if   valid   driver   handle   */
if   (bResult!=TRUE)   
{//   This   will   happen   with   no   string   defined   
        EzSendMessage   (hOutputBox,   LB_ADDSTRING,   0,   (LPARAM) "Get   String   Descriptor   Failed ");
        //ShowSystemError(hOutputBox);
        CloseHandle   (hDevice);
        free   (pvBuffer);
}/*   if   */
ulLength   =   GET_STRING_DESCRIPTOR_LENGTH(pvBuffer);
assert   (ulLength   > =   0);
//   Now   get   the   entire   descriptor
pvBuffer   =   realloc   (pvBuffer,   ulLength);
if   (pvBuffer)   
{
      //   Perform   the   Get-Descriptor   IOCTL
      bResult   =   DeviceIoControl   (hDevice,
IOCTL_Ezusb_GET_STRING_DESCRIPTOR,
&input,
ulLength,
pvBuffer,
ulLength,
(unsigned   long   *)&nBytes,
NULL);
if   (bResult==TRUE)   
{
      显示信息
} 帮忙看看吧

使用特权

评论回复
5
langgq| | 2010-11-12 09:06 | 只看该作者
顶,驱动用CB写吗?不少介绍都是用VC+DS,我不懂。

使用特权

评论回复
6
zhuww| | 2010-11-12 09:20 | 只看该作者
顺便请教一下CB6和DS2.1能配合使用开发WIN2000   和XP的驱动程序吗?

使用特权

评论回复
7
lium|  楼主 | 2010-11-12 09:22 | 只看该作者
说真的我也知道,我是用BCB写应用程序这部分,驱动不是我写的,我们用已经有的,我这个地方很晕

使用特权

评论回复
8
hanwe| | 2010-11-12 09:29 | 只看该作者
你驱动里的GET_STRING_DESCRIPTOR_IN结构是什么

使用特权

评论回复
9
lium|  楼主 | 2010-11-12 09:34 | 只看该作者
typedef   struct   _GET_STRING_DESCRIPTOR_IN
{
      UCHAR         Index;
      USHORT       LanguageId;
}   GET_STRING_DESCRIPTOR_IN,   *PGET_STRING_DESCRIPTOR_IN;
这是驱动里的GET_STRING_DESCRIPTOR_IN结构

使用特权

评论回复
10
yufe| | 2010-11-12 09:39 | 只看该作者
第一次取字符串实际需要的长度,因为输出的空间不够,所以只返回长度
第二次按这个长度分配空间,重新读

使用特权

评论回复
11
yufe| | 2010-11-12 09:39 | 只看该作者
实际上只要分配足够空间,读一次就可以了。

使用特权

评论回复
12
lium|  楼主 | 2010-11-12 09:46 | 只看该作者
多谢楼上几位,现在明白多了

使用特权

评论回复
13
清风朗月夜| | 2010-11-14 16:57 | 只看该作者
第一次取字符串实际需要的长度,因为输出的空间不够,所以只返回长度
第二次按这个长度分配空间,重新读
yufe 发表于 2010-11-12 09:39

这个输出空间指的是什么?

使用特权

评论回复
14
sunmooning| | 2010-11-15 21:39 | 只看该作者
是不是FIFO的大小呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

915

主题

9578

帖子

3

粉丝