代码之家  ›  专栏  ›  技术社区  ›  Mike Dinescu

为什么删除多卷USB设备时只显示一条WM U设备更改消息?

  •  3
  • Mike Dinescu  · 技术社区  · 15 年前

    我正在编写一个应用程序,通过监听来检测某个USB大容量存储设备何时插入,何时拔出。 WM_DEVICECHANGE messages .

    我也登记了我的申请 WM_DEVICECHANGE 报文 DBT_DEVTYP_DEVICEINTERFACE (使用 RegisterDeviceNotification API调用),我得到 DBT_DEVICEARRIVAL DBT_DEVICEREMOVECOMPLETE 插入或拔下USB大容量存储设备时的消息。

    现在, 问题 当USB设备 有多个卷 插入,然后拔出。

    当设备插入时,我会收到以下消息:

    • wm_设备更改 ( DBT设备竞争对手 类型的 设备接口 )
    • 动态变化 ( DBT设备竞争对手 类型的 DBT_DEVTYP_VOLUME )
    • 动态变化 ( DBT设备竞争对手 类型的 dbt_devtyp_卷 )

    以及以下信息:

    • 动态变化 ( DBT_设备移动完成 类型的 dbt_devtyp_卷 )
    • 动态变化 ( DBT_设备移动完成 类型 设备接口 )

    所以, 只有一条删除消息 即使有 两卷 . 为什么??

    我有两个问题:

    • 我如何关联 设备接口 消息与 dbt_devtyp_卷 信息(基本上,我如何知道 音量 消息对应于 设备接口 信息-因为我把它们都给了设备?
    • 有没有办法让Windows同时通知我两次卷删除?
    1 回复  |  直到 14 年前
        1
  •  6
  •   Mike Dinescu    15 年前

    好吧,所以我可以回答我自己的一个问题: 有没有办法让Windows同时通知我两次卷删除?

    是的 -即使Windows只发送一个 DBT_DEVTYP_VOLUME WM_DEVICECHANGE 消息, 实际上,两个卷删除都会通知您 -但是,一如既往, the answer lies deep down buried in MSDN :

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

    所以,我所要做的就是忽略 example function 微软提供的一个样本,

    char FirstDriveFromMask (ULONG unitmask)
    {
       char i;
    
       for (i = 0; i < 26; ++i)
       {
          if (unitmask & 0x1)
             break;
          unitmask = unitmask >> 1;
       }
    
       return (i + 'A');
    }
    

    并将其替换为解释 全部的 驱动器受影响。因此,我收到的一条消息确实是针对两个卷的,而且两个卷驱动器字母都在掩码中可用。

    // [IN] ULONG unitmask
    // [IN/OUT] char* outDriveLetters  - an array of characters to be passed in
    //                                   that is filled out with the drive letters
    //                                   in the mask (this must be 26 bytes to be safe)
    // RETURNS the number of drive letters in the mask
    int MaskToDriveLetters (ULONG unitmask, char* outDriveLetters)
    {
       int cnt = 0;
       for (i = 0; i < 26; ++i)
       {
          if (unitmask & 0x1)
          {
             outDriveLetters[cnt++] = 'A' + i;
             cnt++;
          }
          unitmask = unitmask >> 1;
       }
    
       outDriveLetters[cnt] = 0; // set the last character to \0 (optional)
       return cnt;  // the number of drives that were set in the mask
    }
    

    不过,我还有另外一个问题要回答——这两条信息怎么可能( DBT_DEVTYP_DEVICEINTERFACE dbt_devtyp_卷 )是否相关?