Win32 API 日本語リファレンス
ホーム › Devices.BiometricFramework › PWINBIO_IDENTIFY_CALLBACK

PWINBIO_IDENTIFY_CALLBACK

コールバック

シグネチャ

void PWINBIO_IDENTIFY_CALLBACK(
    void* IdentifyCallbackContext,
    HRESULT OperationStatus,
    DWORD UnitId,
    WINBIO_IDENTITY* Identity,
    BYTE SubFactor,
    DWORD RejectDetail
);

パラメーター

フィールド型説明
IdentifyCallbackContextvoid*アプリケーションが定義し、WinBioIdentifyWithCallback 関数の IdentifyCallbackContext パラメーターに渡されたバッファーへのポインター。このバッファーは、フレームワークや生体認証ユニットによって変更されません。アプリケーションは、このデータを使用して実行する処理を判断したり、生体情報のキャプチャに関する追加情報を保持したりできます。
OperationStatusHRESULTキャプチャ操作から返されたエラーコード。
UnitIdDWORD生体認証ユニットの ID 番号。
IdentityWINBIO_IDENTITY*生体情報サンプルを提供したユーザーの GUID または SID を受け取る WINBIO_IDENTITY 構造体。
SubFactorBYTE生体情報サンプルに関連付けられたサブファクターを受け取る WINBIO_BIOMETRIC_SUBTYPE 値。詳細については「解説」を参照してください。
RejectDetailDWORD操作の実行に失敗した場合の追加情報。詳細については「解説」を参照してください。

公式ドキュメント

PWINBIO_IDENTIFY_CALLBACK 関数は、非同期の WinBioIdentifyWithCallback 関数から結果を返すために、Windows 生体認証フレームワーク (Windows Biometric Framework) によって呼び出されます。この関数はクライアントアプリケーションが実装する必要があります。

重要 Windows 8 以降では、PWINBIO_IDENTIFY_CALLBACK/WinBioIdentifyWithCallback の組み合わせを使用しないことを推奨します。代わりに、次の手順を実行してください。
  • 操作の完了通知を受け取るために、PWINBIO_ASYNC_COMPLETION_CALLBACK 関数を実装します。
  • WinBioAsyncOpenSession 関数を呼び出します。CallbackRoutine パラメーターにコールバックのアドレスを渡します。NotificationMethod パラメーターには WINBIO_ASYNC_NOTIFY_CALLBACK を渡します。非同期セッションハンドルを取得します。
  • 取得した非同期セッションハンドルを使用して WinBioIdentify を呼び出します。操作が完了すると、Windows 生体認証フレームワークは結果を格納した WINBIO_ASYNC_RESULT 構造体を割り当てて初期化し、その結果構造体へのポインターを指定してコールバックを呼び出します。
  • コールバックの実装内で WinBioFree を呼び出し、WINBIO_ASYNC_RESULT 構造体の使用が終わった後に解放します。

解説(Remarks)

現在、Windows 生体認証フレームワークは指紋リーダーのみをサポートしています。そのため、操作が失敗して WINBIO_REJECT_DETAIL 定数で追加情報が返される場合、その値は次のいずれかになります。

例

次のコード例では、WinBioIdentifyWithCallback を呼び出して、生体情報のスキャンからユーザーを識別します。WinBioIdentifyWithCallback は非同期関数であり、別のスレッドで生体情報の入力を処理するように生体認証サブシステムを構成します。生体認証サブシステムからの出力は、IdentifyCallback という名前の独自のコールバック関数に送られます。Winbio.lib スタティックライブラリをリンクし、次のヘッダーファイルをインクルードしてください。

