Usar el método de escape IStiUSD
Se llama al método IStiUSD::Escape para pasar información directamente al hardware. Este método solo se admite en Windows XP y en sistemas operativos posteriores.
Toda la comunicación entre una aplicación compatible con TWAIN y el controlador WIA va primero al administrador de orígenes de datos (twain_32.dll), que a su vez llama a la capa de compatibilidad de TWAIN (wiadss.dll). A continuación, la capa de compatibilidad de TWAIN llama al método IStiUSD::Escape del controlador WIA y pasa uno de los dos códigos de escape siguientes al método :
código de escape de ESC_TWAIN_CAPABILITY
código de escape de ESC_TWAIN_PRIVATE_SUPPORTED_CAPS
Cuando la aplicación TWAIN solicita la lista de funcionalidades privadas del controlador WIA, la capa de compatibilidad de TWAIN llama al método IStiUSD::Escape del controlador, pasando ESC_TWAIN_PRIVATE_SUPPORTED_CAPS en la llamada. Si el controlador no admite la funcionalidad de paso a través, devuelve la lista de funcionalidades estáticas (predeterminadas) de la capa de compatibilidad de TWAIN. De lo contrario, el controlador devuelve una lista de funcionalidades privadas admitidas al nivel de compatibilidad de TWAIN.
Cuando la aplicación TWAIN envía una operación de funcionalidad que aún no está en la lista predeterminada de la capa de compatibilidad de TWAIN, la capa de compatibilidad de TWAIN llama al método IStiUSD::Escape del controlador, esta vez pasando ESC_TWAIN_CAPABILITY en la llamada.
Sin embargo, la explicación anterior es algo sobresmplificada. Cuando la aplicación TWAIN solicita la lista de funcionalidades privadas del controlador, la capa de compatibilidad de TWAIN realiza realmente dos llamadas al método IStiUSD::Escape del controlador. En la primera llamada, el nivel de compatibilidad de TWAIN pregunta al controlador WIA la cantidad de memoria necesaria para almacenar la lista de funcionalidades. A continuación, el nivel de compatibilidad de TWAIN asigna esa cantidad de memoria para que lo use el controlador WIA. En la segunda llamada, el nivel de compatibilidad de TWAIN solicita al controlador WIA la lista de funcionalidades, que el controlador WIA copia en la memoria mencionada anteriormente. La capa de compatibilidad de TWAIN es responsable de asignar y liberar toda la memoria usada en las transacciones TWAIN-WIA. Esta disposición impide que el controlador WIA libere memoria que usa la capa de compatibilidad de TWAIN.
La capa de compatibilidad de TWAIN también llama al método IStiUSD::Escape del controlador dos veces cuando se pasa ESC_TWAIN_CAPABILITY y para el que la intención es obtener una funcionalidad. La primera llamada pregunta al controlador WIA la cantidad de memoria que necesita para almacenar la funcionalidad y la segunda llamada devuelve la funcionalidad. Tenga en cuenta que las operaciones de funcionalidad SET solo requieren una sola llamada a IStiUSD::Escape, ya que no es necesario asignar memoria.
Todas las llamadas al método IStiUSD::Escape deben validarse en este orden:
Valide el código de la función EscapeFunction . Si no es válido, se producirá un error inmediatamente. Esto evita que se procesen códigos incorrectos en el controlador.
Valide el búfer entrante, lpInData. Si no es válido, se producirá un error inmediatamente. Los búferes entrantes no válidos pueden hacer que el controlador WIA se bloquee.
Valide el búfer saliente, pOutData. Si no es válido, se producirá un error inmediatamente. Si el controlador no puede completar la solicitud escribiendo los datos necesarios, no es necesario procesar esos datos.
Valide el tamaño del búfer saliente. Si el controlador no puede escribir la cantidad correcta de datos en el búfer saliente, el autor de la llamada no puede procesar correctamente esos datos.
Los ejemplos de código de las secciones siguientes muestran el uso de la funcionalidad de paso a través, que admiten aplicaciones de TWAIN con funcionalidades privadas. Los ejemplos de código usan dos códigos de escape definidos en el archivo de encabezado wiatwcmp.h, ESC_TWAIN_PRIVATE_SUPPORTED_CAPS y ESC_TWAIN_CAPABILITY.