Здравствуйте!
Подскажите как узнать подключен ли к системе USB-диск и определить букву каким диском он встал в систему?
Что я делал (пишу на дельфях), код упрощен, только чтобы понять основные моменты. Привожу схематично:
const ClassGuid: TGUID = '{4D36E967-E325-11CE-BFC1-08002BE10318}'; // disk drives
var
pClassGuid: pointer;
DeviceInfoData: PSP_DEVINFO_DATA;
DeviceInterfaceData: PSP_DEVICE_INTERFACE_DATA;
begin
pClassGuid := @ClassGuid;
(1) DeviceInfoSet := SetupDiGetClassDevs(pClassGuid, nil, 0, {DIGCF_ALLCLASSES or }DIGCF_DEVICEINTERFACE or DIGCF_PRESENT);
DeviceInfoData^.cbSize := sizeof(DeviceInfoData);
DeviceInterfaceData^.cbSize := sizeof(DeviceInterfaceData);
i:=0;
(2) while SetupDiEnumDeviceInfo(DeviceInfoSet, i, pDeviceInfoData) do begin
SetupDiGetDeviceRegistryProperty(DeviceInfoSet, pDeviceInfoData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, nil, Buf, BSize, nil);
(3) SetupDiGetDeviceRegistryProperty(DeviceInfoSet, pDeviceInfoData, SPDRP_ENUMERATOR_NAME , nil, Buf, BSize, nil);
(4) while SetupDiEnumDeviceInterfaces(DeviceInfoSet, NIL, pClassGuid, j, pDeviceInterfaceData) do begin
Inc(j);
end;
Inc(i);
end;
Что происходит:
1. Если в (1) я указываю только DIGCF_DEVICEINTERFACE or DIGCF_PRESENT, то последующий вызов (2) возвращает
ERROR_NO_MORE_ITEMS, если указываю еще и DIGCF_ALLCLASSES — возвращается список, в т.ч и нужных мне disk drives
2. Если в (1) не указываю, конкретный ClassGuid, но в качестве Enumerator указываю 'USBSTOR' или 'IDE' — их я получил
вызовом (3), когда в (1) указывал с флагом DIGCF_ALLCLASSES — то (2) возвращает ошибку ERROR_INVALID_HANDLE
3. В любом случае (4) всегда возвращает ERROR_NO_MORE_ITEMS, так что до SetupDiGetDeviceInterfaceDetail вообще дело не доходит,
и получить путь по которому диск подключен я не могу.
Что ж я не так делаю то? Может у кого есть работающий кусок кода?
Как можно (и можно ли) из строки получаемой SPDRP_PHYSICAL_DEVICE_OBJECT_NAME -> \Device\0000072 получить логический диск?