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


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

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

В следующем примере реализации метода IWiaMiniDrv::d rvDeviceCommand показано, как мини-диск WIA может отвечать на команду, отправленную ему службой WIA, и передавать команду на устройство. После того, как мини-накопитель WIA выдает на устройство команду, мини-диск сообщает приложениям о том, что дерево элементов устройства изменилось. В этой реализации метод определяет, что служба WIA выполнила команду "Создать фотографию" (WIA_CMD_TAKE_PICTURE). Метод вызывает метод TakePicture для корневого элемента (элемента для устройства) и информирует все подключенные приложения о том, что дерево элементов теперь содержит новый рисунок. (Как WIA_CMD_TAKE_PICTURE, так и TakePicture описаны в документации по Microsoft Windows SDK.) Мини-driver делает это путем вызова функции 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;
}