我来简单说一下在这个程序该怎么剥离出有用的东西,其实挺简单的(我靠,谁扔的鸡蛋。。。!),大虾们就别看了,菜鸟可以参考参考,其实我也是菜鸟,呵呵。 1,首先,我们要打开设备,怎么打开呢?当然是用函数了!这还用问。。 我们要用bOpenDriver (HANDLE * phDeviceHandle, PCHAR devname)来打开这个设备获得一个句柄,这个函数你可以在EzMain.cpp文件的第1343行找到,通过这个句柄就可以操作设备了,恩,太简单了! 2,有了这个句柄,下面我们就可以对设备读写了,怎么读写呢?用函数啊。。 打开Control Panel,你会看见界面上方有好多小方块,好像学名叫做“按钮”,每个按钮会对应一个消息,对应的消息在那里呢?从EzMain.cpp的第196行开始(哇,好多。。),每一个Case代表一个按钮事件,也就是说点了那个按钮,程序就会执行到这里(废话。。),下面我们来举例解释具体该怎么操作。 3,以获得设备描述符操作为例,也就是case IDC_GETDEVICEDESCRIPTOR:事件,你会在EzMain.cpp的第545行找到它,步骤如下: pvBuffer = malloc (sizeof (Usb_Device_Descriptor) + 128);//存放描述符的缓冲区(不明白的找块豆腐撞死吧) MAINTAIN_OUTPUT_BOX (hOutputBox, nItems);//没用,不理 if (bOpenDriver (&hDevice, pcDriverName) != TRUE)//打开设备获得句柄 { EzSendMessage (hOutputBox, LB_ADDSTRING, 0, (LPARAM)"Failed to Open Driver"); hDevice = NULL; } if (hDevice != NULL)//如果句柄不是空的 {// Perform the Get-Descriptor IOCTL//著名的Ioctl函数,什么?你没听说过! bResult = DeviceIoControl (hDevice,//句柄,之前已经得到了 IOCTL_Ezusb_GET_DEVICE_DESCRIPTOR,//CTL_CODE,告诉驱动你要获得描述符 pvBuffer,//输入数据缓冲区,这里没用 sizeof (Usb_Device_Descriptor),//输入数据数量 pvBuffer,//输出缓冲区,接收从设备返回的数据 sizeof (Usb_Device_Descriptor),//输出缓冲区的长度 (unsigned long *)&nBytes,//实际返回的数据长度 NULL);//没用 }/* if valid driver handle */ 如果上面这个函数执行成功,那么设备描述符数据就会放到pvBuffer中,你要做的就是从缓冲区中析取描述符中的item,然后显示出来即可,根据协议规定很容易的,下面的几行程序就是做这个用的,我就不解释了。 完事后要处理善后,就像上完厕所要冲水一样(好恶心。。) CloseHandle (hDevice); // 关闭设备句柄 free (pvBuffer); // 释放缓冲区 4,还有15分钟下班,简单讲一下最重要的BULK传输吧,时间不多,简单说一下,嘻嘻。 你会在EzMain。cpp的第666行找到这个case,一个十分吉利的数字! 其他一些建立缓冲区什么设置数据长度什么的都不说了,就说重点的 BULK_TRANSFER_CONTROL bulkControl; //这个结构里存放了端点的信息,即你要使用哪个端点,这个端点信息是从界面上得到的,下面的几行程序向你展示了如何从界面上获得它。 //然后是分配缓冲区,设置长度等乱七八糟的事 if (bOpenDriver (&hDevice, pcDriverName) != TRUE)//然后是打开设备 if (hDevice != NULL)//判断句柄 PUSBD_PIPE_INFORMATION pPipe = ((PUSBD_INTERFACE_INFORMATION)theApp.m_uInterfaceInfo)->Pipes;//获得端点信息 DWORD ioctl_val = IOCTL_EZUSB_BULK_WRITE;//预设CTL_CODE参数为写,就是向设备写数据 if(pPipe[bulkControl.pipeNum].EndpointAddress >> 7)//如果端点地址的最高位是1,那么是读,就是0x80,0x82什么的 ioctl_val = IOCTL_EZUSB_BULK_READ;//设置CTL_CODE参数为读,就是从设备读取数据 bResult = DeviceIoControl (hDevice,//著名的ioctl函数 ioctl_val, //CTL_CODE参数,标志你是从设备读数据还是向设备写数据 &bulkControl,//传入参数,我们此处传入要使用的端点号 sizeof (BULK_TRANSFER_CONTROL),//传入参数的大小 buffer,//读写数据的缓冲区 length,//读写数据的长度 (unsigned long *)&nBytes,//驱动实际返回的数据长度 NULL);//没用 //然后下面就是显示数据等乱七八糟的事情了,没啥用,爱看不看 //上完厕所要冲水! #ifndef USING_MFC free(buffer); #endif CloseHandle (hDevice); 其它类似,大家可以自己弄了,根据上面的讲解,如果你想自己写个程序,把里面重要的东西弄出来就OK了,当然,别忘了包含主要的头文件,比如ezusbsys.h,以及把相应的一些结构变量给弄到你的程序里,像我这种只会三斧半VC的人都能搞定,对你们还有啥难的吗?