Compartir a través de


Notificación del estado en línea del dispositivo

El servicio WIA comprueba el estado en línea de un dispositivo WIA llamando al método IStiUSD::GetStatus . El minidriver WIA debe comprobar el estado en línea actual del hardware e informar de los resultados.

El servicio WIA llama al método IStiUSD::GetStatus para dos operaciones principales:

  • Comprobar el estado en línea del dispositivo.

  • Sondear eventos de dispositivo, como un evento de botón de inserción.

Para determinar la solicitud de operación, compruebe el miembro StatusMask de la estructura STI_DEVICE_STATUS . El miembro StatusMask puede ser cualquiera de las siguientes solicitudes.

STI_DEVSTATUS_ONLINE_STATE
Compruebe si el dispositivo está en línea.

STI_DEVSTATUS_EVENTS_STATE
Compruebe si hay eventos de dispositivo.

STI_DEVSTATUS_ONLINE_STATE

Esta solicitud de operación debe realizarse estableciendo el miembro dwOnlineState de la estructura STI_DEVICE_STATUS.

STI_DEVSTATUS_EVENTS_STATE

Esta solicitud de operación debe realizarse estableciendo el miembro dwEventHandlingState de la estructura STI_DEVICE_STATUS. El valor que se debe usar es STI_EVENTHANDLING_PENDING. (El dispositivo tiene un evento pendiente y está esperando notificarlo al servicio WIA).

Cuando se establece STI_EVENTHANDLING_PENDING, se señala al servicio WIA que se ha producido un evento en el controlador WIA. El servicio WIA llama al método IStiUSD::GetNotificationData para obtener más información sobre el evento.

Se llama al método IStiUSD::GetNotificationData para eventos sondeados y eventos de interrupción. Se encuentra en este método que debe rellenar la información de eventos adecuada para volver al servicio WIA.

Nota Borre siempre la marca STI_EVENTHANDLING_PENDING en el miembro dwEventHandlingState para asegurarse de que se establece correctamente cuando se produce un evento de dispositivo.

En el ejemplo siguiente se muestra una implementación del método 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;
}