winBioCaptureSample 函数 (winbio.h)

捕获生物识别样本,并使用原始或已处理的数据 (BIR) 填充生物识别信息记录。

语法

HRESULT WinBioCaptureSample(
  [in]            WINBIO_SESSION_HANDLE SessionHandle,
  [in]            WINBIO_BIR_PURPOSE    Purpose,
  [in]            WINBIO_BIR_DATA_FLAGS Flags,
  [out, optional] WINBIO_UNIT_ID        *UnitId,
                  PWINBIO_BIR           *Sample,
  [out, optional] SIZE_T                *SampleSize,
  [out, optional] WINBIO_REJECT_DETAIL  *RejectDetail
);

参数

[in] SessionHandle

标识打开的生物识别会话 的WINBIO_SESSION_HANDLE 值。 通过调用 WinBioOpenSession 打开同步会话句柄。 通过调用 WinBioAsyncOpenSession 打开异步会话句柄。

[in] Purpose

指定示例的预期用途 的WINBIO_BIR_PURPOSE 位掩码。 这可以是以下值的按位 OR

  • WINBIO_PURPOSE_VERIFY
  • WINBIO_PURPOSE_IDENTIFY
  • WINBIO_PURPOSE_ENROLL
  • WINBIO_PURPOSE_ENROLL_FOR_VERIFICATION
  • WINBIO_PURPOSE_ENROLL_FOR_IDENTIFICATION

[in] Flags

一个 值,该值指定要应用于捕获的样本的处理类型。 这可以是以下安全和处理级别标志的按位 OR

  • WINBIO_DATA_FLAG_PRIVACY

加密示例。

  • WINBIO_DATA_FLAG_INTEGRITY

对示例进行签名或使用消息身份验证代码 (MAC)

  • WINBIO_DATA_FLAG_SIGNED

如果设置了此标志和WINBIO_DATA_FLAG_INTEGRITY标志,请对示例进行签名。 如果未设置此标志,但设置了WINBIO_DATA_FLAG_INTEGRITY标志,则计算 MAC。

  • WINBIO_DATA_FLAG_RAW

返回与传感器捕获的样本完全相同的样本。

  • WINBIO_DATA_FLAG_INTERMEDIATE

清理和筛选后返回示例。

  • WINBIO_DATA_FLAG_PROCESSED

在准备好用于 Purpose 参数指定的用途后,返回该示例。

[out, optional] UnitId

指向 WINBIO_UNIT_ID 值的指针,该值包含生成样本的生物识别单元的 ID。

Sample

接收指向包含示例的 WINBIO_BIR 结构的指针的变量的地址。 使用完 结构后,必须传递指向 WinBioFree 的指针,以释放为示例分配的内存。

[out, optional] SampleSize

指向SIZE_T值的指针,该值包含 Sample 参数中返回的WINBIO_BIR结构的大小(以字节为单位)。

[out, optional] RejectDetail

指向 WINBIO_REJECT_DETAIL 值的指针,该值包含有关捕获生物识别样本失败的其他信息。 如果捕获成功,此参数将设置为零。 为指纹捕获定义了以下值:

  • WINBIO_FP_TOO_HIGH
  • WINBIO_FP_TOO_LOW
  • WINBIO_FP_TOO_LEFT
  • WINBIO_FP_TOO_RIGHT
  • WINBIO_FP_TOO_FAST
  • WINBIO_FP_TOO_SLOW
  • WINBIO_FP_POOR_QUALITY
  • WINBIO_FP_TOO_SKEWED
  • WINBIO_FP_TOO_SHORT
  • WINBIO_FP_MERGE_FAILURE

返回值

如果函数成功,则返回 S_OK。 如果函数失败,它将返回指示错误的 HRESULT 值。 可能的值包括(但并不限于)下表中的项。 有关常见错误代码的列表,请参阅 常见 HRESULT 值

返回代码 说明
E_ACCESSDENIED
调用方无权捕获原始样本,或者未使用 WINBIO_FLAG_RAW 标志打开会话。
E_HANDLE
会话句柄无效。
E_NOTIMPL
生物识别单元不支持请求的操作。
E_POINTER
UnitIdSampleSampleSizeRejectDetail 指针不能为 NULL
WINBIO_E_ENROLLMENT_IN_PROGRESS
无法完成该操作,因为生物识别单元当前仅用于系统池 () 注册事务。
WINBIO_E_INVALID_OPERATION
无法完成操作,因为传感器池中存在安全传感器。

注解

若要成功调用此函数,必须通过在 WinBioOpenSession 或 WinBioAsyncOpenSession 函数的 Flags 参数中指定WINBIO_FLAG_RAW来打开会话句柄。 目前,只有管理员和本地系统帐户下运行的应用程序才具有必要的权限。

“用途”和“标志”参数的有效组合取决于所使用的生物识别单元的功能。 请查阅供应商的传感器文档,以确定哪些有效 用途标志 值组合受支持,以及它们如何影响捕获的数据。 使用完示例后,应用程序必须调用 WinBioFree 才能释放 WinBioCaptureSample 函数为其分配的内存。

