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