Para unidades montadas con letras de unidad, llame a la función Win32 ShellApi SHGetSpecialFolderLocation(0, CSIDL_DRIVES, Drives)
. Declare la variable local Drives: PItemIdList
. Esto es en la unidad llamada ShellAPI
en delphi. Esperemos que exista una unidad similar en FreePascal.
Para las unidades desmontadas, tendrá que enumerar los controladores del dispositivo por la clase de controlador de dispositivo de GUID_DEVINTERFACE_DISK
de alguna manera. El SetupAPI de Windows debería poder ayudarte.
Puede obtener SetupAPI.pas de los proyectos JEDI JCL o 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;
A completa ejemplo DELPHI de trabajo incluyendo el código anterior y las unidades de API JEDI apropiado es here. Puedes adaptarlo a pascal y lazarus gratis con bastante facilidad.
+1 'esta pregunta muestra el esfuerzo de investigación' :-) ¿Has mirado el código fuente de' TDriveComboBox' bajo los componentes de Win3.1? – Johan
Tengo una fuerte creencia de que kernel usa la numeración de contiguos para los discos phy, así que solo enumera hasta la falla – OnTheFly