Condividi tramite


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;
}