我在Windows 7 Maximal的MS VS 2013 Ultimate中用C ++开发了一个MFC Dialog应用程序。作为源代码的先驱,我在Detecting Hardware Insertion or Removal中使用了CodeProject文件。
我的应用程序是用户模式应用程序。它用于检测从计算机添加或删除硬件。为此,我处理CTFontManagerRegisterGraphicsFont
消息并在我的应用程序中调用WM_DEVICECHANGE
函数。因此,示意性地,我的应用程序执行以下操作:
RegisterDeviceNotification()
以获取设备信息集SetupDiGetClassDevs()
的句柄。 HDEVINFO
枚举信息集中的所有设备。每次迭代后,我们都会得到一个SetupDiEnumDeviceInfo()
。 SP_DEVINFO_DATA
来读取每个设备的实例ID。实例ID的形式为“USB \ Vid_04e8& Pid_503b \ 0002F9A9828E0F06”。 SetupDiGetDeviceInstanceId()
匹配,则调用DEV_BROADCAST_DEVICEINTERFACE.dbcc_name
以检索描述或友好名称。 但是当插入此设备时(当SetupDiGetDeviceRegistryProperty()
设备事件发生时),我需要从USB大容量存储设备读取文件。如何在Visual C ++中以编程方式执行此操作?
答案 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;
}
}
实际上,有些驱动器可以立即读取,有些则需要几秒钟。