C++ 驱动器号中的复制

C++ 驱动器号中的复制,c++,windows,winapi,C++,Windows,Winapi,我从WM_DEVICECHANGE收到设备插入和移除通知 我从DBT_DEVTYP_设备界面获取dbcc_名称 我从DBT_DEVTYP_卷获取相应的驱动器号 如果我一个接一个地插入设备,它就会正常工作 但如果我一次插入两个设备,就会得到驱动器号的重复 我该怎么解决呢 请给我一些想法 我的代码片段 if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam ) { PDEV_BROADCAST_HDR p

我从WM_DEVICECHANGE收到设备插入和移除通知

我从DBT_DEVTYP_设备界面获取dbcc_名称

我从DBT_DEVTYP_卷获取相应的驱动器号

如果我一个接一个地插入设备,它就会正常工作

但如果我一次插入两个设备,就会得到驱动器号的重复

我该怎么解决呢

请给我一些想法

我的代码片段

if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam )
{
     PDEV_BROADCAST_HDR pHdr = ( PDEV_BROADCAST_HDR )lParam;

     PDEV_BROADCAST_DEVICEINTERFACE pDevInf;

     PDEV_BROADCAST_VOLUME pDevVolume = reinterpret_cast<PDEV_BROADCAST_VOLUME>(lParam);

     switch( pHdr->dbch_devicetype )

     {
           case DBT_DEVTYP_DEVICEINTERFACE:
                pDevInf = ( PDEV_BROADCAST_DEVICEINTERFACE )pHdr;
      updateDevice( pDevInf, wParam , pDevVolume );
                break;

            case DBT_DEVTYP_VOLUME:
                  pDevVolume = ( PDEV_BROADCAST_VOLUME )pHdr;
                  QString aDrive = FirstDriveFromMask( pDevVolume->dbcv_unitmask );
                  break;

      }

}
if(DBT_DEVICEARRIVAL==wParam | | DBT_devicemovecomplete==wParam)
{
PDEV_广播_HDR pHdr=(PDEV_广播_HDR)LPRAM;
PDEV广播设备接口pDevInf;
PDEV_广播_音量pDevVolume=重新解释广播(lParam);
开关(pHdr->dbch\U设备类型)
{
案例DBT_DEVTYP_设备接口:
pDevInf=(PDEV\u广播设备接口)pHdr;
更新设备(pDevInf、wParam、pDevVolume);
打破
案例DBT_DEVTYP_卷:
pDevVolume=(PDEV_广播_音量)pHdr;
QString aDrive=firstdrivefromsmask(pDevVolume->dbcv_unitmask);
打破
}
}
文档中提到了这条信息:

尽管
dbcv_unitmask
成员可以在任何消息中指定多个卷,但这并不保证为指定的事件只生成一条消息。多个系统组件可以同时独立地为逻辑卷生成消息


换句话说,一条消息可以携带(几乎)同时添加的多个卷的信息,但这并不保证这些卷只生成一条消息。您应该检查多个卷的
dbcv\u unitmask

如果需要
dbcc\u name
,是否可以从PDEV\u BROADCAST\u VOLUMENo获取dbcc\u name,您需要使用
RegisterDeviceNotification
明确注册
DBT\u DEVTYP\u DEVICEINTERFACE
通知,并从
DEV\u BROADCAST\u DEVICEINTERFACE
结构获取通知。(顺便说一句,
dbcc_name
即使是UNC格式的字符串,也不打算让人可读)4天前我写了一个程序,我以前答应过你。它用驱动器号枚举所有驱动器,并提供其他信息:供应商ID、产品ID、硬件ID、驱动器是否可移动等等。因此,它提供了您在前面的一些问题中需要的信息。你能用相应的标题再问一个问题吗?我会把这个程序的完整源代码发给你。@Oleg:我已经按照你说的回答了一个问题