Как узанть букву подключения USB-диска
От: vvip  
Дата: 19.01.04 05:22
Оценка:
Здравствуйте!

Подскажите как узнать подключен ли к системе 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 получить логический диск?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.