Поделиться через


Информирование приложения о изменениях в дереве элементов

Минидрайвер для устройства WIA должен иметь возможность информировать приложения, связанные с устройствами WIA, о любых изменениях в дереве элементов устройства. Например, если приложение отображает пользовательский интерфейс с эскизами изображений на камере, минидрайвер WIA должен иметь возможность уведомить приложение, чтобы оно не отображало эскизы изображений, которые пользователь уже удалил.

В следующем примере реализации метода IWiaMiniDrv::drvDeviceCommand показано, как минидрайвер WIA может реагировать на команду, отправленную службой WIA, и передать команду на устройство. После того как минидрайвер WIA выдает команду устройству, он сообщает приложениям, что дерево элементов устройства было изменено. В этой реализации метод определяет, что служба WIA выпустила команду "Сделать фото" (WIA_CMD_TAKE_PICTURE). Метод вызывает метод TakePicture в корневом элементе (элемент для устройства) и сообщает всем подключенным приложениям, что дерево элементов теперь содержит новое изображение. (Как WIA_CMD_TAKE_PICTURE, так и TakePicture описаны в документации по пакету SDK для Microsoft Windows.) Минидрайвер делает это путем вызова функции wiasQueueEvent.

Обратите внимание, что когда минидрайвер отправляет событие, указывающее, что дерево было обновлено, все приложения уведомляются об изменении, а не только вызывающее приложение. Например, если у пользователя открыт режим просмотра камеры и используется Microsoft Paint для получения нового рисунка, окно обзора также показывает новое изображение при его добавлении, так как оно отслеживает такие события.

В следующем примере показана реализация метода 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;
}