我写了个程序,已经能跟USB正常通讯上了,但这个USB设备被拔除时,我程序怎么知道被拔下来的USB设备是我程序里面已经打开的那个呢?我现在用的方法是监听 WM_DEVICECHANGE消息,然后当wParam==DBT_DEVICEREMOVECOMPLETE  时就是设备移除,lParam 是一个PDEV_BROADCAST_DEVICEINTERFACE 类型的指针
 lParam ->dbcc_name 就是拔下的设备的路径名,然后比较两个路径名(跟已经打开的设备比较)就知道是不是已经打开的设备,但为什么我拔下已经打开的设备结果两个路径名还是不一样呢?
调试发现两个路径名分别如下
从lParam 解析出来的 {"\\?\HID#Vid_040b&Pid_201b&MI_01&Col05#7&fec02ab&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}"}
我原来枚举出来并正常通讯的 {"\\?\hid#vid_040b&pid_201b&mi_01&col01#7&fec02ab&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"}是不是这种方法不行啊??大家一般用什么方法?急啊

解决方案 »

  1.   

    USB插进去的时候,你CreateFile监听对应的盘符,然后当这个盘符的USB拔下的时候,你就可以获得你的指定设备的拔下操作了.
      

  2.   

     Col05#7&fec02ab&0&0004#{ 这段不一样~看清楚了大哥
      

  3.   


    自定义HID设备耶~~不是U盘耶也可以这样做??
      

  4.   

    如果没有映射盘符,那就读取设备的VID,PID等信息来匹配
      

  5.   

    是耶我才发现是用CreateFlile建立通讯的~~~“盘符”一时没转过弯~~~嘿嘿大哥木要见笑~~小弟弟刚刚开始写USB的东西以前都是做做界面而已~~~可我怎么获取啊~是有WM_DEVICECHANGE 消息啊,但我怎么知道是不是别的设备拔了呢?
      

  6.   

    http://topic.csdn.net/t/20030306/15/1499031.html
    看下这个.....
      

  7.   


    我已经做了.....WM_DEVICECHANGE 带过来那两参数也不是0了我上面也说了
      

  8.   

    那是不是 WM_DEVICECHANGE 带过来那两参数不是0就是我的设备呢?
      

  9.   

    我试了下可以哈..........
    GUID InterfaceClassGuid = {0x53f56307,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b};我的设备GUID
    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;    ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
        NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
        NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
        NotificationFilter.dbcc_classguid = InterfaceClassGuid;

        HDEVNOTIFY hDeviceNotify = RegisterDeviceNotification( 
            this->m_hWnd,                       // events recipient
            &NotificationFilter,        // type of device
            DEVICE_NOTIFY_WINDOW_HANDLE // type of recipient handle
            );

        if(NULL == hDeviceNotify ) 
        {
            AfxMessageBox(TEXT("RegisterDeviceNotification"));
            return FALSE;
        }
    case DBT_DEVICEREMOVECOMPLETE:
    switch(pDev_Hdr->dbch_devicetype)
    {
    case(DBT_DEVTYP_DEVICEINTERFACE):
    PDEV_BROADCAST_DEVICEINTERFACE pDev_Vol = (PDEV_BROADCAST_DEVICEINTERFACE)pDev_Hdr; AfxMessageBox(_T("test"));
    AfxMessageBox(pDev_Vol->dbcc_name);
    break;
    }
      

  10.   


         DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
         GUID HidGuid;     ZeroMemory( &DevBroadcastDeviceInterface, sizeof(DevBroadcastDeviceInterface) );
         //获取HID设备的接口类GUDI
         HidD_GetHidGuid(&HidGuid);
         //设置DevBroadcastDeviceInterface结构体,用来注册设备改变时的通知
          DevBroadcastDeviceInterface.dbcc_size=sizeof(DEV_BROADCAST_DEVICEINTERFACE);
         DevBroadcastDeviceInterface.dbcc_devicetype=DBT_DEVTYP_DEVICEINTERFACE;
         DevBroadcastDeviceInterface.dbcc_classguid=HidGuid;
         //注册设备改变时收到通知
          RegisterDeviceNotification(m_hWn,
                                   &DevBroadcastDeviceInterface,
    DEVICE_NOTIFY_WINDOW_HANDLE);
        
    case DBT_DEVICEREMOVECOMPLETE: 
    if(pdbi->dbcc_devicetype==DBT_DEVTYP_DEVICEINTERFACE)
    {
       byDevPathName=pdbi->dbcc_name; //保存发生状态改变的设备的路径名
    //比较是否是我们指定的设备
        if(m_DevPathName.CompareNoCase(byDevPathName)==0)
       {
         //设备被拔出,应该关闭设备(如果处于打开状态的话),停止操作
          if(MyDevOK==TRUE)
        {
    MyDevOK=FALSE;
    Close();
                 }
    }
    我是这样写的调试时
    byDevPathName: {"\\?\HID#Vid_040b&Pid_201b&MI_01&Col05#7&fec02ab&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}"}
    m_DevPathName: {"\\?\hid#vid_040b&pid_201b&mi_01&col01#7&fec02ab&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"}不一样啊,明明是同一个设备拔下来
      

  11.   

    只取前面一部分是不是就够了\\?\hid#vid_040b&pid_201b&mi_01
      

  12.   

    俺写的程序里,每次usb设备有变化就重新枚举一下所有的设备。
      

  13.   


    兔子大哥.....这样会很浪费CPU的吧.......而且如果不断地拔插不会死机?
      

  14.   


    byDevPathName: {"\\?\HID#Vid_040b&Pid_201b&MI_01&Col05#7&fec02ab&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}"}
    m_DevPathName: {"\\?\hid#vid_040b&pid_201b&mi_01&col01#7&fec02ab&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"}红色部分不一样~~嘿嘿,大哥看到了没~~谢谢~~