멀티 볼륨 USB 장치가 제거 될 때 왜 하나의 WM_DEVICECHANGE 메시지 만 있습니까?

StackOverflow https://stackoverflow.com/questions/1608915

  •  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) 상관 관계가 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top