Поделиться через


Использование escape-метода IStiUSD

Метод IStiUSD::Escape вызывается для передачи информации непосредственно в оборудование. Этот метод поддерживается только в операционных системах Windows XP и более поздних версий.

Весь обмен данными между приложением, совместимым с TWAIN, и драйвером WIA сначала передается диспетчеру источников данных (twain_32.dll), который, в свою очередь, вызывает уровень совместимости TWAIN (wiadss.dll). Затем уровень совместимости TWAIN вызывает метод IStiUSD::Escape драйвера WIA и передает методу один из следующих двух escape-кодов:

Escape-код ESC_TWAIN_CAPABILITY

ESC_TWAIN_PRIVATE_SUPPORTED_CAPS escape-код

Когда приложение TWAIN запрашивает список частных возможностей драйвера WIA, уровень совместимости TWAIN вызывает метод IStiUSD::Escape драйвера, передавая ESC_TWAIN_PRIVATE_SUPPORTED_CAPS в вызове. Если драйвер не поддерживает функциональность сквозной передачи, он возвращает список статических возможностей уровня совместимости TWAIN (по умолчанию). В противном случае драйвер возвращает список поддерживаемых частных возможностей на уровень совместимости TWAIN.

Когда приложение TWAIN отправляет операцию возможности, которая еще отсутствует в списке уровня совместимости TWAIN по умолчанию, уровень совместимости TWAIN вызывает метод IStiUSD::Escape драйвера, на этот раз передавая ESC_TWAIN_CAPABILITY в вызове.

Однако вышеуказавающее объяснение несколько упрощено. Когда приложение TWAIN запрашивает список частных возможностей драйвера, уровень совместимости TWAIN фактически выполняет два вызова метода IStiUSD::Escape драйвера. В первом вызове уровень совместимости TWAIN запрашивает драйвер WIA, сколько памяти требуется для хранения списка возможностей. Затем уровень совместимости TWAIN выделяет этот объем памяти для использования драйвером WIA. Во втором вызове уровень совместимости TWAIN запрашивает у драйвера WIA список возможностей, который драйвер WIA копирует в ранее упомянутую память. Уровень совместимости TWAIN отвечает за выделение и освобождение всей памяти, используемой в транзакциях TWAIN-WIA. Это не позволяет драйверу WIA освободить память, используемую уровнем совместимости TWAIN.

Уровень совместимости TWAIN также дважды вызывает метод IStiUSD::Escape драйвера, когда передается ESC_TWAIN_CAPABILITY и для которого требуется получить возможность. Первый вызов запрашивает драйвер WIA, сколько памяти ему требуется для хранения возможности, а второй вызов возвращает возможность. Обратите внимание, что для операций с возможностями SET требуется только один вызов IStiUSD::Escape, так как не требуется выделять память.

Все вызовы метода IStiUSD::Escape должны проверяться в следующем порядке:

  1. Проверьте код функции EscapeFunction . Если это недопустимо, немедленно завершится сбоем. Это предотвращает обработку неправильных кодов в драйвере.

  2. Проверьте входящий буфер lpInData. Если это недопустимо, немедленно завершится сбоем. Недопустимые входящие буферы могут привести к сбою драйвера WIA.

  3. Проверьте исходящий буфер pOutData. Если это недопустимо, немедленно завершится сбоем. Если драйвер не может выполнить запрос, записав необходимые данные, ему не нужно обрабатывать эти данные.

  4. Проверьте размер исходящего буфера. Если драйвер не может записать правильный объем данных в исходящий буфер, вызывающий объект не сможет правильно обработать эти данные.

Примеры кода в следующих разделах демонстрируют использование функции сквозной передачи, поддерживающей приложения TWAIN с частными возможностями. В примерах кода используются два escape-кода, определенных в файле заголовка wiatwcmp.h, ESC_TWAIN_PRIVATE_SUPPORTED_CAPS и ESC_TWAIN_CAPABILITY.

ESC_TWAIN_PRIVATE_SUPPORTED_CAPS escape-код

Escape-код ESC_TWAIN_CAPABILITY