Невозможно получить данные на съемном устройстве с помощью службы Windows в C ++ - PullRequest
5 голосов
/ 04 января 2012

Я пытаюсь обнаружить вставку съемных устройств и получить букву диска указанного устройства с помощью службы NT.Я успешно обнаружил вставку и удаление устройств, но не смог настроить структуру DEV_BROADCAST_VOLUME, которая позволила бы мне получить букву диска, GUID и т. Д. ... с тома.

case SERVICE_CONTROL_DEVICEEVENT:{
            switch(evtype){
            case DBT_DEVICEARRIVAL:{
                    DEV_BROADCAST_VOLUME *hdr = (DEV_BROADCAST_VOLUME*) evdata;
                    ofstream log ("C:\\log.txt", ios::app);
                    log << hdr->dbcv_devicetype;
                    log.close();
                }
                break;

Приведенный выше фрагмент кода компилируется и работает правильно, но когда я вставляю флэш-диск, hdr->dbcv_devicetype записывает в журнал значения 55555 и DBT_DEVTYP_VOLUME (то есть, что такое USB-накопитель)определяется как 2 (hdr->dbcv_devicetype должно равняться DBT_DEVTYP_VOLUME, потому что я вставил флешку).По какой-то причине или DBT_DEVTYP_VOLUME не инициализируется правильно, или что-то еще, что я делаю, неправильно.Я использую Windows 7 с Visual Studio 2011 C ++.

1 Ответ

1 голос
/ 29 февраля 2012

Попробуйте:

  PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)evdata;
  if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
   {
    PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

    if (lpdbv -> dbcv_flags & DBTF_MEDIA)
     {
      StringCchPrintf( szMsg, sizeof(szMsg)/sizeof(szMsg[0]), 
                       TEXT("Drive %c: Media has arrived.\n"), 
                       FirstDriveFromMask(lpdbv ->dbcv_unitmask) );

      MessageBox( hwnd, szMsg, TEXT("WM_DEVICECHANGE"), MB_OK );
     }
   }

   /*------------------------------------------------------------------
      FirstDriveFromMask( unitmask )

      Description
        Finds the first valid drive letter from a mask of drive letters.
        The mask must be in the format bit 0 = A, bit 1 = B, bit 2 = C, 
        and so on. A valid drive letter is defined when the 
        corresponding bit is set to 1.

      Returns the first drive letter that was found.
   --------------------------------------------------------------------*/

   char FirstDriveFromMask( ULONG unitmask )
    {
     char i;

     for (i = 0; i < 26; ++i)
      {
       if (unitmask & 0x1)
         break;
       unitmask = unitmask >> 1;
      }

     return( i + 'A' );
   }

Код извлечен из Обнаружение вставки или извлечения носителя

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