RegisterDeviceNotification возвращает NULL, но уведомления все еще получаются

Я использую RegisterDeviceNotification, чтобы следить за изменениями на USB-устройстве, используя событие WM_DEVICECHANGE. Однако, когда я вызываю RegisterDeviceNotification (), он возвращает NULL для дескриптора уведомления, что должно указывать на сбой. Но GetLastError () возвращает ERROR_SUCCESS, и уведомления действительно проходят.
Это вызывает настоящие проблемы, когда позже мне нужно отменить регистрацию для уведомлений, а затем повторно зарегистрироваться. Поскольку возвращенный дескриптор был ПУСТО (NULL), я не могу перерегистрироваться. Если я попробую, 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).

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


person Adam Haile    schedule 18.03.2009    source источник


Ответы (1)


  1. Убедитесь, что вы не выполняете еще один вызов Win32 API между RegisterDeviceNotification и GetLastError.

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

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

person Judge Maygarden    schedule 18.03.2009
comment
dbch_hdevnotify также имеет значение NULL после возврата RegisterDeviceNotification. m_hDriver БЫЛ получен в результате вызова CreateFile ... Это имеет значение ?? - person Adam Haile; 18.03.2009