Informando uma aplicação de alterações de árvore de itens
Um minidriver para um dispositivo WIA deve ser capaz de informar os aplicativos associados a dispositivos WIA de quaisquer alterações na árvore de itens do dispositivo. Por exemplo, se um aplicativo exibir uma interface do usuário mostrando miniaturas das imagens em uma câmera, um minidriver WIA deverá ser capaz de notificar a interface do usuário de um aplicativo para não exibir miniaturas de imagens que o usuário já excluiu.
A implementação de exemplo a seguir do método IWiaMiniDrv::d rvDeviceCommand mostra como um minidriver WIA pode responder a um comando enviado a ele pelo serviço WIA e passar o comando para o dispositivo. Depois que o minidriver WIA emite o comando para o dispositivo, o minidriver informa aos aplicativos que a árvore de itens do dispositivo foi alterada. Nessa implementação, o método determina que o serviço WIA emitiu o comando "Tirar Foto" (WIA_CMD_TAKE_PICTURE). O método chama o método TakePicture no item raiz (o item do dispositivo) e informa a todos os aplicativos conectados que a árvore de itens agora contém a nova imagem. (Tanto WIA_CMD_TAKE_PICTURE quanto TakePicture são descritos na documentação do SDK do Microsoft Windows.) O minidriver faz isso chamando a função wiasQueueEvent.
Observe que quando o minidriver envia o evento que indica que a árvore foi atualizada, todos os aplicativos ouvintes são informados da alteração, não apenas do chamador. Por exemplo, se um usuário tiver a exibição Explorer da câmera aberta e usar Microsoft Paint para adquirir uma nova imagem, a janela Explorer também mostrará a nova imagem quando ela chegar, pois escutará esses eventos.
O exemplo a seguir mostra uma implementação do método 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;
}