Sdílet prostřednictvím


Informování aplikace o změnách stromu položek

Minidriver pro zařízení WIA musí být schopen informovat aplikace přidružené k zařízením WIA o jakýchkoli změnách stromu položek zařízení. Pokud například aplikace zobrazí uživatelské rozhraní s miniaturami obrázků na fotoaparátu, měl by být minidriver WIA schopný upozornit uživatelské rozhraní aplikace, aby nezobrazoval miniatury obrázků, které uživatel už odstranil.

Následující ukázková implementace IWiaMiniDrv::d rvDeviceCommand metoda ukazuje, jak může minidriver WIA reagovat na příkaz odeslaný službou WIA a předat příkaz na zařízení. Jakmile minidriver WIA vydá příkaz na zařízení, minidriver informuje aplikace, že se strom položek zařízení změnil. V této implementaci metoda určuje, že služba WIA vydala příkaz "Take Picture" (WIA_CMD_TAKE_PICTURE). Metoda volá metodu TakePicture v kořenové položce (položka pro zařízení) a informuje všechny připojené aplikace, že strom položky nyní obsahuje nový obrázek. (V dokumentaci k sadě Microsoft Windows SDK jsou popsány WIA_CMD_TAKE_PICTURE i TakePicture .) Minidriver to dělá voláním funkce wiasQueueEvent .

Všimněte si, že když minidriver odešle událost, která značí, že strom byl aktualizován, všechny naslouchající aplikace jsou informovány o změně, ne jen volající. Pokud má uživatel například otevřené zobrazení Průzkumníka fotoaparátu a použije Malování od Microsoftu ke vytvoření nového obrázku, toto okno Průzkumníka zobrazí také nový obrázek, jakmile se objeví, protože naslouchá takovým událostem.

Následující příklad ukazuje implementaci IWiaMiniDrv::d rvDeviceCommand metoda.

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