Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как найти USB-диск в системе?  (Прочитано 7113 раз)
0 Пользователей и 1 Гость смотрят эту тему.
VVIP
Гость
« : 19-01-2004 02:45 » new

Здравствуйте!

Помогите с проблемой: требуется найти USB-диск, подключенный к системе. Операционка Windows XP. Нужно примерно так же как через Мой компьютер/Упарваление/Диспетчер устройств - если выбрать в ветке DiskDrives - USB MassStorage Device, и в его свойствах на закладке "Тома" - получить информацию - узнаем, что этодиск "F:"

Пробовал: GetDriveType с перебором всех доступных (Get DeviceStrings) - не отличить от  жеcтких дисков - тип возвращается DRIVE_FIXED. Не то.

Пробовал через SetupDiGetClassDevs - получается только определить наличие подключенного USB Mass Storage Device, его имя в системе вида \Device\0000072 Как от этого имени определить букву диска, подключенного к системе - Например "F:\"?

C SetupDiGetClassDevs тоже непонятки... Вот кусок кода:

  Flags:=DIGCF_DEVICEINTERFACE or DIGCF_PRESENT;
  ClassGuid:='{4D36E967-E325-11CE-BFC1-08002BE10318}'; // Disk drives
  pClassGuid:=@ClassGuid;
  DeviceInfoSet := SetupDiGetClassDevs(pClassGuid, nil, 0, Flags);
  i:=0;
  while SetupDiEnumDeviceInfo(DeviceInfoSet,  i, pDeviceInfoData) do begin
    if SetupDiGetDeviceRegistryProperty(DeviceInfoSet, pDeviceInfoData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, nil, Buf, BSize, nil) then S:=Buf;
  Inc(i);
end;

Если флаг указать DIGCF_DEVICEINTERFACE or DIGCF_PRESENT, функция SetupDiEnumDeviceInfo возвращает NO_MORE_DATA - не найдено типа таких устройств
Если указать в флагах дополнительно DIGCF_ALLCLASSES или убрать DIGCF_DEVICEINTERFACE - находит устройства DiskDrives
Непонятно.

В MSDN написано, что получить букву диска можно через SetupDiEnumDeviceInterfaces и  SetupDiEnumDeviceInterfaceDetails, но все мои попытки вызова SetupDiEnumDeviceInterfaces для Disk Drives (хоть жестких, хоть USB, хоть CD-ROM - возвращает NO_MORE_DATA - вроде нет у них интерфейсов.

Что я неправильно делаю? Может у кого есть кусок рабочего кода?
Записан
Sacha
Гость
« Ответ #1 : 21-01-2004 01:10 » 

Попробуй перед вызовом процедуры SetupDiEnumDeviceInfo в структуру
pDeviceInfoData^.cbSize (pDeviceInfoData.cbSize, смотря как она у тебя определена) записать значение
SizeOf(SP_INTERFACE_DEVICE_DATA)
должно помочь.
Записан
vvip
Гость
« Ответ #2 : 22-01-2004 09:17 » 

Само собой это делается - просто здесь приведен упрощенный код. Если на задавать cbSize - возвращается ошибка (кажется 6) - невверная структура для сохранения данных. Если бы переменная не была инициализирована - функция бы ВСЕГДА возвращала ошибку (неверная структура) а так - в зависимости от флагов и ошибка другая - нет больше данных.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines