Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A camada de compatibilidade deve garantir que o filtro de processamento de imagem do driver seja sempre invocado e que um aplicativo herdado que não ofereça suporte explícito à conta LocalService ainda possa executar uma transferência de dados. A conta LocalService está disponível no Microsoft Windows XP e sistemas operacionais posteriores.
No mínimo, um driver herdado deve expor TYMED_FILE e TYMED_CALLBACK; no entanto, um driver do Windows Vista nunca irá expor TYMED_CALLBACK (ou TYMED_MULTIPAGE_CALLBACK). A parte de transferência da camada de compatibilidade garantirá que um aplicativo herdado verá TYMED_CALLBACK embora o driver do Windows Vista não o implemente. TYMED_MULTIPAGE_CALLBACK nunca será exposto a partir de um driver do Windows Vista.
Um aplicativo herdado verá os formatos suportados para TYMED_FILE e TYMED_MULTIPAGE_FILE que o driver do Windows Vista expõe. Por TYMED_CALLBACK, um aplicativo herdado verá os mesmos formatos que o driver expõe para TYMED_FILE, com uma exceção: em vez de expor WiaImgFmt_BMP, a camada de compatibilidade exporá WiaImgFmt_MEMORYBMP ao aplicativo herdado. A maneira como isso é feito é fazendo com que a camada de compatibilidade "intercete" chamadas para IWiaMiniDrv::d rvGetWiaFormatInfo, e adicione todos os formatos de TYMED_FILE do driver do Windows Vista (com exceção de WiaImgFmt_BMP /WiaImgFmt_MEMORYBMP) para TYMED_CALLBACK. Mais importante ainda, a camada de compatibilidade cria seu próprio objeto de retorno de chamada herdado durante as transferências de dados, que converte mensagens de transferência do Windows Vista e dados gravados em seu fluxo em mensagens de transferência herdadas.
Para obter mais informações sobre as constantes TYMED, consulte Understanding TYMED.
A camada de compatibilidade cria dois objetos de retorno de chamada no proxy WIA COM: um para operações de callbacks e outro para transferências de arquivos. O proxy WIA COM implementa a interface IWiaTransferCallback. Este objeto callback cuida da conversão entre transferência baseada em stream e transferência de estilo antigo. A camada de compatibilidade WIA também aciona o filtro de processamento de imagem do driver, ao qual passamos o objeto callback da camada de compatibilidade. Assim, o filtro de processamento de imagem será sempre executado no contexto do aplicativo, assim como nas transferências do Windows Vista.
O diagrama a seguir ilustra como a camada de compatibilidade funcionaria com um driver do Windows Vista e um aplicativo herdado.
O objeto de retorno de chamada legado dentro do proxy WIA COM converte mensagens de transferência do Windows Vista e dados escritos em fluxo em mensagens de transferência legadas, gravando os dados em um arquivo ou usando um retorno de chamada de dados em banda.
Quando o driver chama qualquer um dos métodos expostos pela interface IStream que ele recebe do método IWiaMiniDrvTransferCallback::GetNextStream (observe que um driver só deve chamar IStream::Write, IStream::Seek e IStream::SetSize). Assim, a camada de compatibilidade cria uma implementação IStream personalizada que simplesmente encapsula a interface IStream que o proxy WIA COM fornece.
As transferências de arquivos herdados são simples. Um exemplo dessa transferência é quando um aplicativo herdado chama IWiaDataTransfer::idtGetData. A camada de compatibilidade cria um fluxo de dados no arquivo que o aplicativo especifica na estrutura STGMEDIUM. Esse fluxo é passado para o driver ou filtro de processamento de imagem quando ele chama IWiaTransferCallback::GetNextStream e todas as mensagens de transferência são facilmente mapeadas para mensagens de transferência herdadas. Para obter uma descrição mais detalhada de como as mensagens são mapeadas, consulte WIA Compatibility Layer Data Transfer Implementation.
Ao chamar o método IWiaDataTransfer::d tGetData, a camada de compatibilidade faz uma verificação de parâmetros mais rigorosa. Por exemplo, a camada de compatibilidade não permite chamar o método IWiaDataTrasnfer::idtGetData com TYMED_FILE e uma contagem de páginas maior que uma Em transferências de dados que não utilizam a camada de compatibilidade foi possível chamar o método IWiaDataTrasnfer::idtGetData com TYMED_FILE e ter uma contagem de páginas maior que uma.
As transferências de retorno de chamada herdadas são um pouco mais complicadas. Como um driver do Windows Vista não oferece suporte ao WiaImgFmt_MEMORYBMP, que é necessário para drivers herdados, o objeto de retorno de chamada da camada de compatibilidade deve lidar com a conversão de WiaImgFmt_BMP para WiaImgFmt_MEMORYBMP. O mapeamento entre mensagens de transferência também não é muito simples. A camada de compatibilidade cria sua própria implementação de fluxo. A camada de compatibilidade envia mensagens IT_MSG_DATA para a função de retorno de chamada da aplicação quando ocorrem chamadas ao método IStream::Write pela aplicação.
Uma alteração teve que ser feita na interface IWiaTransfer como parte da implementação da camada de compatibilidade; A função IWiaTransfer::EnumWIA_FORMAT_INFO é adicionada a IWiaTransfer para permitir transferências TYMED_MULTIPAGE_FILE. Esta adição não é uma consequência da camada de compatibilidade, mas é necessária porque não é possível chegar à interface IWiaDataTransfer a partir da interface IWiaTransfer ou da interface IWiaItem2 para a interface IWiaItem .
As interfaces IWiaDataTransfer, IWiaTransfer, IWiaItem, IWiaItem2 e IStream e a estrutura STGMEDIUM são discutidas na documentação do SDK do Microsoft Windows.