我正在编写一个应用程序,通过侦听DEVICECHANGE消息来检测某个USB海量存储设备何时插入--以及何时拔出--。
我还注册了我的应用程序来侦听DBT_DEVTYP_DEVICEINTERFACE的DBT_DEVTYP_DEVICEINTERFACE消息(使用RegisterDeviceNotification API调用),并在插入或拔出USB海量存储设备时获得DBT_DEVICEARRIVAL和DBT_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消息--因为我为设备获得了这两个消息)?发布于 2009-10-22 21:10:49
好的,所以我能够回答我自己的一个问题:有办法让Windows通知我这两个卷删除吗?
是--尽管windows只发送一条DBT_DEVTYP_VOLUME WM_DEVICECHANGE消息,但实际上确实会收到两卷删除的通知--但是,与往常一样,答案就隐藏在MSDN的深处。
尽管dbcv_unitmask成员可以在任何消息中指定多个卷,但这并不保证只为指定的事件生成一条消息。多个系统组件可以同时独立地为逻辑卷生成消息。
所以,我所要做的就是忽略微软在其中一个样本中给出的示例函数,
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_VOLUME**) DBT_DEVTYP_DEVICEINTERFACE*和)如何相互关联?**
https://stackoverflow.com/questions/1608915
复制相似问题