Đối với ổ đĩa gắn với các ký tự ổ đĩa, hãy gọi hàm Win32 ShellApi SHGetSpecialFolderLocation(0, CSIDL_DRIVES, Drives)
. Khai báo biến địa phương Drives: PItemIdList
. Đây là đơn vị có tên ShellAPI
trong delphi. Hy vọng rằng một đơn vị tương tự tồn tại trong FreePascal.
Đối với các ổ đĩa chưa được gắn kết, bạn sẽ phải liệt kê các trình điều khiển thiết bị theo lớp trình điều khiển thiết bị là GUID_DEVINTERFACE_DISK
bằng cách nào đó. SetupAPI của cửa sổ sẽ có thể giúp bạn.
Bạn có thể lấy SetupAPI.pas từ dự án JEDI JCL hoặc JEDI API.
procedure GetListFromSetupApi(aStrings: TStrings);
var
iDev: Integer;
RegDataType: Cardinal;
reqSize:DWORD;
prop:Cardinal;
pszData:PByte;
hinfo: HDEVINFO;
bResult: BOOL;
devinfo: SP_DEVINFO_DATA;
dwRequiredSize,dwPropertyRegDataType,dwAllocSz:Cardinal;
begin
LoadSetupApi;
if not Assigned(SetupDiGetClassDevs) then
Exit;
hinfo := SetupDiGetClassDevs(@GUID_DEVINTERFACE_DISK, nil, HWND(nil),
DIGCF_DEVICEINTERFACE or DIGCF_PRESENT or DIGCF_PROFILE);
devinfo.ClassGuid.D1 := 0;
devinfo.ClassGuid.D2 := 0;
devinfo.ClassGuid.D3 := 0;
devinfo.cbSize := SizeOf(SP_DEVINFO_DATA);
iDev := 0;
while SetupDiEnumDeviceInfo(hinfo, iDev, devinfo) do
begin
dwRequiredSize := 0;
prop := SPDRP_PHYSICAL_DEVICE_OBJECT_NAME;
// results on my computer:
// \Device\Ide\IAAStorageDevice-1
// \Device\Ide\IAAStorageDevice-2
// \Device\0000008a (this one is a usb disk, use SPDRP_ENUMERATOR_NAME, returns USBSTOR)
// prop := SPDRP_ENUMERATOR_NAME; // results: IDE, USBSTOR, or other bus type.
// prop := SPDRP_LOCATION_INFORMATION; // a number like 1,2,3.
{ SPDRP_DRIVER - driver guid }
{ Get Size of property }
SetupDiGetDeviceRegistryProperty
(hinfo,
devinfo,
prop,
dwPropertyRegDataType,
nil,
0,
dwRequiredSize); { dwRequiredSize should be around 88 after this point, in unicode delphi }
if dwRequiredSize>0 then begin
dwAllocSz := dwRequiredSize+4;
pszData := AllocMem(dwAllocSz);
bResult := SetupDiGetDeviceRegistryProperty
(hinfo,
devinfo,
prop,
dwPropertyRegDataType,
pszData,
dwAllocSz,
dwRequiredSize);
aStrings.Add(IntToStr(aStrings.Count)+': '+PChar(pszData));
FreeMem(pszData);
end;
inc(iDev);
end;
SetupDiDestroyDeviceInfoList(hinfo);
end;
Ví dụ DELPHI làm việc đầy đủ bao gồm mã trên và các đơn vị API JEDI thích hợp là here. Bạn có thể thích nghi nó với pascal và lazarus miễn phí khá dễ dàng.
+1 'câu hỏi này cho thấy nỗ lực nghiên cứu' :-) Bạn đã xem mã nguồn cho' TDriveComboBox' trong các thành phần Win3.1 chưa? – Johan
Tôi có niềm tin mạnh mẽ về những gì hạt nhân sử dụng số lượng contiguos cho đĩa phy, vì vậy bạn chỉ liệt kê cho đến khi thất bại – OnTheFly