Событие DBT_DEVICEARRIVAL не приходит!
От: Buratino  
Дата: 19.03.04 14:20
Оценка:
В приложении нужно анализировать, если на ходу подключается USB видеокамера.
При подключении происходит специфичное для Win2k&XP событие DBT_DEVNODES_CHANGED, причем независимо от того, был ли вызов RegisterDeviceNotification или нет (при вкл.2 раза, при откл. 1 раз). Почему же не приходит общее для всех Win DBT_DEVICEARRIVAL??
 DEV_BROADCAST_DEVICEINTERFACE DevDesc;
  DevDesc.dbcc_size= sizeof(DevDesc);
  DevDesc.dbcc_devicetype= DBT_DEVTYP_DEVICEINTERFACE;
  DevDesc.dbcc_classguid= CLSID_VideoInputDeviceCategory;
  DevDesc.dbcc_name[1]= 0;
  
  DevNotify= NULL;
  DevNotify= RegisterDeviceNotification(Handle,
                                        &DevDesc,
                                        DEVICE_NOTIFY_WINDOW_HANDLE
                                        );
//--------------------------------------------------------------------------------------
/*
class TMainForm : public TForm
{
__published:
...
private:    
...
public:
...
protected:
        HDEVNOTIFY DevNotify;
        BEGIN_MESSAGE_MAP
                VCL_MESSAGE_HANDLER(WM_DEVICECHANGE, TMessage, DeviceChanged)
        END_MESSAGE_MAP(TForm)
        void __fastcall DeviceChanged(TMessage);
};
*/


void __fastcall TMainForm::DeviceChanged(TMessage msg)
{

    switch(msg.WParam)
    {
      case DBT_DEVICEARRIVAL://The event never occured
        //processing 
        break;
      case DBT_DEVNODES_CHANGED: //Win2k&XP specific event
        //processing 
        break;
    }
}


//--------------------------------------------------------------------------------------

  if (!DevNotify) UnregisterDeviceNotification(DevNotify);
Re: Событие DBT_DEVICEARRIVAL не приходит!
От: Valid Украина  
Дата: 22.09.04 15:34
Оценка:
Здравствуйте, Buratino, Вы писали:


B>В приложении нужно анализировать, если на ходу подключается USB видеокамера.

B>При подключении происходит специфичное для Win2k&XP событие DBT_DEVNODES_CHANGED, причем независимо от того, был ли вызов RegisterDeviceNotification или нет (при вкл.2 раза, при откл. 1 раз). Почему же не приходит общее для всех Win DBT_DEVICEARRIVAL??

У меня та же самая фигня, кто-нить это поборол ?
Re: Событие DBT_DEVICEARRIVAL не приходит!
От: .Mistery Беларусь  
Дата: 22.09.04 16:12
Оценка:
Здравствуйте, Buratino, Вы писали:

Да есть с этим непонятка, я тоже не смог поймать DBT_DEVICEARRIVAL и так и не понял в чем проблема. Выкручивался через WM_DEVICECHANGE.

Удачи!
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re: Событие DBT_DEVICEARRIVAL не приходит!
От: Аноним  
Дата: 27.10.06 12:08
Оценка:
Здравствуйте, Buratino, Вы писали:


B>В приложении нужно анализировать, если на ходу подключается USB видеокамера.

B>При подключении происходит специфичное для Win2k&XP событие DBT_DEVNODES_CHANGED, причем независимо от того, был ли вызов RegisterDeviceNotification или нет (при вкл.2 раза, при откл. 1 раз). Почему же не приходит общее для всех Win DBT_DEVICEARRIVAL??
B>....
Та же самая проблема . Реанимирую вопрос. Может ли кто-нибудь помочь ? Кто виноват? Что делать?
Cпасибо.
Re[2]: Событие DBT_DEVICEARRIVAL не приходит!
От: Sergei I. Gorelkin Россия  
Дата: 27.10.06 19:22
Оценка:
Здравствуйте, Аноним, Вы писали:

<skipped>

