PDA

Показать полную графическую версию : USB : Автоматическое обнаружение съёмных дисков


hasherfrog
09-12-2004, 18:44
Задача уже не требует решения.

Конфигурация: Windows XP, USB-концентратор (определяется как «универсальный USB концентратор») на 4 порта, к нему цепляются 4 кард-ридера (определяются как «Запоминающее устройство для USB»). В кард-ридеры пихаем MMC-карты, виндовый проводник шустро на них реагирует, моментально открывая окошки автозапуска («Какое действие следует выполнять виндоуз?»). Теперь тоже самое нам надо определить из своей программы – как только карточку вставят, мы должны 1. узнать об этом; 2. определить букву диска. Несмотря на кажущуюся простоту, нас ждёт облом.

Решение было лобовое – отлавливаем WM_DEVICECHANGE и смотрим, что там произошло. Но оказалось, что сообщение об изменении статуса USB-устройства приходит с огромной задержкой (а иногда и вообще не приходит, например, если карточку вытащить). За это время карточку можно раз двадцать вытащить/ставить. Повторяю, виндовый проводник реагирует мгновенно.

Теоретически, траблы можно было бы списать на то, что собственно никакого изменения конфигурации не происходит, ибо диски, соответствующие USB накопителям, никуда не исчезают из системы при вытаскивании MMC (и не появляются, соответственно). Отключения-то не происходит, устройства так и числятся в «Мой компьютер», как, например, дисковод – он же там всегда есть, с дискетой или без. Но тогда бы не приходило бы вообще никаких сообщений. А так – приходят, но с огромной паузой.

В PSDK ясно написано, что
The system broadcasts a set of default device change events to all applications and services. You do not need to register to receive these default events. See the Remarks section in RegisterDeviceNotification for details.

Мысли есть?

Netscaper
10-12-2004, 21:44
А HandlerEx не пробовал?

Netscaper
10-12-2004, 22:18
Ой-ой-ой... Это для сервисов. Но, там же сказано: «Any application with a top-level window can receive basic notifications by processing the WM_DEVICECHANGE message. Applications can use the RegisterDeviceNotification function to register to receive device notifications». Сообщения WM_DEVICECHANGE будут приходить в любом случае. А чтобы получать сообщения типа DBT_DEVICEARRIVAL, надо использовать RegisterDeviceNotification. Там же в примере «Registering for Device Notification» сказано: «The application will receive the WM_DEVICECHANGE message whenever a device interface event notification is sent. Currently, the only events that will be received for device interfaces are DBT_DEVICEARRIVAL and DBT_DEVICEREMOVECOMPLETE». А насколько я понял, тебе надо получать что-то вроде DBT_CONFIGCHANGED.




© OSzone.net 2001-2012