Привязка к событиям Windows
Функция TranslateASPI32Address
В операционных системах Windows все подключенные устройства (монитор, видеоадаптер, клавиатура, мышь и др.) распределены в виде иерархического дерева устройств, представленного в виде узлов DEVNODE. Это гораздо упрощает работу с устройствами и позволяет применить автоматический поиск новых устройств и их инициализацию в системе посредством технологии Plug and Play (PnP). Каждый раз при добавлении какого-либо нового устройства в систему или его удалении, происходит перераспределение соответствующего узла DEVNODE и далее вызывается специальное системное событие Windows изменения конфигурации установленного оборудования WM_DEVICECHANGE. При необходимости это событие можно обработать в своей программе. Функция TransiateASPI32Address в случае применения интерфейса ASPI позволяет связать любые изменения в узлах DEVNODE с распределением устройств. Поскольку такие изменения узлов DEVNODE вызывают сообщение Windows WM_DEVICECHANGE, то можно с помощью функции TransiateASPI32Address связать исходные адреса ASPI с технологией PnР И событием WM_DEVICECHANGE. Данная функция не может использоваться в системе Windows NT, поскольку в последней отсутствует поддержка РпР. Записать эту функцию можно следующим образом: BOOL TranslateASPI32Address(PDWORD pdwPath, PDWORD pdvDEVNODE);
Рассмотрим используемые в функции аргументы:
- pdwPath
Здесь надо указать путь для устройства, работающего с интерфейсом ASPI. Это значение состоит из трех составляющих: номера нужного контроллера (Hald), идентификационного номера нужного устройства (Target) и логического номера устройства на шине (Lun). Все три значения должны быть запакованы в тип DWORD. Например, значение 0X00HHTTLL содержит путь к устройству, где поле нн является номером контроллера, поле TT представляет номер устройства, a LL является ло¬гическим номером (адресом). Если значения TT и LL равны 0xFF, то будет указан путь к контроллеру, так как каждый контроллер имеет в системе собственный узел DEVNODE.
- pdwDEVNODE
Сюда помещается указатель на DWORD, содержащий идентификатор узла DEVNODE. Если это значение равно 0, то трансляция происходит от ин¬терфейса ASPI на узел DEVNODE. ЕСЛИ значение ненулевое, то происходит трансляция (передача) от узла DEVNODE на интерфейс ASPI.
В случае успешного выполнения, функция TransiateASPI32Address возвратит TRUE, а в случае ошибки — FALSE.
В следующем примере функция проверяет наличие сообщения WM_DEVICECHANGE и связывает его с адресатом интерфейса ASPI.
Листинг 5.1. Пример использования фнукции TransiateASPI32Address на Visual C++
He забудьте включить файл dbt.h в вашу программу. Кроме того, следует учесть, что в исходных текстах программ для Visual C++ системные файлы, т. е. встроенные в языковую оболочку, необходимо брать в угловые скобки (это нужно сделать и для dbt.h), а все остальные файлы заключают в двойные кавычки.
Аналогичный код, реализованный на языке Visual Basic, не приводится, так как он не является необходимым решением для этого языка программирования.
2021-04-01
Google сообщил о запуске проекта Dunant
Проект Dunant, начатый в 2018 году, был запущен в эксплуатацию. Трансатлантический интернет-кабель соединяет США и континентальную Европу. Общая протяженность...
подробнее2020-04-06
Новшества в обновленной Windows 10
Корпорация Microsoft завершила разработку обновления, в котором добавлено множество функций. Обновление содержит как доработку уже имеющихся систем, так...
подробнее