Ajouter la prise en charge des événements d’interrogation
Pour configurer correctement votre pilote WIA afin de signaler les événements d’interrogation, procédez comme suit :
Définissez Capabilities=0x33 dans le fichier INF de votre appareil. (Pour plus d’informations, consultez Fichiers INF pour les appareils WIA .)
Rapportez STI_GENCAP_NOTIFICATIONS et STI_USD_GENCAP_NATIVE_PUSHSUPPORT dans la méthode IStiUSD::GetCapabilities .
Signalez tous les événements pris en charge dans la méthode IWiaMiniDrv::d rvGetCapabilities .
Répondre aux appels à la méthode IStiUSD::GetStatus . Le service WIA appelle cette méthode à un intervalle prédéfini configurable dans le fichier INF. Le paramètre par défaut est un intervalle de 1 seconde.
Signalez la réponse appropriée aux informations sur l’événement dans la méthode IStiUSD::GetNotificationData .
Le service WIA appelle la méthode IStiUSD::GetStatus pour deux opérations principales :
Vérification de la status en ligne de l’appareil.
Interrogation d’événements d’appareil, tels qu’un événement de bouton push.
Pour déterminer la demande d’opération, vérifiez le membre StatusMask de la structure STI_DEVICE_STATUS . Le membre StatusMask peut être l’une des requêtes suivantes :
STI_DEVSTATUS_ONLINE_STATE
Cette demande d’opération vérifie si l’appareil est en ligne et doit être rempli en définissant le membre dwOnlinesState de la structure STI_DEVICE_STATUS.
STI_DEVSTATUS_EVENTS_STATE
Cette demande d’opération vérifie les événements d’appareil. Il doit être rempli en définissant le membre dwEventHandlingState de la structure STI_DEVICE_STATUS. La valeur à utiliser est STI_EVENTHANDLING_PENDING. (L’appareil a un événement en attente et attend de le signaler au service WIA.)
Lorsque STI_EVENTHANDLING_PENDING est défini, le service WIA est signalé qu’un événement s’est produit dans le pilote WIA. Le service WIA appelle la méthode IStiUSD::GetNotificationData pour obtenir plus d’informations sur l’événement.
La méthode IStiUSD::GetNotificationData est appelée pour les événements interrogés et les événements d’interruption. C’est dans cette méthode que vous devez remplir les informations d’événement appropriées pour revenir au service WIA.
Note Effacez toujours l’indicateur STI_EVENTHANDLING_PENDING dans le membre dwEventHandlingState pour vous assurer qu’il est correctement défini lorsqu’un événement d’appareil se produit. Ce pilote WIA doit définir le m_guidLastEvent variable de membre de classe sur le GUID d’événement approprié lorsqu’un événement est détecté. Le m_guidLastEvent est vérifié ultérieurement lorsque le service WIA appelle la méthode IStiUSD::GetNotificationData . La variable membre m_guidLastEvent est définie dans la classe CWIADevice (dans l’extrait de code suivant), utilisée pour mettre en cache le dernier événement signalé. Une fois que cette variable membre a été demandée par le service WIA, elle est toujours définie sur GUID_NULL.
L’exemple suivant montre une implémentation de la méthode IStiUSD::GetStatus .
STDMETHODIMP CWIADevice::GetStatus(PSTI_DEVICE_STATUS pDevStatus)
{
//
// If the caller did not pass in the correct parameters,
// then fail the call with E_INVALIDARG.
//
if(!pDevStatus)
{
return E_INVALIDARG;
}
HRESULT hr = S_OK;
//
// If we are asked, verify state of an event handler
//(front panel buttons, user controlled attachments, etc.).
//
// If your device requires polling, then this is where you would
// specify the event result.
// However, It is not recommended to have polled events.
// Interrupt events are better for performance, and reliability.
// See the SetNotificationsHandle method for how to
// implement interrupt events.
//
//
// clear the dwEventHandlingState field first to make sure we are really setting
// a pending event.
//
pDevStatus->dwEventHandlingState &= ~STI_EVENTHANDLING_PENDING;
if (pDevStatus->StatusMask & STI_DEVSTATUS_EVENTS_STATE) {
//
// set the polled event result here, for the GetNotificationData()
// method to read and report.
// (m_guidLastEvent will be read in GetNotificationData)
//
LONG lEventResult = 0;
PollMyDeviceForEvents(&lEventResult)
if(lEventResult == DEVICE_SCAN_BUTTON_PRESSED) {
//
// polled event result was one we know about
//
m_guidLastEvent = WIA_EVENT_SCAN_IMAGE;
} else {
//
// nothing happened, so continue
//
m_guidLastEvent = GUID_NULL;
}
if (m_guidLastEvent != GUID_NULL) {
//
// if the event GUID is NOT GUID_NULL, set the
// STI_EVENTHANDLING_PENDING flag letting the WIA service
// know that we have an event ready. This will tell the WIA
// service to call GetNotificationData() for the event
// specific information.
//
pDevStatus->dwEventHandlingState |= STI_EVENTHANDLING_PENDING;
}
}
return S_OK;
}