本帖最后由 xjkstar 于 2014-04-17 11:05:25 编辑

解决方案 »

  1.   

    自己解决。先看了几个“如何识别新增USB设备”的帖子再下了一个“如何识别新增USB设备”的源代码,O了。思路:
    1、先找到USB 打印机。SetupDiGetClassDevs、SetupDiEnumDeviceInfo、SetupDiGetDeviceRegistryProperty,找到“USB 支持设备”;
    2、然后就是老路,获得该USB打印机的路径,SetupDiEnumDeviceInterfaces、SetupDiGetInterfaceDeviceDetail,获得路径。(SetupDiGetClassDevs不用了,因为1中已经获得句柄集)
    3、再根据路径CreateFile,后面的内容网上一搜一大堆。不知道是不是绕远路了,呵呵。参考资料:http://www.cnblogs.com/SunYu/archive/2010/04/29/1723977.html
    参考代码:http://www.codeproject.com/Articles/14500/Detecting-Hardware-Insertion-and-or-Removal
      

  2.   

    找到“USB 打印设备”说错,更正下
      

  3.   

    今天也试了一天,没成功
    求代码,谢谢。
    [email protected]
      

  4.   

    LZ,我最近也在做USB通信,createfile,第一个参数是路径,这个路径我得到的是pDevDetailData->DevicePath=0x00527c9c"\\?\hid#vid_0483&pid_5750#7&33459201&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"。请问,你的路径最后有没有\\PIPE01之类的东西。
    因为我虽然createfile成功了,writefile的getlasterror总是6(句柄无效)。
      

  5.   


    没有\\PIPE01之类的东西,就是你这个路径格式。我的CreateFile参数给你参考下:
    this->m_hPort = CreateFile(this->m_PDdevice.Port, GENERIC_READ | GENERIC_WRITE,
    0, NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, 
    NULL);
      

  6.   


    步骤:
    1、CreateFile
    2、SetupComm
    3、SetCommTimeouts
    4、GetCommState
    5、SetCommState
    6、PurgeComm
    7、WriteFile你看看是否都设置过
      

  7.   

    楼主好,最近也在做USB打印,想通过writefile写pcl命令控制打印机,但是命令发送过去了怎么启动打印机开始打印呢?
    希望楼主能给一些指导,谢谢
      

  8.   


    没有\\PIPE01之类的东西,就是你这个路径格式。我的CreateFile参数给你参考下:
    this->m_hPort = CreateFile(this->m_PDdevice.Port, GENERIC_READ | GENERIC_WRITE,
    0, NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, 
    NULL);
    楼主谢谢你啊,我前段时间弄通了,不是createfile的原因。是writefile的字节必须要下位机一致,否则无法发送,而且缓冲区的第一个字节必须是报告ID,如果不是报告ID就取0x00,所以实际发送数据的字节数要比原来多1.