WIA 错误处理体系结构

WIA 错误处理体系结构由三个部分组成。 操作系统、驱动程序和应用程序。 错误处理机制依赖于基于流的数据传输。 此传输模型在 Windows Vista 和更高版本的操作系统中可用。 如果 WIA 驱动程序要支持这种新的错误处理方法,则必须编写 WIA 驱动程序以使用此传输模型。 同样,还必须编写应用程序以支持基于流的传输模型,以便能够参与此新的错误处理体系结构。

WIA 错误处理由系统提供的、IHV 提供的和 ISV 提供的组件组成。 下图说明了每个组件的供应商。

说明 wia 错误处理组件的示意图。

有三种可能的错误处理程序:应用程序错误处理程序、驱动程序错误处理程序和默认错误处理程序。 下图显示了这三个错误处理程序。

说明三个 wia 错误处理程序的示意图。

该图还显示了 WIA 代理回调尝试这三个错误处理程序的层次结构。

在大多数方面,这些处理程序是相同的。 然而,有一些差异。 应用程序错误处理程序实现 IWiaAppErrorHandler 接口,而驱动程序错误处理扩展和默认错误处理程序实现 IWiaErrorHandler 接口。 应用程序错误处理程序还将使用必须在回调对象中实现的 IWiaTransferCallback

设备状态代码将传递到具有 iWiaErrorHandler::ReportStatus的 hrStatus 参数的错误处理程序中。 此值与 minidriver 在 IWiaTransferCallback::WiaTransferParams 方法的 hrErrorStatus 参数中设置的值相同。

如果 hrStatus 参数设置为 SEVERITY_SUCCESS,则表示非致命延迟。 这意味着错误处理 UI 应仅提供无模式的信息对话框,并有机会取消传输。 下次错误处理程序收到具有不同 hrStatus 值的消息时,应关闭 UI, (错误处理程序是否支持此消息) 。

注意 只能同时显示一个无模式错误处理程序对话框。

错误处理程序应显示模式 UI 以响应设备状态消息SEVERITY_ERROR。

WIA 错误处理涉及四个组件:

WIA 微型驱动程序
微型驱动程序现在可以使用 Windows Vista 的新增功能,WIA_TRANSFER_MSG_DEVICE_STATUS设备状态消息来指示在设备级别发生了某些事件。 当驱动程序发送此消息时,它还必须设置 hrErrorStatus (,可能还要设置 IWiaTransferCallback::WiaTransferParams 方法的 lPercentComplete) 参数。 状态代码可以是错误或信息性代码。 如果出现错误状态代码,则需要用户干预才能从错误中恢复,前提是该错误是可恢复的。 驱动程序可以将 hrErrorStatus 设置为预定义的 WIA HRESULT 值(例如WIA_STATUS_WARMING_UP),或创建自己的自定义 HRESULT。

应用程序错误处理程序
为了使应用程序能够启用错误处理,它必须实现 IWiaAppErrorHandler 接口。 此接口由传递到 IWiaTransfer::D ownload 和 IWiaTransfer::Upload 方法的应用程序回调对象实现。 实现 IWiaTransferCallback 接口需要此回调对象。 通过实现 IWiaAppErrorHandler,应用程序指示它允许在数据传输期间调用错误处理程序。

驱动程序的错误处理程序
驱动程序的错误处理程序是必须实现 IWiaErrorHandler 接口的驱动程序扩展。 错误处理程序可以处理和显示任何状态代码的 UI;这些状态代码包括 WIA 定义的状态代码以及特定于驱动程序的状态代码。

默认错误处理程序
默认错误处理程序由 WIA 实现。 它处理和显示大量通用设备状态消息的 UI。 这些消息可以是信息性的和错误的消息,例如:WIA_ERROR_PAPER_JAM和WIA_STATUS_WARMING_UP。

WIA 代理不处理错误消息本身。 相反,WIA 代理为错误处理程序提供了处理设备状态消息的机会。

错误处理程序提供的 UI 允许用户尝试将系统置于可以继续或取消数据传输的状态。

收到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 代理会将状态错误返回给驱动程序,驱动程序应停止传输。 驱动程序应从 IWiaMiniDrv::d rvAcquireItemData 返回此 HRESULT 值,应用程序将从 IWiaTransfer::D ownloadIWiaTransfer::Upload 收到此 HRESULT。

如果没有错误处理程序处理设备状态消息,SEVERITY_SUCCESS (信息性消息) ,WIA 代理将向驱动程序返回S_OK。

注意 应用程序的回调例程 IWiaTransferCallback::TransferCallback 永远不会收到 lMessage 设置为 WIA_TRANSFER_MSG_DEVICE_STATUS 的消息。 相反,这些消息将发送到错误处理程序。

Microsoft Windows SDK文档中介绍了 IWiaTransferCallbackIWiaAppErrorHandlerIWiaTransfer 接口。