Nella mia applicazione (Delphi), ho bisogno di elencare tutti i dispositivi di archiviazione USB. Questi possono essere sia unità di memoria flash o unità di archiviazione esterne.Delphi - Come ottenere l'elenco dei dischi rigidi e delle chiavette USB rimovibili?
C'è una componente Jvcl
JvDriveCombo
, e ha la proprietà DriveType
- il problema è che se seleziono DriveType := Fixed
poi oltre al disco esterno, elenca anche le unità interne (C:\
, D:\
ecc). Tuttavia, voglio solo elencare le unità esterne.
Credo ci sia la funzione DeviceIoControl (l'ho vista su MSDN) ma non ho idea di come usarla.
Mi chiedo se qualcuno può aiutarmi con il modo corretto/codice per elencare i dispositivi di archiviazione USB?
Grazie.
EDIT:
ho appena trovato alcuni esempi di codice e sto postando qui:
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;
Ora vorrei sapere solo come enumerare tutte le lettere di unità. Qual è la funzione più efficiente?
Works! grazie per il tuo disturbo! –
perfetto, ma "{$ MINENUMSIZE 4}" è davvero necessario? – Peter
@Peter Bene, il campo 'BusType' dovrebbe occupare 4 byte. Normalmente Delphi alloca solo il numero di byte necessario per memorizzare qualsiasi valore dell'enumerazione (in questo caso 1 byte), a meno che non si specifichi la dimensione minima enum con la direttiva '$ MINENUMSIZE'. Si potrebbe anche dichiarare 'BusType' come' DWORD' e convertirlo in 'STORAGE_BUS_TYPE'. –