Windows Biometric Framework не работает - PullRequest
0 голосов
/ 22 ноября 2018

Мой друг попросил меня написать простую программу, которая собирает отпечатки пальцев со встроенного в компьютер считывателя и печатает какой-то идентификатор.Я сам могу выбрать операционную систему, например ноутбук с Windows или Linux или телефон Android.

Я подумал, что это будет просто, конечно, для этого есть много API, и я заметил, что Microsoft на самом деле самапредоставляет API для этого.Поскольку я могу войти в свой ноутбук win10 с помощью считывателя отпечатков пальцев, я знаю, что считыватель работает.

По какой-то причине пример, который сами Microsoft предоставляют в своей документации, не работает для меня.https://docs.microsoft.com/en-us/windows/desktop/api/Winbio/nf-winbio-winbiocapturesample

Я полагаю, что люди, пишущие эти страницы, забыли упомянуть какой-то важный аспект или шаг, возможно, есть способ добавить разрешение где-нибудь в Visual Studio.

Переписав и попробовав много вещей, я, по крайней мере, продвинулся на один шаг вперед в процессе, но все равно не получилось.

Вот текущая версия

#include "pch.h"
#include <iostream>
#include "Windows.h"
#include "Stdio.h"
#include "Conio.h"
#include "Winbio.h"
HRESULT CaptureSample();
void capture(WINBIO_SESSION_HANDLE sessionHandle, int flag);

int main()
{
    std::cout << "Hello World!\n";
    HRESULT x = CaptureSample();
}

HRESULT CaptureSample()
{
    HRESULT hr = S_OK;
    WINBIO_SESSION_HANDLE sessionHandle = NULL;
    WINBIO_REJECT_DETAIL rejectDetail = 0;
    // Connect to the system pool. 
    hr = WinBioOpenSession(
        WINBIO_TYPE_FINGERPRINT,    // Service provider
        WINBIO_POOL_SYSTEM,         // Pool type
        WINBIO_FLAG_DEFAULT,            // 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"WinBioOpenSession failed. hr = 0x%x\n", hr);
        goto e_Exit;
    }

    wprintf_s(L"Start my fingerprint capturing...\n");
    capture(sessionHandle, WINBIO_DATA_FLAG_INTEGRITY);
    capture(sessionHandle, WINBIO_DATA_FLAG_PRIVACY);
    capture(sessionHandle, WINBIO_DATA_FLAG_SIGNED);
    capture(sessionHandle, WINBIO_DATA_FLAG_OPTION_MASK_PRESENT);
    capture(sessionHandle, WINBIO_DATA_FLAG_RAW);
    capture(sessionHandle, WINBIO_DATA_FLAG_INTERMEDIATE);
    capture(sessionHandle, WINBIO_DATA_FLAG_PROCESSED);
    hr = WinBioEnrollCapture(sessionHandle, &rejectDetail);
    wprintf_s(L"WinBioEnrollCapture hr=%x rejection = %d\n", hr, rejectDetail);

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

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

    return hr;

}

void capture(WINBIO_SESSION_HANDLE sessionHandle, int flag) {
    WINBIO_UNIT_ID unitId = 0;
    WINBIO_REJECT_DETAIL rejectDetail = 0;
    PWINBIO_BIR sample = NULL;
    SIZE_T sampleSize = 0;
    wprintf_s(L"\n Calling WinBioCaptureSample. Flag = %d.\n", flag);
    HRESULT hr = WinBioCaptureSample(
        sessionHandle,
        WINBIO_PURPOSE_IDENTIFY,
        flag,
        &unitId,
        &sample,
        &sampleSize,
        &rejectDetail
    );
    if (FAILED(hr))
    {
        if (hr == WINBIO_E_BAD_CAPTURE)
        {
            wprintf_s(L"\n Bad capture; reason: %d\n", rejectDetail);
        }
        else if (hr == E_ACCESSDENIED)
        {
            wprintf_s(L"\n WinBioCaptureSample failed, access denied.");
        }
        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;
    }


}

и вот результат ее запуска:

Hello World!
Start my fingerprint capturing...

 Calling WinBioCaptureSample. Flag = 1.

 WinBioCaptureSample failed, access denied.
 Calling WinBioCaptureSample. Flag = 2.

 WinBioCaptureSample failed, access denied.
 Calling WinBioCaptureSample. Flag = 4.

 WinBioCaptureSample failed, access denied.
 Calling WinBioCaptureSample. Flag = 8.

 WinBioCaptureSample failed, access denied.
 Calling WinBioCaptureSample. Flag = 32.

 WinBioCaptureSample failed, access denied.
 Calling WinBioCaptureSample. Flag = 64.

 WinBioCaptureSample failed, access denied.
 Calling WinBioCaptureSample. Flag = 128.

 WinBioCaptureSample failed, access denied.WinBioEnrollCapture hr=8009802c rejection = 0

 Press any key to exit...

Чего мне не хватает?

1 Ответ

0 голосов
/ 23 ноября 2018

Я думаю, вам следует попробовать использовать другой API, хотя ваша цель здесь не ясна.Вы можете проверить CloudABIS ™ , которая представляет собой суперскалярную систему сопоставления биометрии как услуги (BaaS) для быстрого развертывания при меньших затратах.API предоставляется M2SYS TEchnology, и у них также есть широкий спектр аппаратного обеспечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...