Modes de transfert
Les interfaces d’image fixe définissent deux modes de transfert : le mode status et le mode données. Lorsqu’un client de l’interface COM IStillImage appelle IStillImage::CreateDevice pour obtenir l’accès à un appareil image fixe, il spécifie un des modes de transfert (ou les deux). Plusieurs clients peuvent ouvrir un appareil en mode status, mais un seul client à la fois est autorisé à ouvrir un appareil en mode données.
Le moniteur d’événements d’image fixe ouvre les appareils en mode status. En règle générale, mais pas toujours, les API d’acquisition d’images ouvrent des appareils en mode données.
Une fois qu’un client a ouvert un appareil en mode données, le moniteur d’événements stocke les événements d’appareil d’image fixe suivants dans une file d’attente interne. Si le client appelle IStiDevice::Subscribe, il peut lire les événements de la file d’attente en appelant IStiDevice::GetLastNotificationData. Une fois que le client a fermé l’appareil, les événements reçus entraînent une nouvelle tentative de démarrage d’une application inscrite par le moniteur d’événements.
La signification des deux modes de transfert dépend entièrement du minidriver en mode utilisateur de l’appareil. Les interfaces IStillImage et IStiDevice permettent d’appeler toutes les méthodes dans l’un ou l’autre des modes.
Un minidriver peut déterminer le mode dans lequel il a été ouvert en appelant IStiDevice::GetLastNotificationData. Les minidrivers doivent empêcher un client d’effectuer des transferts de données si le client a demandé uniquement status mode lors de l’obtention de l’accès à l’appareil.
Il est important de noter que les appareils sont généralement ouverts en mode status pendant une période relativement longue (par exemple, le moniteur d’événements surveille les événements d’appareil), alors qu’ils sont ouverts en mode données pendant une période relativement courte (par exemple, pour lire dans une image). Bien que l’architecture de l’image fixe ne permette qu’à un seul client à la fois d’ouvrir un appareil en mode données, il peut être nécessaire qu’un pilote impose d’autres restrictions sur l’accès aux appareils.
Par instance, si vous écrivez un pilote pour un appareil connecté à un port série, vous pouvez appeler CreateFile à partir de la méthode IStiUSD::LockDevice du pilote si l’appareil a été ouvert en mode status. Cela empêchera d’autres applications d’utiliser le port (qui peut prendre en charge d’autres appareils) pendant que status informations sont obtenues à partir de l’appareil.
Pour les appareils connectés à des ports dédiés, tels que des périphériques de bus SCSI ou USB, il est généralement possible d’appeler CreateFile à partir d’IStiUSD::Initialize si status mode est spécifié, car l’appareil et le port seront toujours dédiés à un client.
Lorsqu’un appareil est ouvert en mode données, CreateFile est généralement appelé à partir de IStiUSD:Initialize, indépendamment du type de bus.