Condividi tramite


Informazioni su un'applicazione di modifiche dell'albero degli elementi

Un minidriver per un dispositivo WIA deve essere in grado di informare le applicazioni associate ai dispositivi WIA di eventuali modifiche all'albero degli elementi del dispositivo. Ad esempio, se un'applicazione visualizza un'interfaccia utente che mostra le anteprime delle immagini in una fotocamera, un minidriver WIA deve essere in grado di notificare all'interfaccia utente di un'applicazione di non visualizzare anteprime di immagini già eliminate dall'utente.

L'implementazione di esempio seguente del metodo IWiaMiniDrv::d rvDeviceCommand mostra come un minidriver WIA può rispondere a un comando inviato dal servizio WIA e passare il comando al dispositivo. Dopo che il minidriver WIA rilascia il comando al dispositivo, il minidriver informa le applicazioni che l'albero degli elementi del dispositivo è stato modificato. In questa implementazione, il metodo determina che il servizio WIA ha emesso il comando "Take Picture" (WIA_CMD_TAKE_PICTURE). Il metodo chiama il metodo TakePicture sull'elemento radice (l'elemento per il dispositivo) e informa tutte le applicazioni connesse che l'albero degli elementi contiene ora la nuova immagine. Entrambi i WIA_CMD_TAKE_PICTURE e TakePicture sono descritti nella documentazione di Microsoft Windows SDK. Il minidriver esegue questa operazione chiamando la funzione wiasQueueEvent.

Si noti che quando il minidriver invia l'evento che indica che l'albero è stato aggiornato, tutte le applicazioni in ascolto vengono informate della modifica, non solo del chiamante. Ad esempio, se un utente ha la visualizzazione Explorer della fotocamera aperta e usa Microsoft Paint per acquisire una nuova immagine, la finestra Explorer mostra anche la nuova immagine all'arrivo, perché è in ascolto di tali eventi.

L'esempio seguente mostra un'implementazione del metodo IWiaMiniDrv::d rvDeviceCommand .

HRESULT _stdcall CWIADevice::drvDeviceCommand(
  BYTE        *pWiasContext,
  LONG        lFlags,
  const GUID  *plCommand,
  IWiaDrvItem **ppWiaDrvItem,
  LONG        *plDevErrVal)
{
  //
  // If the caller did not pass in the correct parameters, 
  // then fail the call and return E_INVALIDARG.
  //

  if ((!pWiasContext)||(!plDevErrVal)||(!plCommand)) {
    return E_INVALIDARG;
  }

  *plDevErrVal = 0;
  HRESULT hr = E_NOTIMPL;

  //
  //  Check which command was issued
  //

  if (*plCommand == WIA_CMD_TAKE_PICTURE) {

    //
    // process command here
    //

      hr = HARDWARE_SNAP_PHOTO();
  }
  return hr;
}