RegisterDeviceNotification Возвращает NULL, но уведомления все еще получены - PullRequest
1 голос
/ 18 марта 2009

Я использую RegisterDeviceNotification для отслеживания изменений на устройстве USB, используя событие WM_DEVICECHANGE. Тем не менее, когда я вызываю RegisterDeviceNotification (), он возвращает NULL для дескриптора уведомления, который должен указывать, что это не удалось. Но GetLastError () возвращает ERROR_SUCCESS, и уведомления действительно проходят.
Это вызывает большие проблемы, когда мне позже необходимо отменить регистрацию для уведомлений, а затем заново зарегистрироваться. Поскольку дескриптор, который он возвратил, был НЕДЕЙСТВИТЕЛЕН, я фактически не могу перерегистрировать. Если я попробую, RegisterDeviceNotification () просто зависнет.

Мой код выглядит следующим образом:

DEV_BROADCAST_HANDLE   devBrHdr;

::ZeroMemory( &devBrHdr,sizeof( DEV_BROADCAST_HANDLE ) );
devBrHdr.dbch_size = sizeof( DEV_BROADCAST_HANDLE );
devBrHdr.dbch_devicetype = DBT_DEVTYP_HANDLE;
devBrHdr.dbch_handle = m_hDriver;

m_hDevNotify = ::RegisterDeviceNotification( hWnd,&devBrHdr,DEVICE_NOTIFY_WINDOW_HANDLE );

m_hDriver - дескриптор драйвера, который я открыл ранее при подключении к устройству (USB-сканер штрих-кода).

Есть идеи, что я здесь не так делаю?

1 Ответ

0 голосов
/ 18 марта 2009
  1. Убедитесь, что вы не делаете еще один вызов Win32 API между RegisterDeviceNotification и GetLastError.

  2. Проверьте значение devBrHdr.dbch_hdevnotify. Он должен содержать тот же дескриптор, возвращаемый RegisterDeviceNotification.

  3. Было ли значение m_hDriver получено при вызове CreateFile?

...