Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   USB : Автоматическое обнаружение съёмных дисков (http://forum.oszone.net/showthread.php?t=42285)

hasherfrog 09-12-2004 18:44 278994

USB : Автоматическое обнаружение съёмных дисков
 
Задача уже не требует решения.

Конфигурация: 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 279286

А HandlerEx не пробовал?

Netscaper 10-12-2004 22:18 279297

Ой-ой-ой... Это для сервисов. Но, там же сказано: «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.


Время: 01:52.

Время: 01:52.
© OSzone.net 2001-