Информирование приложения об изменениях дерева элементов
Мини-диск для устройства 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;
}