MyException - 我的异常网
当前位置:我的异常网» VC/MFC » USB移动存储设备的检测、写下及弹出

USB移动存储设备的检测、写下及弹出

www.myexceptions.net  网友分享于:2013-02-20  浏览:258次
USB移动存储设备的检测、写入及弹出
本帖最后由 zqckzqck 于 2013-01-10 13:16:22 编辑

USB设备的基本操作涉及USB存储设备的插入检测及写入文件,同时可以在写入结束后自动弹出,下面介绍自己的实现方法。
 
(1)注册设备。
 
在检测之前需要对检测的设备进行注册。具体的代码如下:
 
//首先注册设备
 void CUSBTestDlg::OnBtnRegister() 
{
  // TODO: Add your control notification handler code here
 
 static const GUID GUID_DEVINTERFACE_LSIT[] = 
 {
  //GUID_DEVINTERFACE_USB_DEVICE
  {0xA5DCBF10,0x6530,0x11D2,{0x90,0x1F,0x00,0xC0,0x4F,0xB9,0x51,0xED}},
  //GUID_DEVINTERFACE_DISK
  {0X53F56307,0XB6BF,0X11D0,{0X94,0XF2,0X00,0XA0,0XC9,0X1E,0XFB,0X8B}},
  //GUID_DEVINTERFACE_HID
  {0X4D1E55B2,0XF16F,0X11CF,{0X88,0XCB,0X00,0X11,0X11,0X00,0X00,0X30}},
  //GUID_NDIS_LAN_CLASS
  {0XAD498944,0X762F,0X11D0,{0X8D,0XCB,0X00,0X00,0X4F,0XC3,0X35,0X8C}}
  };
  //注册插拔事件
  HDEVNOTIFY hDevNotify;
  DEV_BROADCAST_DEVICEINTERFACE NotifacationFiler;
  ZeroMemory(&NotifacationFiler,sizeof(DEV_BROADCAST_DEVICEINTERFACE));
  NotifacationFiler.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
  NotifacationFiler.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
  
  for(int i=0;i<sizeof(GUID_DEVINTERFACE_LSIT)/sizeof(GUID);i++)
  {
   NotifacationFiler.dbcc_classguid = GUID_DEVINTERFACE_LSIT[i];//GetCurrentUSBGUID();//m_usb->GetDriverGUID();
 
  hDevNotify = RegisterDeviceNotification(m_hWnd,&NotifacationFiler,DEVICE_NOTIFY_WINDOW_HANDLE);
   if(!hDevNotify)
   {
    int Err = GetLastError();
    MessageBox("RegisterDeviceNotificationFailed");
   }
   else
   MessageBox("RegisterDeviceNotificationSuccess");
  } 
 }
 
(2)利用ON_WM_DEVICECHANGE实现检测。
 
这里需要手动添加ON_WM_DEVICECHANGE消息。首先头文件中声明响应函数:
 
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);
 
定义响应函数:
 
[code=css]BOOL CUSBTestDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
 {
  PDEV_BROADCAST_HDR pdb;
  PDEV_BROADCAST_VOLUME pdbv;
  CString strVolume="";
 
 pdb = (PDEV_BROADCAST_HDR)dwData;
  switch(nEventType)
  {
  case DBT_DEVICEARRIVAL:
   // Check whether a CD or DVD was inserted into a drive.
   if(pdb->dbch_devicetype==DBT_DEVTYP_VOLUME)
   {
    pdbv = (PDEV_BROADCAST_VOLUME)pdb;
    JudgeDeviceChangePath(pdbv->dbcv_unitmask,strVolume);//获取卷标
    g_strVolume = strVolume;
    IOFileToMobileDevice(strVolume);//写入数据
   }
   if(pdb->dbch_devicetype==DBT_DEVTYP_DEVICEINTERFACE)
   {
 
  }
   break;
  case DBT_DEVICEREMOVECOMPLETE:
   break;
  default:
   break;
  } 
  return TRUE;
 }
[/code] 
(3)弹出USB设备。
 
BOOL CUSBTestDlg::UnInstallUsb(char szDriveName)

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有