Informieren einer Anwendung von Elementstrukturänderungen

Ein Minidriver für ein WIA-Gerät muss in der Lage sein, Anwendungen, die WIA-Geräten zugeordnet sind, über Änderungen an der Elementstruktur des Geräts zu informieren. Wenn eine Anwendung beispielsweise eine Benutzeroberfläche mit Miniaturansichten der Bilder auf einer Kamera anzeigt, sollte ein WIA-Minidriver die Benutzeroberfläche einer Anwendung benachrichtigen können, um keine Miniaturansichten von Bildern anzuzeigen, die der Benutzer bereits gelöscht hat.

Die folgende Beispielimplementierung der IWiaMiniDrv::d rvDeviceCommand-Methode zeigt, wie ein WIA-Minidriver auf einen vom WIA-Dienst gesendeten Befehl reagieren und den Befehl an das Gerät übergeben kann. Nachdem der WIA-Minidriver den Befehl für das Gerät ausgibt, informiert der Minidriver die Anwendungen darüber, dass sich die Geräteelementstruktur geändert hat. In dieser Implementierung bestimmt die Methode, dass der WIA-Dienst den Befehl "Bild aufnehmen" (WIA_CMD_TAKE_PICTURE) ausgegeben hat. Die Methode ruft die TakePicture-Methode für das Stammelement (das Element für das Gerät) auf und informiert alle verbundenen Anwendungen darüber, dass die Elementstruktur nun das neue Bild enthält. (Sowohl WIA_CMD_TAKE_PICTURE als auch TakePicture werden in der Microsoft Windows SDK-Dokumentation beschrieben.) Dazu ruft der Minidriver die Funktion wiasQueueEvent auf.

Beachten Sie, dass, wenn der Minidriver das Ereignis sendet, das angibt, dass die Struktur aktualisiert wurde, alle lauschenden Anwendungen über die Änderung informiert werden, nicht nur der Aufrufer. Wenn ein Benutzer beispielsweise die Explorer Ansicht der Kamera geöffnet hat und Microsoft Paint verwendet, um ein neues Bild zu erhalten, zeigt das Explorer Fenster auch das neue Bild an, wenn es eintrifft, da es auf solche Ereignisse lauscht.

Das folgende Beispiel zeigt eine Implementierung der IWiaMiniDrv::d rvDeviceCommand-Methode .

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