Привет всем! вижу тут уже есть похожая тема, но не такая же=) в общем отлавливаю я сообщение WM_DeviceChange где wParam= DBT_DEVICEARRIVAL а lParam указателю на структуру Код (Text): PDevBroadcastVolume=^DEV_BROADCAST_VOLUME; DEV_BROADCAST_VOLUME=packed record dbcv_size:DWORD; dbcv_devicetype:DWORD; dbcv_reserved:DWORD; dbcv_unitmask:DWORD; dbcv_flags:WORD; end; dbcv_devicetype возвращает 2 тоесть DRIVE_REMOVABLE. мне нужно получить dbcv_unitmask он должен вернуть 0 1 2 (a b c и.т.д) а он возвращает 64 почему так? вот код Код (Text): function CheckDriveType(Drive: Byte): string; var DriveLetter: Char; DriveType: UInt; begin DriveLetter:=Chr(Drive + $41); DriveType:=GetDriveType(PChar(DriveLetter + ':\')); case DriveType of 0: Result:='not'; 1: Result:='not'; DRIVE_REMOVABLE: Result:=Chr(Drive + $41)+'=Removable'; DRIVE_FIXED: Result:=Chr(Drive + $41)+'=Fixed'; DRIVE_REMOTE: Result:=Chr(Drive + $41)+'=Remote'; DRIVE_CDROM: Result:=Chr(Drive + $41)+'=CD_ROM'; DRIVE_RAMDISK: Result:=Chr(Drive + $41)+'=RAMDISK' else Result:='not' end end; function GetDrive(pDBVol: PDevBroadcastVolume): string; var i: Byte; Maske: DWORD; begin if (pDBVol^.dbcv_flags and DBTF_Media) = DBTF_Media then begin Maske := pDBVol^.dbcv_unitmask; for i := 0 to 25 do begin if (Maske and 1) = 1 then Result := Char(i + Ord('A')) + ':'; Maske := Maske shr 1; end; end; end; procedure TForm2.WMDEVICECHANGE(var Messag:TMessage); {Обрабатываем сообщение} var vol:PDevBroadcastVolume; s:PDevBroadcastDeviceInterface; unitmask:Byte; ass:byte; begin {$I-} if messag.WParam=DBT_DEVICEARRIVAL then begin s:=PDevBroadcastDeviceInterface(Messag.LParam); vol:=PDevBroadcastVolume(Messag.LParam); unitmask:=VOL^.dbcv_unitmask; Ass:=s^.dbcc_name; ShowMessage(CheckDriveType(unitmask)+#13+CHR(unitmask+$41)+#13+Inttostr(unitmask)+#13+chr(ass+$41)+#13+Inttostr(ass)+#13+chr(Vol^.dbcv_flags)); end; Application.ProcessMessages; {$I+} end; ps. много лишнего но это для того чтоб разобраться в работе=)
transserg > возвращает 64 почему так? 64 - это диск G:, а какой диск появляется в системе? > чтоб разобраться в работе Что вернет GetDrive, если не выполнится условие (pDBVol^.dbcv_flags and DBTF_Media) = DBTF_Media?
=) дис g! а вот теперь объясни пожалуйста как эжто 64 G если 0 A 1 B 2 C 3 D 4 E 5 F и.т.д ну так в мсдн и в тсправке от делфи было написанно=) если это не так то тогда как из полученного числа получить букву диска getdrive Должа вернуть тогда пустую строку=)