首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当一个多容量的WM_DEVICECHANGE设备被移除时,为什么只有一条消息?

当一个多容量的WM_DEVICECHANGE设备被移除时,为什么只有一条消息?
EN

Stack Overflow用户
提问于 2009-10-22 17:56:12
回答 1查看 3.4K关注 0票数 3

我正在编写一个应用程序,通过侦听DEVICECHANGE消息来检测某个USB海量存储设备何时插入--以及何时拔出--。

我还注册了我的应用程序来侦听DBT_DEVTYP_DEVICEINTERFACEDBT_DEVTYP_DEVICEINTERFACE消息(使用RegisterDeviceNotification API调用),并在插入或拔出USB海量存储设备时获得DBT_DEVICEARRIVALDBT_DEVICEREMOVECOMPLETE消息。

现在,当一个设备(有多个卷)被插入,然后拔出插头时,就会出现问题

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

  • WM_DEVICECHANGE (DBT_DEVICEARRIVAL of DBT_DEVTYP_DEVICEINTERFACE)
  • WM_DEVICECHANGE (DBT_DEVICEARRIVAL of DBT_DEVTYP_VOLUME)
  • WM_DEVICECHANGE (DBT_DEVICEARRIVAL of DBT_DEVTYP_VOLUME)

当它被插入时,下面的消息:

  • WM_DEVICECHANGE (DBT_DEVICEREMOVECOMPLETE of DBT_DEVTYP_VOLUME)
  • WM_DEVICECHANGE (DBT_DEVICEREMOVECOMPLETE of DBT_DEVTYP_DEVICEINTERFACE)

因此,只有一个删除消息,即使有两个卷。为什么??

我有两个问题:

  • 我如何将DBT_DEVTYP_DEVICEINTERFACE消息与DBT_DEVTYP_VOLUME消息关联起来(本质上,我如何知道哪个卷消息对应于哪个DEVICEINTERFACE消息--因为我为设备获得了这两个消息)?
  • 有办法让Windows通知我这两个卷删除吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-22 21:10:49

好的,所以我能够回答我自己的一个问题:有办法让Windows通知我这两个卷删除吗?

--尽管windows只发送一条DBT_DEVTYP_VOLUME WM_DEVICECHANGE消息,但实际上确实会收到两卷删除的通知--但是,与往常一样,答案就隐藏在MSDN的深处。

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

所以,我所要做的就是忽略微软在其中一个样本中给出的示例函数

代码语言:javascript
复制
char FirstDriveFromMask (ULONG unitmask)
{
   char i;

   for (i = 0; i < 26; ++i)
   {
      if (unitmask & 0x1)
         break;
      unitmask = unitmask >> 1;
   }

   return (i + 'A');
}

并将其替换为解释所有受影响驱动器的掩码的函数。因此,我得到的信息确实是两个卷,两个卷驱动器字母都可以在掩码中使用。

代码语言:javascript
复制
// [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_VOLUME**) DBT_DEVTYP_DEVICEINTERFACE*和)如何相互关联?**

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1608915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档