如何使用Visual C ++从USB大容量存储设备读取文件?

时间:2015-05-23 11:33:13

标签: c++ visual-c++ mfc usb

我在Windows 7 Maximal的MS VS 2013 Ultimate中用C ++开发了一个MFC Dialog应用程序。作为源代码的先驱,我在Detecting Hardware Insertion or Removal中使用了CodeProject文件。

我的应用程序是用户模式应用程序。它用于检测从计算机添加或删除硬件。为此,我处理CTFontManagerRegisterGraphicsFont消息并在我的应用程序中调用WM_DEVICECHANGE函数。因此,示意性地,我的应用程序执行以下操作:

  1. 致电RegisterDeviceNotification()以获取设备信息集SetupDiGetClassDevs()的句柄。
  2. 调用HDEVINFO枚举信息集中的所有设备。每次迭代后,我们都会得到一个SetupDiEnumDeviceInfo()
  3. 在枚举期间,调用SP_DEVINFO_DATA来读取每个设备的实例ID。实例ID的形式为“USB \ Vid_04e8& Pid_503b \ 0002F9A9828E0F06”。
  4. 如果实例ID与SetupDiGetDeviceInstanceId()匹配,则调用DEV_BROADCAST_DEVICEINTERFACE.dbcc_name以检索描述或友好名称。
  5. 但是当插入此设备时(当SetupDiGetDeviceRegistryProperty()设备事件发生时),我需要从USB大容量存储设备读取文件。如何在Visual C ++中以编程方式执行此操作?

1 个答案:

答案 0 :(得分:1)

DBT_DEVICEARRIVAL的参数是DEV_BROADCAST_VOLUME,其中包含已分配的驱动器号的掩码。因此,由于您只是在大容量存储设备之后,以下工作。

DEV_BROADCAST_VOLUME *pj = (DEV_BROADCAST_VOLUME*) lParam;
if (pj->dbcv_devicetype == DBT_DEVTYPE_VOLUME) {
    long um = pj->dbcv_unitmask;
    for ( int i=0; i < 26; i++ ) {
        if (um&1) break;
        um = um >> 1;
    }

    if ( i < 26 ) {
        char Drive  = 'A' + i;
    }
}

实际上,有些驱动器可以立即读取,有些则需要几秒钟。