멀티 볼륨 USB 장치가 제거 될 때 왜 하나의 WM_DEVICECHANGE 메시지 만 있습니까?
-
05-07-2019 - |
문제
나는 특정 USB 대량 저장 장치가 연결되어 있고 플러그를 뽑을 때를 감지하는 응용 프로그램을 작성하고 있습니다. wm_devicechange 메시지.
또한 듣기 위해 신청서를 등록했습니다 WM_DEVICECHANGE
메시지 DBT_DEVTYP_DEVICEINTERFACE
(사용 사용 RegisterDevicenotification API Call) 그리고 나는 둘 다 얻는다 DBT_DEVICEARRIVAL
그리고 DBT_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
메시지 (본질적으로, 내가 어느 것을 어떻게 알 수 있습니까? 용량 메시지는 그에 해당합니다 DeviceInterface 메시지 - 장치를 위해 둘 다 가져 오므로)? - Windows가 두 가지 볼륨 제거를 알리는 방법이 있습니까?
해결책
좋아, 그래서 나는 내 자신의 질문 중 하나에 대답 할 수 있었다. Windows가 두 가지 볼륨 제거를 알리는 방법이 있습니까?
예 - Windows가 하나만 보내더라도 DBT_DEVTYP_VOLUME
WM_DEVICECHANGE
메시지, 실제로 두 권의 제거에 대한 알림을받습니다 -하지만 언제나 그렇듯이 대답은 MSDN에 깊이 묻혀 있습니다:
DBCV_UNITMASK 멤버는 모든 메시지에 둘 이상의 볼륨을 지정할 수 있지만 지정된 이벤트에 대해 하나의 메시지 만 생성되도록 보장하지는 않습니다. 다중 시스템 구성 요소는 독립적으로 논리 볼륨에 대한 메시지를 동시에 생성 할 수 있습니다.
그래서 내가해야 할 일은 예제 기능 Microsoft는 샘플 중 하나를 제공합니다.
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_VOLUME
) 상관 관계가 있습니까?