Builder, говорите...
Во-первых, чему у него равно sizeof(DEV_BROADCAST_DEVINTERFACE)? Должно быть 0x20.
Во-вторых, правильный ли GUID? GUID класса устройств и GUID интерфейса драйвера, который можно открыть — это отнюдь не одно и то же.
Работает ли с этим GUID стандартный метод перечисления устройств (SetupDiClassDevs -> SetupDiEnumDeviceInterfaces -> SetupDiGetDeviceInterfaceDetail) в то время, как нужная железяка подключена?
В третьих, не нужно ловить WM_DEVICECHANGE на VCL форму. Создайте отдельное невидимое окно (можно AllocateHwnd / DeallocateHwnd)...
Re[3]: Событие DBT_DEVICEARRIVAL не приходит!
От: Аноним  
Дата: 30.10.06 08:40
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Здравствуйте, Аноним, Вы писали:


SIG>Во-первых, чему у него равно sizeof(DEV_BROADCAST_DEVINTERFACE)? Должно быть 0x20.

SIG>Во-вторых, правильный ли GUID? GUID класса устройств и GUID интерфейса драйвера, который можно открыть — это отнюдь не одно и то же.
SIG>Работает ли с этим GUID стандартный метод перечисления устройств (SetupDiClassDevs -> SetupDiEnumDeviceInterfaces -> SetupDiGetDeviceInterfaceDetail) в то время, как нужная железяка подключена?
SIG>В третьих, не нужно ловить WM_DEVICECHANGE на VCL форму. Создайте отдельное невидимое окно (можно AllocateHwnd / DeallocateHwnd)...
Моя проблема аналогична , но не тождественна описанной в корневом сообщении.
Мне нужно поймать появление USB устройства( WM_DEVICECHANGE в отдельном невидимом окне ), причем про само устройство априори ничего не известно. Возможно , что соответствующий драйвер не установлен. Нужная мне информация — это VID и PID устройства.
Спасибо
Re[4]: Событие DBT_DEVICEARRIVAL не приходит!
От: Alexey Frolov Беларусь  
Дата: 30.10.06 09:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Моя проблема аналогична , но не тождественна описанной в корневом сообщении.

А>Мне нужно поймать появление USB устройства( WM_DEVICECHANGE в отдельном невидимом окне ), причем про само устройство априори ничего не известно. Возможно , что соответствующий драйвер не установлен. Нужная мне информация — это VID и PID устройства.
А>Спасибо

Ну а сама проблема то в чем? Что не получилось?
Re[5]: Событие DBT_DEVICEARRIVAL не приходит!
От: Аноним  
Дата: 30.10.06 13:54
Оценка:
Здравствуйте, Alexey Frolov, Вы писали:

AF>Ну а сама проблема то в чем? Что не получилось?


Приходит немерено сообщений WM_DEVICECHANGE с wParam= DBT_DEVNODES_CHANGED.
В MSDN :

Remarks
There is no additional information about which device has been added to or removed from the system. Applications that require more information should register for device notification.
Мне же нужны VID и PID устройства. Устройства различные ( нет списка ). Возможен вариант , что драйвер устройства еще не установлен.
Я не знаю в какую сторону рыть .
Спасибо
Re[6]: Событие DBT_DEVICEARRIVAL не приходит!
От: Sergei I. Gorelkin Россия  
Дата: 30.10.06 17:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Мне же нужны VID и PID устройства. Устройства различные ( нет списка ). Возможен вариант , что драйвер устройства еще не установлен.

А>Я не знаю в какую сторону рыть .
А>Спасибо

При такой постановке задачи надо рыть в сторону DDK. В его составе есть утилита UsbView, ее исходники дают ответ на многие вопросы...
Re[6]: Событие DBT_DEVICEARRIVAL не приходит!
От: Alexey Frolov Беларусь  
Дата: 31.10.06 14:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Приходит немерено сообщений WM_DEVICECHANGE с wParam= DBT_DEVNODES_CHANGED.

А>В MSDN :

Понятно, вам нужно подписаться на сообщения WM_DEVICECHANGE с wParam= DBT_DEVICEARRIVAL.


  DEV_BROADCAST_DEVICEINTERFACE DevDesc;
  DevDesc.dbcc_size = sizeof(DevDesc);
  DevDesc.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
  DevDesc.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;
  
  DevNotify = RegisterDeviceNotification(Handle, &DevDesc, DEVICE_NOTIFY_WINDOW_HANDLE);


GUID_DEVINTERFACE_USB_DEVICE определен в файле <usbiodef.h> из DDK
либо можете сами вставить его в программу, вот

const GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.