Поделиться через


Режимы передачи

Интерфейсы неподвижных изображений определяют два режима передачи : режим состояния и режим данных. Когда клиент COM-интерфейса IStillImage вызывает IStillImage::CreateDevice для получения доступа к устройству с неподвижным изображением, он указывает один (или оба) режима передачи. Несколько клиентов могут открывать устройство в режиме состояния, но только одному клиенту за раз разрешено открывать устройство в режиме данных.

Монитор событий неподвижного изображения открывает устройства в режиме состояния. Как правило, API-интерфейсы получения изображений открывают устройства в режиме данных, но не всегда.

После открытия клиентом устройства в режиме данных монитор событий сохраняет последующие события устройства с неподвижным изображением во внутренней очереди. Если клиент вызывает IStiDevice::Subscribe, он может считывать события из очереди, вызвав IStiDevice::GetLastNotificationData. После закрытия клиентом устройства последующие полученные события приводят к тому, что монитор событий снова пытается запустить зарегистрированное приложение.

Значения двух режимов передачи полностью зависят от мини-драйвера пользовательского режима устройства. Интерфейсы IStillImage и IStiDevice позволяют вызывать все методы в любом режиме.

Мини-driver может определить режим, в котором он был открыт, вызвав метод IStiDevice::GetLastNotificationData. Мини-накопители должны запрещать клиенту выполнять передачу данных, если клиент запрашивал только режим состояния при получении доступа к устройству.

Важно отметить, что устройства обычно открываются в режиме состояния в течение относительно длительного времени (например, монитор событий отслеживает события устройства), в то время как они открываются в режиме данных в течение относительно короткого времени (например, для чтения на изображении). Хотя архитектура неподвижного образа позволяет только одному клиенту одновременно открывать устройство в режиме данных, драйверу может потребоваться установить дополнительные ограничения на доступ к устройству.

Например, при написании драйвера для устройства, подключенного к последовательному порту, может потребоваться вызвать CreateFile из метода IStiUSD::LockDevice драйвера, если устройство было открыто в режиме состояния. Это запретит другим приложениям использовать порт (который может поддерживать другие устройства) во время получения сведений о состоянии с устройства.

Для устройств, подключенных к выделенным портам, таким как устройства SCSI или USB-шины, обычно допускается вызов CreateFile из IStiUSD::Initialize , если указан режим состояния, так как устройство и порт всегда будут выделены для одного клиента.

Когда устройство открывается в режиме данных, CreateFile обычно вызывается из IStiUSD:Initialize, независимо от типа шины.