реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Отследить подключение USB устройства, C Builder 2007
toweroff
сообщение Oct 18 2013, 13:20
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Добрый день

Сейчас есть программа, которая ищет в списке USB устройств свое, захватывает интерфейс, работает с ним и "отпускает"
Теперь хотелось бы, чтобы можно было подключить несколько устройств одновременно и, соответственно, для каждого устройства - своя копия программы
В такой ситуации уже не обойтись без обработчика системных событий. Подскажите, как это правильно делается?
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Oct 18 2013, 14:07
Сообщение #2


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(toweroff @ Oct 18 2013, 08:20) *
Добрый день

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

Одна программа мониторит подключения и запускает обслуживающие программы
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 18 2013, 14:19
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(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
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 18 2013, 16:16
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Разобрался, но не совсем...

Везде в просторах гугла 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

Можно закрыть
Go to the top of the page
 
+Quote Post
rudy_b
сообщение Oct 18 2013, 19:11
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458



Цитата(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.

И вот тут полезное.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 18 2013, 20:46
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



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

потому что через сам драйвер будет гораздо информативнее
я так понял, если виндовые драйвера, то оно да, скажут все, что нужно (хотя тоже, с флешкой... 8000 и еще 3 раза 07... что там происходит? хрен его знает - DBT_DEVNODES_CHANGED... зачем? к чему?)
Если драйвера другие - нужно пользоваться их инструментами, как прикрутить - другой вопрос
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01433 секунд с 7
ELECTRONIX ©2004-2016