Дублирование в буквах дисков - PullRequest
0 голосов
/ 22 июня 2010

я получаю уведомление о вставке и удалении устройства от WM_DEVICECHANGE

я получаю dbcc_name из DBT_DEVTYP_DEVICEINTERFACE

я получаю соответствующую букву диска из DBT_DEVTYP_VOLUME

, если я вставляюустройство по одному, оно работает правильно

, но если я вставляю два устройства за раз, я получаю дублирование в буквах дисков

как я могу это решить

любезно предоставьте мне несколько идей

фрагмент моего кода

if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam )
{
     PDEV_BROADCAST_HDR pHdr = ( PDEV_BROADCAST_HDR )lParam;

     PDEV_BROADCAST_DEVICEINTERFACE pDevInf;

     PDEV_BROADCAST_VOLUME pDevVolume = reinterpret_cast<PDEV_BROADCAST_VOLUME>(lParam);

     switch( pHdr->dbch_devicetype )

     {
           case DBT_DEVTYP_DEVICEINTERFACE:
                pDevInf = ( PDEV_BROADCAST_DEVICEINTERFACE )pHdr;
      updateDevice( pDevInf, wParam , pDevVolume );
                break;

            case DBT_DEVTYP_VOLUME:
                  pDevVolume = ( PDEV_BROADCAST_VOLUME )pHdr;
                  QString aDrive = FirstDriveFromMask( pDevVolume->dbcv_unitmask );
                  break;

      }

}

1 Ответ

1 голос
/ 22 июня 2010

Документы DEV_BROADCAST_VOLUME упоминают эту информацию:

Хотя элемент dbcv_unitmask может указывать более одного тома в любом сообщении, это не гарантирует, что для указанного события будет сгенерировано только одно сообщение. Несколько компонентов системы могут независимо генерировать сообщения для логических томов одновременно.

Другими словами - одно сообщение может содержать информацию о нескольких томах, добавленных (почти) одновременно, но это не гарантирует, что для этих томов будет создано только одно сообщение. Вам следует проверить dbcv_unitmask на наличие более одного тома.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...