W mojej aplikacji (Delphi), muszę wyświetlić listę wszystkich urządzeń pamięci masowej USB. Mogą to być dyski flash z pamięcią flash lub Zewnętrzne dyski do przechowywania danych.Delphi - Jak uzyskać listę przenośnych dysków twardych USB i kart pamięci?
Jest Jvcl
komponent JvDriveCombo
i ma właściwość DriveType
- problem jest, jeśli wybiorę DriveType := Fixed
wtedy oprócz dysku zewnętrznym, ale także listę napędów wewnętrznych (C:\
, D:\
etc). Jednak chcę tylko wymienić dyski zewnętrzne.
Wierzę, że istnieje funkcja DeviceIoControl (widziałem to na MSDN), ale nie mam pojęcia, jak z niego korzystać.
Zastanawiam się, czy ktoś może mi pomóc w prawidłowy sposób/kod do listy urządzeń pamięci USB?
Dzięki.
EDIT:
Właśnie znalazłem przykładowy kod i zamieszczam go tutaj:
uses .... jwawinbase, JwaWinIoctl;
procedure TForm1.Button1Click(Sender: TObject);
var
DriveCmdStr: string;
DriveHandle: THandle;
ADriveLetter: string;
hp: STORAGE_HOTPLUG_INFO;
rlen: DWORD;
begin
ADriveLetter := 'H';
DriveCmdStr := Format('\\.\%s:', [ADriveLetter]);
DriveHandle := CreateFile(PChar(DriveCmdStr), GENERIC_READ, FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
if DriveHandle = INVALID_HANDLE_VALUE then
Exit;
DeviceIoControl(DriveHandle, IOCTL_STORAGE_GET_HOTPLUG_INFO, nil, 0, @hp,
SizeOf(hp), @rlen, nil);
CloseHandle(DriveHandle);
if hp.MediaRemovable then
showmessage('media removable');
end;
Teraz chciałbym tylko wiedzieć, w jaki sposób wyliczyć wszystkie litery dysków. Która funkcja jest najbardziej wydajna?
Działa! dzięki za twój kłopot! –
idealny, ale czy "{MINNEUZMIANIE 4}" jest naprawdę potrzebny? – Peter
@Peter Cóż, pole 'BusType' powinno zajmować 4 bajty. Zwykle Delphi przydzieliłby tylko tyle bajtów, ile potrzeba, aby zapisać dowolną wartość wyliczenia (w tym przypadku 1 bajt), chyba że podasz minimalny rozmiar wyliczenia za pomocą dyrektywy '$ MINENUMSIZE'. Możesz także zadeklarować 'BusType' jako' DWORD' i typować go na 'STORAGE_BUS_TYPE'. –