WIA 错误处理程序返回值

所有错误处理程序都必须遵守许多有关其返回值的规则。

以下是所有有效的返回值:

S_OK
已成功处理设备状态代码。 不会再调用错误处理程序。

如果错误状态代码 (模式对话框) ,这意味着已采取适当的操作来更正错误,例如 ADF 的卡纸。

对于信息性状态代码,这仅意味着已采取适当的操作为用户提供无模式对话框,并且不应将设备消息转发到该行下的任何其他错误处理程序。

WIA_STATUS_NOT_HANDLED
未采取任何操作来处理错误或向用户报告状态。 下一个处理程序 (是否将调用列表中的任何) 。

这应该是错误处理程序的默认返回值。

S_FALSE
用户取消了处理程序的无模式对话的传输。 无论 (处理、未处理、错误或信息性) 的设备状态代码是什么,错误处理程序都可以随时返回此返回值。

其他错误代码
如果无法从中恢复设备错误,或者用户选择停止传输以响应显示的模式对话框,则错误处理程序应返回设备状态代码本身 (查看示例部分) 的示例。 这当然意味着错误处理程序会处理设备状态代码。

此外,错误处理程序在处理设备状态代码时必须一致。 也就是说,错误处理程序的实例不能选择在时间 t0 处理状态代码WIA_STATUS_XYZ (或WIA_ERROR_XYZ) ,然后决定不在时间 t1 处理它。

以下代码是无效错误处理程序的示例:

STDMETHODIMP
CErrHandler::ReportStatus(
    IN  LONG        lFlags,
    IN  HWND        hwndParent,
    IN  IWiaItem2   *pWiaItem2,
    IN  HRESULT     hrStatus,
    IN  LONG        lPercentComplete)
{
    HRESULT hr = WIA_STATUS_NOT_HANDLED;
    if ((hrStatus == WIA_ERROR_PAPER_JAM) && HandleMessageNow())
    {
        ...
    }
    return hr;
}

删除 HandleMessageNow 例程将使此成为有效的错误处理程序。