Usando o método de escape IStiUSD
O método IStiUSD::Escape é chamado para passar informações diretamente para o hardware. Esse método tem suporte apenas no Windows XP e em sistemas operacionais posteriores.
Toda a comunicação entre um aplicativo compatível com TWAIN e o driver WIA vai primeiro para o gerenciador de fonte de dados (twain_32.dll), que, por sua vez, chama para a camada de compatibilidade TWAIN (wiadss.dll). Em seguida, a camada de compatibilidade do TWAIN chama o método IStiUSD::Escape do driver WIA e passa um dos dois seguintes códigos de escape para o método :
código de escape ESC_TWAIN_CAPABILITY
código de escape ESC_TWAIN_PRIVATE_SUPPORTED_CAPS
Quando o aplicativo TWAIN solicita a lista de funcionalidades privadas do driver WIA, a camada de compatibilidade do TWAIN chama o método IStiUSD::Escape do driver, passando ESC_TWAIN_PRIVATE_SUPPORTED_CAPS na chamada. Se o driver não der suporte à funcionalidade de passagem, ele retornará a lista de funcionalidades estáticas (padrão) da camada de compatibilidade TWAIN. Caso contrário, o driver retornará uma lista de recursos privados com suporte para a camada de compatibilidade do TWAIN.
Quando o aplicativo TWAIN envia uma operação de funcionalidade que ainda não está na lista padrão da camada de compatibilidade TWAIN, a camada de compatibilidade TWAIN chama o método IStiUSD::Escape do driver, desta vez passando ESC_TWAIN_CAPABILITY na chamada.
No entanto, a explicação anterior é um pouco simplificada. Quando o aplicativo TWAIN solicita a lista de recursos privados do driver, a camada de compatibilidade do TWAIN realmente faz duas chamadas para o método IStiUSD::Escape do driver. Na primeira chamada, a camada de compatibilidade TWAIN pergunta ao driver WIA quanta memória é necessária para armazenar a lista de recursos. Em seguida, a camada de compatibilidade do TWAIN aloca essa quantidade de memória para o driver WIA usar. Na segunda chamada, a camada de compatibilidade TWAIN solicita ao driver WIA a lista de funcionalidades, que o driver WIA copia para a memória mencionada anteriormente. A camada de compatibilidade TWAIN é responsável por alocar e liberar toda a memória usada em transações TWAIN-WIA. Essa disposição impede que o driver WIA libere memória que a camada de compatibilidade TWAIN está usando.
A camada de compatibilidade do TWAIN também chama o método IStiUSD::Escape do driver duas vezes quando ESC_TWAIN_CAPABILITY é passado e para o qual a intenção é obter uma funcionalidade. A primeira chamada pergunta ao driver WIA quanta memória ele precisa para armazenar a funcionalidade e a segunda chamada retorna a funcionalidade. Observe que as operações de funcionalidade SET exigem apenas uma única chamada para IStiUSD::Escape, pois nenhuma memória precisa ser alocada.
Todas as chamadas para o método IStiUSD::Escape devem ser validadas nesta ordem:
Valide o código da função EscapeFunction . Se não for válido, falhe imediatamente. Isso impede que códigos incorretos sejam processados no driver.
Valide o buffer de entrada, lpInData. Se não for válido, falhe imediatamente. Buffers de entrada inválidos podem causar falha no driver WIA.
Valide o buffer de saída, pOutData. Se não for válido, falhe imediatamente. Se o driver não puder concluir a solicitação gravando os dados necessários, ele não precisará processar esses dados.
Valide o tamanho do buffer de saída. Se o driver não puder gravar a quantidade correta de dados no buffer de saída, o chamador não poderá processar corretamente esses dados.
Os exemplos de código nas seções a seguir ilustram o uso da funcionalidade pass-though, dando suporte a aplicativos TWAIN com recursos privados. Os exemplos de código usam dois códigos de escape definidos no arquivo de cabeçalho wiatwcmp.h, ESC_TWAIN_PRIVATE_SUPPORTED_CAPS e ESC_TWAIN_CAPABILITY.