gpt4 book ai didi

winapi - 为什么移除多卷 USB 设备时只有一个 WM_DEVICECHANGE 消息?

转载 作者:行者123 更新时间:2023-12-03 22:19:11 29 4
gpt4 key购买 nike

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

我还注册了我的应用程序以监听 DBT_DEVTYP_DEVICEINTERFACEWM_DEVICECHANGE 消息(使用 RegisterDeviceNotification API 调用)并且我得到了 DBT_DEVICEARRIVALDBT_DEVICEREMOVECOMPLETE 插入或拔出 USB 大容量存储设备时的消息。

现在,问题发生在插入具有多个卷的 USB 设备,然后拔出时。

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

  • WM_DEVICECHANGE(DBT_DEVICEARRIVAL 类型 DBT_DEVTYP_DEVICEINTERFACE)
  • WM_DEVICECHANGE(DBT_DEVICEARRIVAL 类型 DBT_DEVTYP_VOLUME)
  • WM_DEVICECHANGE(DBT_DEVICEARRIVAL 类型 DBT_DEVTYP_VOLUME)

当它被拔出时出现以下信息:

  • WM_DEVICECHANGE(DBT_DEVICEREMOVECOMPLETE 类型 DBT_DEVTYP_VOLUME)
  • WM_DEVICECHANGE(DBT_DEVICEREMOVECOMPLETE 类型 DBT_DEVTYP_DEVICEINTERFACE)

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

我有两个问题:

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

最佳答案

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

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

Although the dbcv_unitmask member may specify more than one volume in any message, this does not guarantee that only one message is generated for a specified event. Multiple system components may independently generate messages for logical volumes at the same time.

所以,我所要做的就是忽略 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_DEVICEINTERFACEDBT_DEVTYP_VOLUME)如何关联?

关于winapi - 为什么移除多卷 USB 设备时只有一个 WM_DEVICECHANGE 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1608915/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com