Information d’une application des modifications apportées à l’arborescence des éléments
Un minidriver pour un appareil WIA doit être en mesure d’informer les applications associées aux appareils WIA de toute modification apportée à l’arborescence d’éléments de l’appareil. Par exemple, si une application affiche une interface utilisateur affichant des miniatures des images sur un appareil photo, un minidriver WIA doit être en mesure d’avertir l’interface utilisateur d’une application de ne pas afficher de miniatures d’images que l’utilisateur a déjà supprimées.
L’exemple d’implémentation suivant de la méthode IWiaMiniDrv::d rvDeviceCommand montre comment un minidriver WIA peut répondre à une commande qui lui est envoyée par le service WIA et transmettre la commande à l’appareil. Une fois que le minidriver WIA émet la commande sur l’appareil, le minidriver informe les applications que l’arborescence d’éléments de l’appareil a changé. Dans cette implémentation, la méthode détermine que le service WIA a émis la commande « Prendre une photo » (WIA_CMD_TAKE_PICTURE). La méthode appelle la méthode TakePicture sur l’élément racine (l’élément de l’appareil) et informe toutes les applications connectées que l’arborescence d’éléments contient désormais la nouvelle image. (Les deux WIA_CMD_TAKE_PICTURE et TakePicture sont décrits dans la documentation Microsoft Windows SDK.) Pour ce faire, le minidriver appelle la fonction wiasQueueEvent.
Notez que lorsque le minidriver envoie l’événement qui indique que l’arborescence a été mise à jour, toutes les applications d’écoute sont informées de la modification, pas seulement l’appelant. Par exemple, si un utilisateur a ouvert la vue Explorer de l’appareil photo et utilise Microsoft Paint pour acquérir une nouvelle image, la fenêtre Explorer affiche également la nouvelle image lorsqu’elle arrive, car elle écoute ces événements.
L’exemple suivant montre une implémentation de la méthode 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;
}