若要同步使用 WinBioCaptureSample ,请使用通过调用 WinBioOpenSession 创建的会话句柄调用函数。 在捕获示例或遇到错误之前,函数会阻塞。 使用系统池调用 WinBioCaptureSample 将阻止,直到调用应用程序具有窗口焦点,并且用户向池中的传感器之一提供示例。 如果用户选择的传感器已用于注册事务,则函数将失败并返回 WINBIO_E_ENROLLMENT_IN_PROGRESS

若要异步使用 WinBioCaptureSample ,请使用通过调用 WinBioAsyncOpenSession 创建的会话句柄调用 函数。 框架分配 WINBIO_ASYNC_RESULT 结构,并使用它来返回有关操作成功或失败的信息。 如果捕获操作成功,框架将在嵌套的 CaptureSample 结构中返回有关示例的信息。 如果操作不成功,框架将返回错误信息。 WINBIO_ASYNC_RESULT 结构将返回到应用程序回调或应用程序消息队列,具体取决于在 WinBioAsyncOpenSession 函数的 NotificationMethod 参数中设置的值:

  • 如果选择使用回调接收完成通知,则必须实现 PWINBIO_ASYNC_COMPLETION_CALLBACK 函数并将 NotificationMethod 参数设置为 WINBIO_ASYNC_NOTIFY_CALLBACK
  • 如果选择使用应用程序消息队列接收完成通知,则必须将 NotificationMethod 参数设置为 WINBIO_ASYNC_NOTIFY_MESSAGE。 框架返回指向窗口消息的 LPARAM 字段的WINBIO_ASYNC_RESULT指针。
若要防止内存泄漏,必须在使用完WINBIO_ASYNC_RESULT结构后调用 WinBioFree 以释放它。

Windows 7: 可以使用 WinBioCaptureSampleWithCallback 函数异步执行此操作。 函数验证输入参数并立即返回。 如果输入参数无效,该函数将返回错误代码。 否则,框架在另一个线程上启动操作。 当异步操作完成或遇到错误时,框架会将结果发送到应用程序实现 的 PWINBIO_CAPTURE_CALLBACK 函数。

示例

以下函数调用 WinBioCaptureSample 来捕获用户的生物识别样本。 链接到 Winbio.lib 静态库并包含以下头文件:

  • Windows.h
  • Stdio.h
  • Conio.h
  • Winbio.h
HRESULT CaptureSample()
{
    HRESULT hr = S_OK;
    WINBIO_SESSION_HANDLE sessionHandle = NULL;
    WINBIO_UNIT_ID unitId = 0;
    WINBIO_REJECT_DETAIL rejectDetail = 0;
    PWINBIO_BIR sample = NULL;
    SIZE_T sampleSize = 0;

    // Connect to the system pool. 
    hr = WinBioOpenSession( 
            WINBIO_TYPE_FINGERPRINT,    // Service provider
            WINBIO_POOL_SYSTEM,         // Pool type
            WINBIO_FLAG_RAW,            // Access: Capture raw data
            NULL,                       // Array of biometric unit IDs
            0,                          // Count of biometric unit IDs
            WINBIO_DB_DEFAULT,          // Default database
            &sessionHandle              // [out] Session handle
            );
    if (FAILED(hr))
    {
        wprintf_s(L"\n WinBioOpenSession failed. hr = 0x%x\n", hr);
        goto e_Exit;
    }

    // Capture a biometric sample.
    wprintf_s(L"\n Calling WinBioCaptureSample - Swipe sensor...\n");
    hr = WinBioCaptureSample(
            sessionHandle,
            WINBIO_NO_PURPOSE_AVAILABLE,
            WINBIO_DATA_FLAG_RAW,
            &unitId,
            &sample,
            &sampleSize,
            &rejectDetail
            );
    if (FAILED(hr))
    {
        if (hr == WINBIO_E_BAD_CAPTURE)
        {
            wprintf_s(L"\n Bad capture; reason: %d\n", rejectDetail);
        }
        else
        {
            wprintf_s(L"\n WinBioCaptureSample failed. hr = 0x%x\n", hr);
        }
        goto e_Exit;
    }

    wprintf_s(L"\n Swipe processed - Unit ID: %d\n", unitId);
    wprintf_s(L"\n Captured %d bytes.\n", sampleSize);


e_Exit:
    if (sample != NULL)
    {
        WinBioFree(sample);
        sample = NULL;
    }

    if (sessionHandle != NULL)
    {
        WinBioCloseSession(sessionHandle);
        sessionHandle = NULL;
    }

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

    return hr;
}


要求

   
最低受支持的客户端 Windows 7 [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 R2 [仅限桌面应用]
目标平台 Windows
标头 winbio.h (包括 Winbio.h)
Library Winbio.lib
DLL Winbio.dll

另请参阅

WinBioCaptureSampleWithCallback