次の方法で共有


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 ルーチンを削除すると、有効なエラー ハンドラーになります。