WM_DeviceChange DEV_BROADCAST_VOLUME [Delphi]

Тема в разделе "WASM.WIN32", создана пользователем transserg, 24 мар 2009.

  1. transserg

    transserg New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    17
    Привет всем!
    вижу тут уже есть похожая тема, но не такая же=)
    в общем отлавливаю я сообщение WM_DeviceChange где wParam= DBT_DEVICEARRIVAL а lParam указателю на структуру
    Код (Text):
    1.   PDevBroadcastVolume=^DEV_BROADCAST_VOLUME;
    2.   DEV_BROADCAST_VOLUME=packed record
    3.      dbcv_size:DWORD;
    4.      dbcv_devicetype:DWORD;
    5.      dbcv_reserved:DWORD;
    6.      dbcv_unitmask:DWORD;
    7.      dbcv_flags:WORD;
    8.   end;
    dbcv_devicetype возвращает 2 тоесть DRIVE_REMOVABLE. мне нужно получить dbcv_unitmask он должен вернуть 0 1 2 (a b c и.т.д) а он возвращает 64 почему так?

    вот код
    Код (Text):
    1. function CheckDriveType(Drive: Byte): string;
    2. var
    3.   DriveLetter: Char;
    4.   DriveType: UInt;
    5. begin
    6.   DriveLetter:=Chr(Drive + $41);
    7.   DriveType:=GetDriveType(PChar(DriveLetter + ':\'));
    8.   case DriveType of
    9.     0:               Result:='not';
    10.     1:               Result:='not';
    11.     DRIVE_REMOVABLE: Result:=Chr(Drive + $41)+'=Removable';
    12.     DRIVE_FIXED:     Result:=Chr(Drive + $41)+'=Fixed';
    13.     DRIVE_REMOTE:    Result:=Chr(Drive + $41)+'=Remote';
    14.     DRIVE_CDROM:     Result:=Chr(Drive + $41)+'=CD_ROM';
    15.     DRIVE_RAMDISK:   Result:=Chr(Drive + $41)+'=RAMDISK'
    16.     else
    17.       Result:='not'
    18.   end
    19. end;
    20.  
    21. function GetDrive(pDBVol: PDevBroadcastVolume): string;
    22. var
    23.   i: Byte;
    24.   Maske: DWORD;
    25. begin
    26.   if (pDBVol^.dbcv_flags and DBTF_Media) = DBTF_Media then
    27.   begin
    28.     Maske := pDBVol^.dbcv_unitmask;
    29.     for i := 0 to 25 do
    30.     begin
    31.       if (Maske and 1) = 1 then
    32.         Result := Char(i + Ord('A')) + ':';
    33.       Maske := Maske shr 1;
    34.     end;
    35.   end;
    36. end;
    37.  
    38.  
    39.  
    40. procedure TForm2.WMDEVICECHANGE(var Messag:TMessage); {Обрабатываем сообщение}
    41.   var
    42.     vol:PDevBroadcastVolume;
    43.     s:PDevBroadcastDeviceInterface;
    44.     unitmask:Byte;
    45.     ass:byte;
    46.   begin
    47.    {$I-}
    48.      if messag.WParam=DBT_DEVICEARRIVAL then
    49.        begin
    50.           s:=PDevBroadcastDeviceInterface(Messag.LParam);
    51.           vol:=PDevBroadcastVolume(Messag.LParam);
    52.           unitmask:=VOL^.dbcv_unitmask;
    53.           Ass:=s^.dbcc_name;
    54.           ShowMessage(CheckDriveType(unitmask)+#13+CHR(unitmask+$41)+#13+Inttostr(unitmask)+#13+chr(ass+$41)+#13+Inttostr(ass)+#13+chr(Vol^.dbcv_flags));
    55.         end;
    56.     Application.ProcessMessages;
    57.     {$I+}
    58.    end;
    ps. много лишнего но это для того чтоб разобраться в работе=)
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    transserg
    > возвращает 64 почему так?
    64 - это диск G:, а какой диск появляется в системе?

    > чтоб разобраться в работе
    Что вернет GetDrive, если не выполнится условие (pDBVol^.dbcv_flags and DBTF_Media) = DBTF_Media?
     
  3. transserg

    transserg New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    17
    =) дис g! а вот теперь объясни пожалуйста как эжто 64 G если 0 A 1 B 2 C 3 D 4 E 5 F и.т.д ну так в мсдн и в тсправке от делфи было написанно=) если это не так то тогда как из полученного числа получить букву диска
    getdrive Должа вернуть тогда пустую строку=)
     
  4. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    transserg
    Ну так и делай как всправке :)

    слово бит тебе не о чем не говорит?

    G это 7 буква 64d=1000000b
     
  5. transserg

    transserg New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    17
    GMax огромное спасибо! понял свою ошибку! все все разобрался=) 64 в 10 системе
     
  6. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218