Во-первых для стабильной работы драйвера и приложений по завершении необходимо :
- отсоединять устройство
Код: Выделить всё
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
- убивать окно драйвера (при закрытии основного или родительского окна необязательно)
Потому он и ругался, что окно драйвера не убилось (возможно не был указан родитель) и повторное подсоединение к драйверу уже невозможно, а старое окно уже не убьешь, т.к. его Handle где-то затерялся.
Для перечисления устройств можно использовать
- WM_CAP_DRIVER_GET_CAPS
- WM_CAP_DRIVER_GET_NAME
Которые возвращают информацию о имени и параметрах. Т.е. можно подсоединится к драйверу по индексу, получить инфу - отсоединится и т.д. пока SendMessage <> 0.
Еще способ перечисления (enumerate) девайсов API функция, которая позволяет получить описание установленных в системе устройств для захвата видео
capGetDriverDescription(WORD wDriverIndex, LPSTR lpszName, INT cbName, LPSTR Ver, INT cbVer);
- wDriverIndex – индекс драйвера от 0 до 9.
- lpszName – указатель на буфер куда будет помешено имя драйвера устройства.
- cbName – размер буфера для имени драйвера устройства.
- lpszVer – указатель на буфер куда будет помещена версия драйвера устройства.
- cbVer – размер буфера для версии драйвера устройства.
Достаточно перебрать значение индексов от 0 до 9. Если не на один индекс не было положительного результата, значит, в системе нет драйверов устройств, позволяющих осуществлять захват видео.