Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отследить подключение USB устройства
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
toweroff
Добрый день

Сейчас есть программа, которая ищет в списке USB устройств свое, захватывает интерфейс, работает с ним и "отпускает"
Теперь хотелось бы, чтобы можно было подключить несколько устройств одновременно и, соответственно, для каждого устройства - своя копия программы
В такой ситуации уже не обойтись без обработчика системных событий. Подскажите, как это правильно делается?
ar__systems
Цитата(toweroff @ Oct 18 2013, 08:20) *
Добрый день

Сейчас есть программа, которая ищет в списке USB устройств свое, захватывает интерфейс, работает с ним и "отпускает"
Теперь хотелось бы, чтобы можно было подключить несколько устройств одновременно и, соответственно, для каждого устройства - своя копия программы
В такой ситуации уже не обойтись без обработчика системных событий. Подскажите, как это правильно делается?

Одна программа мониторит подключения и запускает обслуживающие программы
toweroff
Цитата(ar__systems @ Oct 18 2013, 18:07) *
Одна программа мониторит подключения и запускает обслуживающие программы

Вы не поняли. Вопрос в том, как именно мониторить
Пока нагуглил такое:

хидер
Код
private:    // User declarations
    void virtual __fastcall WMDeviceChange(TMessage &Message);
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);

BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMDeviceChange);
END_MESSAGE_MAP(TForm);


и С-файл
Код
void __fastcall TForm1::WMDeviceChange(TMessage& Message)
{
    if (Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000)
    {
        // ваши действия
    }
    else
        TForm1::Dispatch(&Message);
}


все компилируется, но при запуске ругается в месте BEGIN_MESSAGE_MAP на StackOverflow
и пока не могу понять почему, кто там его так жутко сожрал sad.gif
toweroff
Разобрался, но не совсем...

Везде в просторах гугла WParam == 0x8000 (DBT_DEVICEARRIVAL), то есть устройство подключено и прошло энумерацию
События я ловлю в количестве 5шт при подключении и 1шт - при отключении устройства
Странно, но везде значение WParam - 0x07!



Еще наблюдение. Подключая USB накопитель, событие DBT_DEVICEARRIVAL я все-таки ловлю.
Переходники всякие USB-COM, J-Link, ULINK2, USB-Blaster - нет такого события sad.gif
как все-таки однозначно определить завершение энумерации и присутствие USB устройства в системе?

Кстати, http://msdn.microsoft.com/en-us/library/wi...0(v=vs.85).aspx ничего не говорит о WParam==0x07


И еще дополнение.
Т.к. мое устройство работает от LibUsb, то и копать нужно оттуда
Если кому будет нужно - http://www.cs.unm.edu/~hjelmn/libusb_hotpl...pi/hotplug.html

Можно закрыть
rudy_b
Цитата(toweroff @ Oct 18 2013, 20:16) *
...
Странно, но везде значение WParam - 0x07!
...
Кстати, http://msdn.microsoft.com/en-us/library/wi...0(v=vs.85).aspx ничего не говорит о WParam==0x07

Почему не говорит? как раз говорит
DBT_DEVNODES_CHANGED 0x0007 -A device has been added to or removed from the system.

И вот тут полезное.
toweroff
Цитата(rudy_b @ Oct 18 2013, 23:11) *
Почему не говорит?

потому что через сам драйвер будет гораздо информативнее
я так понял, если виндовые драйвера, то оно да, скажут все, что нужно (хотя тоже, с флешкой... 8000 и еще 3 раза 07... что там происходит? хрен его знает - DBT_DEVNODES_CHANGED... зачем? к чему?)
Если драйвера другие - нужно пользоваться их инструментами, как прикрутить - другой вопрос
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.