LONG  CMainFrame::OnDeviveChange(WPARAM  wParam,  LPARAM  lParam)  
{  
           CString  str;  
           DEV_BROADCAST_HDR  *  dhr  =  (DEV_BROADCAST_HDR  *)lParam;  
           switch(wParam)  
           {  
                   case  DBT_DEVICEARRIVAL:  //插入设备
                   {  
                           ... 
                     }  
                     break;  
                   case  DBT_DEVICEREMOVECOMPLETE:  //移除设备
                   case DBT_DEVICEQUERYREMOVE:
                   case DBT_DEVICEREMOVEPENDING:
                   {  
                           ...  
                     }  
                     break;  
                   }  
 

当我在程序中调用CM_Request_Device_Eject()函数安全移除设备后有时不进入DBT_DEVICEREMOVECOMPLETE,也试了case DBT_DEVICEQUERYREMOVE和case DBT_DEVICEREMOVEPENDING
都不进入,调试时会得到wParam值为7.请教各位大侠,我该怎样得知设备已安全移除呢?

解决方案 »

  1.   

    我与USB通讯是用的多线程,当通讯结束调用CM_Request_Device_Eject()函数安全移除USB
      

  2.   

    调用Device_Eject仅仅是Eject Media吧,就好似读卡器插拔卡一样,所以不会有DeviceRemove的消息,你可以用一个Undocument的RegShellNotify函数来获取设备变化通知
      

  3.   

    谢谢楼上的兄弟,问题已搞定.在设备变化时,会自动调用OnDeviveChange,我已经在每次设备变化时枚举所有的设备盘符来得知设备插拔情况,已解决问题