Notifica a un'applicazione delle modifiche all'albero degli elementi
Un minidriver per un dispositivo WIA deve essere in grado di informare le applicazioni associate ai dispositivi WIA di eventuali modifiche apportate all'albero degli elementi del dispositivo. Ad esempio, se un'applicazione visualizza un'interfaccia utente che mostra le anteprime delle immagini su 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 le applicazioni connesse che l'albero degli elementi contiene ora la nuova immagine. (Sia WIA_CMD_TAKE_PICTURE che TakePicture sono descritti nella documentazione di Microsoft Windows SDK. Il minidriver esegue questa operazione chiamando la funzione diwiasQueueEvent.
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 quando arriva, perché è in ascolto di tali eventi.
L'esempio seguente illustra un'implementazione del metodo IWiaMiniDrv::drvDeviceCommand.
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;
}