Архитектура обработки ошибок WIA
Архитектура обработки ошибок WIA состоит из трех частей. Операционная система, драйвер и приложение. Механизм обработки ошибок зависит от потоковой передачи данных. Эта модель передачи доступна в Операционных системах Windows Vista и более поздних версий. Драйверы WIA должны быть написаны для использования этой модели передачи, если они поддерживают эту новую методологию обработки ошибок. Аналогичным образом, приложения также должны быть написаны для поддержки модели передачи на основе потока, чтобы иметь возможность принимать участие в этой новой архитектуре обработки ошибок.
Обработка ошибок WIA состоит из компонентов, предоставляемых системой, IHV и ISV. На следующей схеме показан поставщик каждого компонента.
Существует три возможных обработчика ошибок: обработчик ошибок приложения, обработчик ошибок драйвера и обработчик ошибок по умолчанию. Эти три обработчика ошибок показаны на следующей схеме.
На изображении также показана иерархия, в которой эти три обработчика ошибок используются обратным вызовом прокси-сервера WIA.
В большинстве аспектов эти обработчики идентичны. Однако есть несколько различий. Обработчик ошибок приложения реализует интерфейс IWiaAppErrorHandler , в то время как расширение выдачи ошибок драйвера и обработчик ошибок по умолчанию реализуют интерфейс IWiaErrorHandler . Обработчик ошибок приложения также будет использовать IWiaTransferCallback, который должен быть реализован в объекте обратного вызова.
Код состояния устройства передается в обработчик ошибок с параметром hrStatusIWiaErrorHandler::ReportStatus. Это то же значение, которое задано minidriver в параметре hrErrorStatus метода IWiaTransferCallback::WiaTransferParams .
Если параметру hrStatus задано значение SEVERITY_SUCCESS, это означает неустранимую задержку. Это означает, что пользовательский интерфейс обработки ошибок должен просто предоставлять немодерное информационное диалоговое окно и возможность отменить передачу. Пользовательский интерфейс должен быть закрыт при следующем получении обработчиком ошибок сообщения с другим значением hrStatus (поддерживает ли обработчик ошибок это сообщение).
Примечание Одновременно может отображаться только одно немодерное диалоговое окно обработчика ошибок.
Обработчик ошибок должен отображать модальный пользовательский интерфейс в ответ на сообщение о состоянии устройства SEVERITY_ERROR.
В обработке ошибок WIA участвуют четыре компонента:
Мини-диск WIA
Теперь мини-накопитель может использовать новый для Windows Vista WIA_TRANSFER_MSG_DEVICE_STATUS сообщение о состоянии устройства, чтобы указать, что что-то произошло на уровне устройства. Когда драйвер отправляет это сообщение, он также должен задать параметр hrErrorStatus (и, возможно, lPercentComplete) метода IWiaTransferCallback::WiaTransferParams . Код состояния может быть либо ошибкой, либо информационным. В случае кода состояния ошибки для восстановления после ошибки требуется вмешательство пользователя, при условии, что ошибка может быть восстановлена. Драйвер может задать для hrErrorStatus предопределенное значение HRESULT WIA, например WIA_STATUS_WARMING_UP, или создать собственный пользовательский HRESULT.
Обработчик ошибок приложения
Чтобы приложение включило обработку ошибок, оно должно реализовать интерфейс IWiaAppErrorHandler . Этот интерфейс реализуется объектом обратного вызова приложения, который он передает в методы IWiaTransfer::D ownload и IWiaTransfer::Upload . Этот объект обратного вызова необходим для реализации интерфейса IWiaTransferCallback . Реализуя IWiaAppErrorHandler, приложение указывает, что позволяет вызывать обработчики ошибок во время передачи данных.
Обработчик ошибок драйвера
Обработчик ошибок драйвера — это расширение драйвера, которое должно реализовывать интерфейс IWiaErrorHandler. Обработчик ошибок может обрабатывать и отображать пользовательский интерфейс для любого кода состояния; Эти коды состояния включают коды состояния, определяемые WIA, а также коды состояния, относящиеся к драйверу.
Обработчик ошибок по умолчанию
Обработчик ошибок по умолчанию реализуется WIA. Он обрабатывает и отображает пользовательский интерфейс для ряда универсальных сообщений о состоянии устройства. Это могут быть информационные сообщения и сообщения об ошибках, например WIA_ERROR_PAPER_JAM и WIA_STATUS_WARMING_UP.
Прокси-сервер WIA не обрабатывает сообщения об ошибках. Вместо этого прокси-сервер WIA предоставляет обработчикам ошибок возможность обработки сообщения о состоянии устройства.
Обработчик ошибок предоставляет пользовательский интерфейс, позволяющий пользователю попытаться перевести систему в состояние, в котором передача данных может быть продолжена или отменена.
При получении сообщения WIA_TRANSFER_MSG_DEVICE_STATUS прокси-сервер WIA сначала вызывает метод IWiaAppErrorHandler::ReportStatus обработчика ошибок приложения. Если подпрограмма обратного вызова приложения не обрабатывает код состояния устройства, прокси-сервер WIA вызовет реализацию IWiaErrorHandler::ReportStatus обработчика ошибок драйвера, и наконец прокси-сервер WIA вызовет реализацию IWiaErrorHandler::ReportStatus обработчика ошибок по умолчанию. Если данный обработчик не существует (например, драйвер может не поступить с расширением обработки ошибок) или обработчик состояния устройства драйвера возвращает WIA_STATUS_NOT_HANDLED, указывая, что обработчик драйвера не поддерживает код устройства, следующий обработчик в цепочке будет иметь шанс. После успешной или неудачной обработки сообщения о состоянии устройства будет возвращен обратный вызов прокси-сервера WIA. Таким образом, если метод ReportStatus обработчика ошибок драйвера возвращает S_OK для каждого сообщения, обработчик ошибок по умолчанию никогда не сможет обработать какие-либо сообщения о состоянии устройства.
Если обработчик ошибок не поддерживает сообщение о состоянии устройства с SEVERITY_ERROR (сообщение об ошибке), прокси-сервер WIA вернет ошибку состояния драйверу, который, в свою очередь, должен остановить передачу. Драйвер должен вернуть это значение HRESULT из IWiaMiniDrv::d rvAcquireItemData , и приложение получит этот HRESULT от IWiaTransfer::D ownload или IWiaTransfer::Upload.
Если обработчик ошибок не обрабатывает сообщение о состоянии устройства с SEVERITY_SUCCESS (информационное сообщение), прокси-сервер WIA вернет драйверу S_OK.
Примечание Подпрограмма обратного вызова приложения IWiaTransferCallback::TransferCallback никогда не получит сообщение с параметром lMessage , для WIA_TRANSFER_MSG_DEVICE_STATUS. Вместо этого эти сообщения будут отправляться обработчикам ошибок.
Интерфейсы IWiaTransferCallback, IWiaAppErrorHandler и IWiaTransfer описаны в документации по Microsoft Windows SDK.