|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Как определть букву USB флэшки
Привет, более или менее разобрался с определением вставки и извлечения флэшки (и тд), но возник другой вопрос, как вытащить букву диска, зная HDEVINFO, DeviceNumber, TSPDevInfoData или TSPDeviceInterfaceData ? Знаю что несложно, но запутался. Вот часть кода где необходимо определить букву диска:
Код:
procedure TForm1.UpdateDriveListBox; var DrivePnPHandle: HDEVINFO; DeviceNumber:DWORD; DevData: TSPDevInfoData; DeviceInterfaceData: TSPDeviceInterfaceData; RES:BOOL; // sSerial: String; Buffer:array[0..4096-1] of Char; // S{, SymbolicName}: string; { I: Integer; Inst: DEVINST; sVendor,sVendorSpec,sProduct,sRevision: String;} begin DrivesListBox.Clear; // update the list of drive mount points // FillInRemovableDriveMountPoints(DriveMountPoints); DrivePnPHandle := SetupDiGetClassDevs(@GUID_DEVCLASS_DISKDRIVE, nil, 0, DIGCF_PRESENT);//or DIGCF_PROFILE if DrivePnPHandle = INVALID_HANDLE_VALUE then Exit; DeviceNumber := 0; repeat // DevData:=GetMemory(sizeof(TSPDevInfoData)); DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData); DevData.cbSize := SizeOf(TSPDevInfoData); RES := SetupDiEnumDeviceInfo(DrivePnPHandle, DeviceNumber, DevData); if (RES) then begin // if IsUSBDevice(DevData.DevInst) then//Нельзя, иначе не извлечь CM_Get_Parent(DevData.DevInst,DevData.DevInst,0); CM_Get_Device_ID(DevData.DevInst,Buffer,SizeOf(Buffer),0); sSerial:=ExtractFileName(Buffer); if Pos('&',sSerial)>0 then //sSerial:=''; sSerial := IntToStr(GetVolumeSerialNumber(S)); //Получить букву диска, а не тока описание DrivesListBox.Items.Add(S + ' ' + GetDeviceName(DrivePnPHandle, DevData) + ' [' + sSerial + ']'); Inc(DeviceNumber); end; until not RES; // { S := 'A:'; SymbolicName := ''; for I := 0 to DriveMountPoints.Count - 1 do begin S[1] := Char(DriveMountPoints.Objects[i]); GetDriveInstanceID(DriveMountPoints[i], Inst); // SymbolicName := GetSymbolicName(Inst); GetInquiryData(S[1], sVendor,sVendorSpec,sProduct,sRevision);} // DrivesListBox.Items.AddObject(S + ' [' + IntToStr(GetVolumeSerialNumber(S)) +' - '+ sVendor+sVendorSpec+sProduct+sRevision {+ ExtractSerialNumber(SymbolicName)} + ']', TObject(Inst)); { end;} // SetupDiDestroyDeviceInfoList(DrivePnPHandle); DrivesListBox.Enabled:=true; end; |
#2
|
|||
|
|||
Когда-то занимался похожим вопросом. Вставку/извлечение флешки обрабатывал отловом сообщения WM_DEVICECHANGE.
При запуске программы находил список букв флешек и заносил в переменную. При определении вставки/извлечения нового накопителя получал новый список и сохранял его в другую переменную. Потом с помощью простого цикла и функции POS определял отличие двух стринговых строк. Отличались они всего на одну букву - букву вставленной/извлеченной флешки. P.S. Код написать не смог, ибо с телефон не поддерживает английский. |