Modos de transferência

As interfaces de imagem ainda definem dois modos de transferência – modo de status e modo de dados. Quando um cliente da interface COM IStillImage chama IStillImage::CreateDevice para obter acesso a um dispositivo de imagem parada, ele especifica um (ou ambos) dos modos de transferência. Vários clientes podem abrir um dispositivo no modo status, mas apenas um cliente por vez tem permissão para abrir um dispositivo no modo de dados.

O monitor de eventos de imagem ainda abre dispositivos no modo status. Normalmente, mas nem sempre, as APIs de aquisição de imagem abrem dispositivos no modo de dados.

Depois que um cliente abrir um dispositivo no modo de dados, o monitor de eventos armazenará eventos de dispositivo de imagem ainda subsequentes em uma fila interna. Se o cliente chamar IStiDevice::Subscribe, ele poderá ler eventos da fila chamando IStiDevice::GetLastNotificationData. Depois que o cliente fecha o dispositivo, os eventos recebidos posteriormente fazem com que o monitor de eventos tente iniciar novamente um aplicativo registrado.

Os significados dos dois modos de transferência dependem inteiramente do minidriver do modo de usuário do dispositivo. As interfaces IStillImage e IStiDevice permitem que todos os métodos sejam chamados em qualquer modo.

Um minidriver pode determinar o modo no qual foi aberto chamando IStiDevice::GetLastNotificationData. Os minidrivers devem proibir um cliente de executar transferências de dados se o cliente solicitou apenas status modo ao obter acesso ao dispositivo.

É importante observar que os dispositivos normalmente são abertos no modo status por um tempo relativamente longo (por exemplo, o monitor de eventos observa eventos de dispositivo), enquanto eles são abertos no modo de dados por um tempo relativamente curto (por exemplo, para ler em uma imagem). Embora a arquitetura de imagem ainda permita que apenas um cliente de cada vez abra um dispositivo no modo de dados, pode ser necessário que um driver coloque mais restrições no acesso ao dispositivo.

Por exemplo, se você estiver escrevendo um driver para um dispositivo conectado a uma porta serial, talvez queira chamar CreateFile de dentro do método IStiUSD::LockDevice do driver se o dispositivo tiver sido aberto no modo status. Isso proibirá outros aplicativos de usar a porta (que pode dar suporte a outros dispositivos) enquanto status informações estiverem sendo obtidas do dispositivo.

Para dispositivos conectados a portas dedicadas, como dispositivos de barramento SCSI ou USB, normalmente é permitido chamar CreateFile de dentro de IStiUSD::Initialize se status modo for especificado, pois o dispositivo e a porta sempre serão dedicados a um cliente.

Quando um dispositivo é aberto no modo de dados, CreateFile normalmente é chamado de dentro de IStiUSD:Initialize, independentemente do tipo de barramento.