En mi aplicación (Delphi), necesito enumerar todos los dispositivos de almacenamiento USB. Pueden ser memorias flash o unidades de almacenamiento externo.Delphi - ¿Cómo obtener la lista de unidades de memoria extraíbles y memorias USB extraíbles?
hay un componente Jvcl
JvDriveCombo
, y tiene la propiedad DriveType
- el problema es si selecciono DriveType := Fixed
entonces, además de la unidad externa, que también enumera las unidades internas (C:\
, D:\
etc). Sin embargo, solo quiero enumerar las unidades externas.
Creo que hay una función DeviceIoControl (la vi en MSDN) pero no tengo idea de cómo usarla.
Me pregunto si alguien me puede ayudar con la forma/código adecuado para enumerar los dispositivos de almacenamiento USB.
Gracias.
EDIT:
me acaba de encontrar algunos ejemplos de código y estoy publicando aquí:
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;
Ahora me gustaría simplemente saber cómo enumerar todas las letras de unidad. ¿Cuál es la función más eficiente?
¡Funciona! gracias por tu problema! –
perfecto, pero es "{$ MINENUMSIZE 4}" realmente necesario? – Peter
@ Peter Bueno, el campo 'BusType' debe ocupar 4 bytes. Normalmente, Delphi asignaría solo tantos bytes como sea necesario para almacenar cualquier valor de la enumeración (en este caso, 1 byte), a menos que especifique el tamaño de enum mínimo con la directiva '$ MINENUMSIZE'. También podría declarar 'BusType' como' DWORD' y encasillarlo en 'STORAGE_BUS_TYPE'. –