Есть ли простой и эффективный способ получить список всех USB-устройств в C # или C / C ++?

0

Я должен сделать программу, которая контролирует порты USB и когда USB-устройство подключено (джойстик, флеш-накопители, мышь, ecc...) Я получаю уникальный идентификатор (deviceid или что-то еще будет хорошо).
Сначала я попытался с помощью С# использовать классы system.management и каждый раз запрашивать класс cim_logicaldevice, чтобы подключить новое устройство. Некоторое устройство вернуло больше строк с DeviceID, но это не проблема. Проблема в том, что память, занимаемая программой (в диспетчере задач), постоянно растет. Это исходный код:
http://pastebin.com/dQv3cMQC

Есть ли способ избежать роста использования памяти?
Я должен сделать эту программу в C++ или С#, и она должна быть максимально эффективной (потому что ее нужно открывать навсегда).

  • 0
    просто несколько заметок. Примечание 1: диспетчер задач не очень точен в отслеживании памяти. Примечание 2: рассмотрите возможность включения одноразового объекта в использование (DisposableObject obj = new DisposableObject ()) {} вместо непосредственного вызова Dispose. Примечание 3: вызов GC только для целей отладки, полная сборка GC выполняется с помощью 3 шага GC.Collect ( ); GC.WaitForPendingFinalizer (); GC.Collect ();
  • 0
    используя консоль для отслеживания количества используемой памяти, мне кажется, что память довольно стабильна
Показать ещё 4 комментария
Теги:
usb
wmi

1 ответ

0

Я бы рекомендовал посмотреть образец USBView в WDK. Если вы не знакомы с этим, просто запустите его - этот инструмент просматривает все дерево USB в системе и распечатывает информацию и списки дескрипторов для каждого устройства.

В вашем случае я бы начал с функции RefreshTree() в этом примере, затем вы можете следовать этому коду, чтобы узнать, как он перечисляет контроллеры, концентраторы и, наконец, устройства. Для каждого найденного устройства вы можете посмотреть на bInterfaceClass в дескрипторах интерфейса, чтобы узнать, какие типы интерфейсов он рекламирует.

Самый простой способ получить исходный код этого примера - установить 7.1.0 WDK, который в настоящее время доступен здесь: http://www.microsoft.com/en-us/download/details.aspx?id=11800

Ещё вопросы

Сообщество Overcoder
Наверх
Меню