Creazione di report sullo stato online del dispositivo
Il servizio WIA controlla lo stato online di un dispositivo WIA chiamando il metodo IStiUSD::GetStatus . Il minidriver WIA deve controllare lo stato online corrente dell'hardware e segnalare i risultati.
Il servizio WIA chiama il metodo IStiUSD::GetStatus per due operazioni principali:
Verifica dello stato online del dispositivo.
Polling per gli eventi del dispositivo, ad esempio un evento pulsante di selezione.
Determinare la richiesta di operazione può essere eseguita controllando il membro StatusMask della struttura STI_DEVICE_STATUS . Il membro StatusMask può essere una delle richieste seguenti.
STI_DEVSTATUS_ONLINE_STATE
Controllare se il dispositivo è online.
STI_DEVSTATUS_EVENTS_STATE
Verificare la presenza di eventi del dispositivo.
STI_DEVSTATUS_ONLINE_STATE
Questa richiesta di operazione deve essere eseguita impostando il membro dwOnlineState della struttura STI_DEVICE_STATUS.
STI_DEVSTATUS_EVENTS_STATE
Questa richiesta di operazione deve essere eseguita impostando il membro dwEventHandlingState della struttura STI_DEVICE_STATUS. Il valore che deve essere utilizzato è STI_EVENTHANDLING_PENDING. Il dispositivo ha un evento in sospeso e è in attesa di segnalarlo al servizio WIA.
Quando STI_EVENTHANDLING_PENDING è impostato, il servizio WIA segnala che si è verificato un evento nel driver WIA. Il servizio WIA chiama il metodo IStiUSD::GetNotificationData per ottenere altre informazioni sull'evento.
Il metodo IStiUSD::GetNotificationData viene chiamato per gli eventi di polling e gli eventi di interrupt. Si tratta di questo metodo che è necessario compilare le informazioni sull'evento appropriate per tornare al servizio WIA.
Nota Deselezionare sempre il flag STI_EVENTHANDLING_PENDING nel membro dwEventHandlingState per assicurarsi che venga impostato correttamente quando si verifica un evento del dispositivo.
L'esempio seguente illustra un'implementazione del metodo 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 the device is online.
//
if (pDevStatus->StatusMask & STI_DEVSTATUS_ONLINE_STATE) {
//
// assume the device is OFF-LINE before continuing. This will
// validate that the online check was successful.
//
pDevStatus->dwOnlineState = STI_ONLINESTATE_OFFLINE;
if(MyDeviceIsOnlineStatus()) {
//
// device is ON-LINE and operational
//
pDevStatus->dwOnlineState |= STI_ONLINESTATE_OPERATIONAL;
} else {
//
// device is OFF-LINE and NOT operational
//
}
}
return S_OK;
}