Compartilhar via


Transferência de dados entre o aplicativo herdado e o Driver do Windows Vista

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 dê suporte explicitamente à conta LocalService ainda poderá executar uma transferência de dados. A conta LocalService está disponível no Microsoft Windows XP e em sistemas operacionais posteriores.

No mínimo, um driver herdado deve expor TYMED_FILE e TYMED_CALLBACK; no entanto, um driver do Windows Vista nunca 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 de um driver do Windows Vista.

Um aplicativo herdado verá os formatos com suporte 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 é fazer com que a camada de compatibilidade "intercepte" chamadas para IWiaMiniDrv::d rvGetWiaFormatInfo e adicionar todos os formatos de TYMED_FILE do driver do Windows Vista (com exceção de WiaImgFmt_BMP /WiaImgFmt_MEMORYBMP) para TYMED_CALLBACK. O mais importante é que a camada de compatibilidade cria seu próprio objeto de retorno de chamada herdado durante transferências de dados, o 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 Noções básicas sobre TYMED.

A camada de compatibilidade cria dois objetos de retorno de chamada no proxy COM wia: um para transferências de retorno de chamada e outro para transferências de arquivo. O proxy COM do WIA implementa a interface IWiaTransferCallback. Esse objeto de retorno de chamada cuida da conversão entre transferência baseada em fluxo e transferência de "estilo antigo". A camada de compatibilidade wia também inicia o filtro de processamento de imagem do driver para o qual passamos o objeto de retorno de chamada da camada de compatibilidade. Portanto, o filtro de processamento de imagem sempre será executado no contexto do aplicativo, assim como acontece com as 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.

diagrama ilustrando a transferência de dados entre um aplicativo herdado e um driver do Windows Vista.

O objeto de retorno de chamada herdado dentro do proxy COM wia converte mensagens de transferência do Windows Vista e dados gravados em fluxo em mensagens de transferência herdadas e grava dados em arquivo ou retorno de chamada de dados em banda.

Quando o driver chama qualquer um dos métodos expostos pela interface IStream que 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 de IStream personalizada que simplesmente encapsula a interface IStream que o proxy COM wia fornece.

As transferências de arquivos herdadas 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 filtro de processamento de driver ou imagem quando 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 Implementação de transferência de dados da camada de compatibilidade wia.

Ao chamar o método IWiaDataTransfer::d tGetData, a camada de compatibilidade faz uma verificação de parâmetro 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 mais alta, em seguida, 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 do que uma.

As transferências de retorno de chamada herdadas são um pouco mais complicadas. Como um driver do Windows Vista não dá suporte a WiaImgFmt_MEMORYBMP, o 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 o retorno de chamada do aplicativo após chamadas para o método IStream::Write pelo aplicativo.

Foi preciso fazer uma alteração 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. Essa adição não é uma consequência da camada de compatibilidade, mas é necessária porque não é possível acessar a interface IWiaDataTransfer 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.

IWiaMiniDrvTransferCallback