这里有个功能可以实现, 匆匆忙忙写的 ,要下班了 :) 自己看看吧 希望能帮你 type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private FDriveStrings: String; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);function GetDriveString(Index: Integer): string; // Helper method to extract a sub string (given by Index) from FDriveStrings. var Head, Tail: PChar; begin Head := PChar(FDriveStrings); Result := ''; repeat Tail := Head; while Tail^ <> #0 do Inc(Tail); if Index = 0 then begin SetString(Result, Head, Tail - Head); Break; end; Dec(Index); Head := Tail + 1; until Head^ = #0; end; Var I, Count: Integer; DriveMap, Mask: Cardinal; begin DriveMap := GetLogicalDrives; Mask := 1; for I := 0 to 25 do begin if (DriveMap and Mask) <> 0 then Inc(Count); Mask := Mask shl 1; end; Count := GetLogicalDriveStrings(0, nil); SetLength(FDriveStrings, Count); GetLogicalDriveStrings(Count, PChar(FDriveStrings)); For I := 0 To 5 Do Begin ShowMessage(GetDriveString(I)) End; end;
自己看看吧 希望能帮你
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FDriveStrings: String;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);function GetDriveString(Index: Integer): string;
// Helper method to extract a sub string (given by Index) from FDriveStrings.
var
Head, Tail: PChar;
begin
Head := PChar(FDriveStrings);
Result := '';
repeat
Tail := Head;
while Tail^ <> #0 do
Inc(Tail);
if Index = 0 then
begin
SetString(Result, Head, Tail - Head);
Break;
end;
Dec(Index);
Head := Tail + 1;
until Head^ = #0;
end;
Var
I,
Count: Integer;
DriveMap,
Mask: Cardinal;
begin
DriveMap := GetLogicalDrives;
Mask := 1;
for I := 0 to 25 do
begin
if (DriveMap and Mask) <> 0 then
Inc(Count);
Mask := Mask shl 1;
end;
Count := GetLogicalDriveStrings(0, nil);
SetLength(FDriveStrings, Count);
GetLogicalDriveStrings(Count, PChar(FDriveStrings));
For I := 0 To 5 Do
Begin
ShowMessage(GetDriveString(I))
End;
end;
unit Disks;
interfaceuses windows,Messages,SysUtils,Dialogs;
const
Method_Buffered = 0;
File_Any_Access = 0;
File_Device_Mass_Storage = $0000002D;
IOCTL_Storage_Base = File_Device_MASS_Storage;// $002Dtype
// 存储设备的总线类型
pSTORAGE_BUS_TYPE=^STORAGE_BUS_TYPE;
STORAGE_BUS_TYPE =(
BusTypeUnknown = $00,
BusTypeScsi,
BusTypeAtapi,
BusTypeAta,
BusType1394,
BusTypeSsa,
BusTypeFibre,
BusTypeUsb,
BusTypeRAID,
BusTypeMaxReserved = $7F
);// 查询存储设备属性的类型
pSTORAGE_QUERY_TYPe=^STORAGE_QUERY_TYPE;
STORAGE_QUERY_TYPE =(
PropertyStandardQuery = 0, // 读取描述
PropertyExistsQuery, // 测试是否支持
PropertyMaskQuery, // 读取指定的描述
PropertyQueryMaxDefined // 验证数据
);// 查询存储设备还是适配器属性
pSTORAGE_PROPERTY_ID=^PSTORAGE_PROPERTY_ID;
STORAGE_PROPERTY_ID =(
StorageDeviceProperty = 0, // 查询设备属性
StorageAdapterProperty // 查询适配器属性
);// 查询属性输入的数据结构
PSTORAGE_PROPERTY_QUERY=^STORAGE_PROPERTY_QUERY;
STORAGE_PROPERTY_QUERY = packed record
PropertyId:STORAGE_PROPERTY_ID ; // 设备/适配器
QueryType:STORAGE_QUERY_TYPE ; // 查询类型
AdditionalParameters:string[1]; // 额外的数据(仅定义了象征性的1个字节)
end;
// 查询属性输出的数据结构
PSTORAGE_DEVICE_DESCRIPTOR=^STORAGE_DEVICE_DESCRIPTOR;
STORAGE_DEVICE_DESCRIPTOR = packed record
Version:ULONG; // 版本
Size:ULONG; // 结构大小
DeviceType:UCHAR; // 设备类型
DeviceTypeModifier:UCHAR; // SCSI-2额外的设备类型
RemovableMedia:Boolean; // 是否可移动
CommandQueueing:Boolean; // 是否支持命令队列
VendorIdOffset:Ulong; // 厂家设定值的偏移
ProductIdOffset:ULONG; // 产品ID的偏移
ProductRevisionOffset:ULONG; // 产品版本的偏移
SerialNumberOffset:ULONG; // 序列号的偏移
BusType:STORAGE_BUS_TYPE ; // 总线类型
RawPropertiesLength:ULONG; // 额外的属性数据长度
RawDeviceProperties:string[1]; // 额外的属性数据(仅定义了象征性的1个字节)} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
end;function GetDriveProperty(hDevice:Thandle;pDevDesc:PSTORAGE_DEVICE_DESCRIPTOR):Boolean;
function Ctl_Code(DeviceType, FuncNo, Method, Access: integer): integer;implementationfunction Ctl_Code(DeviceType, FuncNo, Method, Access: integer): integer;
begin
Result:= (DeviceType shl 16) or (Access shl 14) or (FuncNo shl 2) or (Method)
end;function GetDriveProperty(hDevice:Thandle;pDevDesc:PSTORAGE_DEVICE_DESCRIPTOR):Boolean;
var
Query:STORAGE_PROPERTY_QUERY; // 查询输入参数
dwOutBytes:Dword; // IOCTL输出数据长度
IOCTL_STORAGE_QUERY_PROPERTY:integer;
begin
// 指定查询方式
IOCTL_STORAGE_QUERY_PROPERTY:=Ctl_Code(IOCTL_STORAGE_BASE, $0500, METHOD_BUFFERED, FILE_ANY_ACCESS);
Query.PropertyId:= StorageDeviceProperty;
Query.QueryType:= PropertyStandardQuery;
Result:=DeviceIoControl(hDevice, // 设备句柄
IOCTL_STORAGE_QUERY_PROPERTY , // 取设备属性信息
@Query,
sizeof(Query), // 输入数据缓冲区
pDevDesc, // 输出数据缓冲区
pDevDesc.Size, // 输出数据长度
dwOutBytes,
nil); // 用同步I/O
end;end.
http://blog.csdn.net/zyxmeng/archive/2005/08/29/467524.aspx