WIA Minidriver
Приложения рассматривают устройства windows Image Acquisition (WIA) как иерархическое дерево объектов IWiaItem или IWiaItem2 с корневым элементом, представляющим само устройство. Устройства WIA могут одновременно использоваться несколькими приложениями. Поэтому необходимо, чтобы представление каждого приложения объекта IWiaItem или IWiaItem2 было независимым от представлений другого приложения. Это достигается путем наличия двух разных объектов элементов. Драйвер создает дерево элементов драйвера объектов интерфейса IWiaDrvItem , также называемых элементами драйвера, с помощью методов служб драйверов WIA. Это глобальные объекты, которые драйвер использует для представления внутренних элементов каждого драйвера. Когда приложение создает объект IWiaItem или IWiaItem2 (также называемый элементом приложения), этот объект связывается с соответствующим интерфейсом IWiaDrvItem драйвера в дереве элементов драйвера. Количество ссылок сохраняется в объекте интерфейса IWiaDrvItem в соответствии со следующими правилами:
- Когда драйвер добавляет объект интерфейса IWiaDrvItem в дерево элементов драйвера, число ссылок объекта IWiaDrvItem Interface увеличивается. Обычно это происходит во время IWiaMiniDrv::d rvInitializeWia или при обработке команды WIA_CMD_SYNCHRONIZE.
- Когда драйвер удаляет объект интерфейса IWiaDrvItem из дерева элементов драйвера, количество ссылок объекта IWiaDrvItem Interface уменьшается, а объект интерфейса IWiaDrvItem помечается , чтобы он снова не смог получить доступ к устройству. Обычно это происходит при отключении устройства или удалении элемента. Приложения по-прежнему могут считывать свойства из объекта IWiaItem или IWiaItem2 , даже если соответствующий объект интерфейса IWiaDrvItem был удален из дерева элементов драйвера.
- При создании объекта IWiaItem или IWiaItem2 он связывается с соответствующим объектом интерфейса IWiaDrvItem . Число ссылок объекта интерфейса IWiaDrvItem увеличивается.
- При освобождении объекта IWiaItem или IWiaItem2 связь с соответствующим объектом интерфейса IWiaDrvItem разрывается, а количество ссылок объекта IWiaDrvItem Interface уменьшается.
- Если количество ссылок объекта интерфейса IWiaDrvItem равно нулю, объект интерфейса IWiaDrvItem удаляется. Это относится ко всем объектам интерфейса IWiaDrvItem , включая корневой элемент. Число ссылок объекта интерфейса IWiaDrvItem становится равным нулю, только если ни один элемент приложения не ссылается на него и больше не связан с деревом элементов драйвера.
При использовании этой схемы подсчета ссылок многие объекты IWiaItem или IWiaItem2 могут связываться с одним интерфейсом IWiaDrvItem без помех. Так как каждый IWiaItem или IWiaItem2 содержит собственное хранилище свойств, приложение может продолжать считывать свойства элемента даже после удаления элемента, но никакие операции, требующие доступа к устройству, не будут успешными. Поскольку свойства элемента хранятся в объекте IWiaItem или IWiaItem2 , драйвер должен задать свойства объекта IWiaItem или IWiaItem2 для устройства перед передачей данных.