在我的Delphi应用中,我需要列出所有USB存储设备,这些设备可以是闪存盘或外部存储驱动器。
有一个Jvcl组件JvDriveCombo,它有DriveType属性。问题是,如果我选择DriveType:= Fixed,那么除了外部驱动器之外,它还会列出内部驱动器(如C:\,D:\等)。但我只想列出外部驱动器。
我相信有DeviceIoControl函数(我在MSDN上看到过),但我不知道如何使用它。
我想知道是否有人能够帮助我找到正确的方法/代码来列出USB存储设备?
谢谢。
编辑:
我刚刚找到了一些示例代码,并将其发布在此处:
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;
现在我只想知道如何枚举所有的驱动器盘符,哪个函数是最有效的?
BusType
字段应该占用4个字节。通常情况下,Delphi只会分配足够存储枚举值的字节数(在这种情况下为1个字节),除非您使用$MINENUMSIZE
指令指定最小枚举大小。您还可以将BusType
声明为DWORD
并将其强制转换为STORAGE_BUS_TYPE
。 - Ondrej Kelle