Solução de problemas do minidriver WIA
Por padrão, o serviço WIA registra erros em um arquivo chamado wiadebug.log no % diretório windir%. As informações que o serviço WIA coloca nesse arquivo podem ser muito úteis durante o desenvolvimento do driver. O exemplo a seguir ilustra um problema típico e mostra como as informações no arquivo wiadebug.log podem ser usadas para encontrar uma solução para o problema.
Um desenvolvedor grava um aplicativo para testar um driver de scanner que está em desenvolvimento. Como um dos testes, o desenvolvedor tenta definir os pontos do scanner por polegada (dpi) como 1200, mas observa que essa ação produz um erro. Uma olhada no arquivo Wiadebug.log mostra o seguinte:
wiasGetChangedValueLong, validate prop 6147 failed hr: 0x80070057
wiasUpdateScanRect, CheckXResAndUpdate failed (0x80070057)
CDrvWrap::WIA_drvValidateItemProperties, Error calling driver:
drvValidateItemProperties with hr = 0x80070057 (This is normal if the app wrote an invalid value)
Essas entradas de log indicam que o driver está relatando que o aplicativo escreveu um valor inválido. Não está claro a partir dessas informações qual é o problema exato. Se o desenvolvedor aumentar o nível de log do WIA para relatar avisos, bem como os erros, wiadebug.log produzirá uma saída semelhante à seguinte:
wiasValidateItemProperties, invalid LIST value for :
(propID) Horizontal Resolution, value = 1200
Valid values are:
75
100
150
200
300
600
wiasGetChangedValueLong, validate prop 6147 failed hr: 0x80070057
wiasUpdateScanRect, CheckXResAndUpdate failed (0x80070057)
CDrvWrap::WIA_drvValidateItemProperties, Error calling driver:
drvValidateItemProperties with hr = 0x80070057 (This is normal if the app wrote an invalid value)
A saída mostra que a propriedade Resolução Horizontal está causando a falha. O aplicativo está tentando definir a resolução como 1200, mas a lista de resoluções com suporte não inclui 1200. Assim, o auxiliar de validação do serviço WIA wiasValidateItemProperties rejeita a solicitação para definir esse valor.
Agora que o problema foi identificado, cabe ao desenvolvedor determinar se ele é o driver ou o aplicativo que deve ser revisado. Se as especificações do verificador permitirem que ele dê suporte a todas as resoluções entre 100 e 1400 dpi, o driver deverá ser capaz de lidar com uma solicitação de 1200 dpi. Se o verificador não der suporte a essa configuração, o aplicativo deverá ser alterado para que ele não tente definir a Resolução Horizontal como um valor que não é válido para essa propriedade. Nesse caso, o aplicativo deve marcar que um valor é válido antes de tentar definir uma propriedade para esse valor.
O nível de log é controlado por uma entrada no registro. Para WIA, essa chave reside em:
HKLM\System\CurrentControlSet\Control\StillImage\Debug\MODULE_NAME\DebugFlags
Neste exemplo, MODULE_NAME é o nome do módulo binário apropriado. Para o serviço WIA, isso é wiaservc.dll. O valor em DebugFlags controla o nível de log. Três das configurações são fornecidas na tabela a seguir:
Valor | Significado |
---|---|
0x00000001 | Exibir mensagens de erro. |
0x00000002 | Exibir mensagens de aviso. |
0x00000004 | Exibir mensagens de rastreamento. |
O valor em DebugFlags é um valor de sinalizador (ou seja, configurações diferentes podem ser combinadas com um operador OR bit a bit). Para ativar o registro em log de erros, avisos e rastreamentos de uma só vez, defina DebugFlags como 0x0000007.
Para que uma alteração no valor de DebugFlags entre em vigor, o serviço WIA (stisvc) deve ser interrompido e reiniciado. Consulte Iniciando e parando o Serviço de Imagem Parada para obter detalhes.
O registro em log excessivo pode levar a uma diminuição significativa no desempenho. Você deve aumentar o nível de log somente ao tentar resolver um problema específico. Depois de corrigir o problema, defina o registro em log como seu nível original. O nível de log padrão é um. Não aumente o nível de log acima de três, pois isso pode causar uma falha.