HRESULT IdentifyWithCallback(BOOL bCancel)
{
    // Declare variables.
    HRESULT hr = S_OK;
    WINBIO_SESSION_HANDLE sessionHandle = NULL;

    // Connect to the system pool. 
    hr = WinBioOpenSession( 
            WINBIO_TYPE_FINGERPRINT,    // Service provider
            WINBIO_POOL_SYSTEM,         // Pool type 
            WINBIO_FLAG_DEFAULT,        // Configuration and access 
            NULL,                       // Array of biometric unit IDs 
            0,                          // Count of biometric unit IDs 
            WINBIO_DB_DEFAULT,          // Database ID 
            &sessionHandle              // [out] Session handle
            );
    if (FAILED(hr))
    {
        wprintf_s(L"\n WinBioOpenSession failed. hr = 0x%x\n", hr);
        goto e_Exit;
    }

    // Call WinBioIdentifyWithCallback. The method is asynchronous
    // and returns immediately.
    wprintf_s(L"\n Calling WinBioIdentifyWithCallback");
    wprintf_s(L"\n Swipe the sensor ...\n");
    hr = WinBioIdentifyWithCallback( 
            sessionHandle,              // Open biometric session
            IdentifyCallback,           // Callback function
            NULL                        // Optional context
            );
    if (FAILED(hr))
    {
        wprintf_s(L"\n WinBioIdentifyWithCallback failed. hr = 0x%x\n", hr);
        goto e_Exit;
    }

    // Cancel user identification if the bCancel flag is set.
    if (bCancel)
    {
        wprintf_s(L"\n Starting CANCEL timer...\n");
        Sleep( 7000 );

        wprintf_s(L"\n Calling WinBioCancel\n");
        hr = WinBioCancel( sessionHandle );
        if (FAILED(hr))
        {
            wprintf_s(L"\n WinBioCancel failed. hr = 0x%x\n", hr);
            goto e_Exit;
        }
    }

    // Wait for the asynchronous identification process to complete 
    // or be canceled.
    hr = WinBioWait( sessionHandle );
    if (FAILED(hr))
    {
        wprintf_s(L"\n WinBioWait failed. hr = 0x%x\n", hr);
    }

e_Exit:

    if (sessionHandle != NULL)
    {
       wprintf_s(L"\n Closing the session.\n");

        hr = WinBioCloseSession(sessionHandle);
        if (FAILED(hr))
        {
            wprintf_s(L"\n WinBioCloseSession failed. hr = 0x%x\n", hr);
        }
        sessionHandle = NULL;
    }

    wprintf_s(L"\n Hit any key to exit...");
    _getch();

    return hr;
}

//------------------------------------------------------------------------
// The following function is the callback for WinBioIdentifyWithCallback.
// The function filters the response from the biometric subsystem and 
// writes a result to the console window.
// 
VOID CALLBACK IdentifyCallback(
    __in_opt PVOID IdentifyCallbackContext,
    __in HRESULT OperationStatus,
    __in WINBIO_UNIT_ID UnitId,
    __in WINBIO_IDENTITY *Identity,
    __in WINBIO_BIOMETRIC_SUBTYPE SubFactor,
    __in WINBIO_REJECT_DETAIL RejectDetail
    )
{
    UNREFERENCED_PARAMETER(IdentifyCallbackContext);
    UNREFERENCED_PARAMETER(Identity);

    wprintf_s(L"\n IdentifyCallback executing");
    wprintf_s(L"\n Swipe processed for unit ID %d\n", UnitId);

    // The attempt to process the fingerprint failed.
    if (FAILED(OperationStatus))
    {
        if (OperationStatus == WINBIO_E_UNKNOWN_ID)
        {
            wprintf_s(L"\n Unknown identity.\n");
        }
        else if (OperationStatus == WINBIO_E_BAD_CAPTURE)
        {
            wprintf_s(L"\n Bad capture; reason: %d\n", RejectDetail);
        }
        else
        {
            wprintf_s(L"IdentifyCallback failed.");
            wprintf_s(L"OperationStatus = 0x%x\n", OperationStatus); 
        }
    }
    // Processing succeeded and the finger swiped is written
    // to the console window.
    else
    {
        wprintf_s(L"\n The following finger was used:");
        switch (SubFactor)
        {
            case WINBIO_SUBTYPE_NO_INFORMATION:
                wprintf_s(L"\n No information\n");
                break;
            case WINBIO_ANSI_381_POS_RH_THUMB:
                wprintf_s(L"\n RH thumb\n");
                break;
            case WINBIO_ANSI_381_POS_RH_INDEX_FINGER:
                wprintf_s(L"\n RH index finger\n");
                break;
            case WINBIO_ANSI_381_POS_RH_MIDDLE_FINGER:
                wprintf_s(L"\n RH middle finger\n");
                break;
            case WINBIO_ANSI_381_POS_RH_RING_FINGER:
                wprintf_s(L"\n RH ring finger\n");
                break;
            case WINBIO_ANSI_381_POS_RH_LITTLE_FINGER:
                wprintf_s(L"\n RH little finger\n");
                break;
            case WINBIO_ANSI_381_POS_LH_THUMB:
                wprintf_s(L"\n LH thumb\n");
                break;
            case WINBIO_ANSI_381_POS_LH_INDEX_FINGER:
                wprintf_s(L"\n LH index finger\n");
                break;
            case WINBIO_ANSI_381_POS_LH_MIDDLE_FINGER:
                wprintf_s(L"\n LH middle finger\n");
                break;
            case WINBIO_ANSI_381_POS_LH_RING_FINGER:
                wprintf_s(L"\n LH ring finger\n");
                break;
            case WINBIO_ANSI_381_POS_LH_LITTLE_FINGER:
                wprintf_s(L"\n LH little finger\n");
                break;
            case WINBIO_SUBTYPE_ANY:
                wprintf_s(L"\n Any finger\n");
                break;
            default:
                break;
        }
    }
}

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)