PIBIO_SENSOR_FINISH_CAPTURE_FN fungsi panggilan balik (winbio_adapter.h)
Dipanggil oleh Windows Biometric Framework untuk menunggu penyelesaian operasi penangkapan yang dimulai oleh fungsi SensorAdapterStartCapture .
Sintaks
PIBIO_SENSOR_FINISH_CAPTURE_FN PibioSensorFinishCaptureFn;
HRESULT PibioSensorFinishCaptureFn(
[in, out] PWINBIO_PIPELINE Pipeline,
[out] PWINBIO_REJECT_DETAIL RejectDetail
)
{...}
Parameter
[in, out] Pipeline
Penunjuk ke struktur WINBIO_PIPELINE yang terkait dengan unit biometrik yang melakukan operasi.
[out] RejectDetail
Arahkan ke nilai WINBIO_REJECT_DETAIL yang menerima informasi tambahan tentang kegagalan untuk mengambil sampel biometrik. Jika operasi berhasil, parameter ini diatur ke nol. Nilai berikut didefinisikan untuk sampel sidik jari:
- 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
Mengembalikan nilai
Jika fungsi berhasil, fungsi akan mengembalikan S_OK. Jika fungsi gagal, fungsi mengembalikan nilai HRESULT yang menunjukkan kesalahan. Nilai berikut akan dikenali oleh Windows Biometric Framework.
Menampilkan kode | Deskripsi |
---|---|
|
Sampel tidak dapat ditangkap. Jika Anda mengembalikan kode kesalahan ini, Anda juga harus menentukan nilai dalam parameter RejectDetail yang menunjukkan sifat masalah. |
|
Driver sensor mengembalikan ERROR_CANCELLED atau ERROR_OPERATION_ABORTED. |
|
Terjadi kegagalan perangkat. |
|
Anggota SensorContext dari struktur WINBIO_PIPELINE yang diacu oleh argumen Alur adalah NULL atau anggota SensorHandle diatur ke INVALID_HANDLE_VALUE. |
Keterangan
Windows Biometric Framework memanggil fungsi ini setelah berhasil memanggil SensorAdapterStartCapture atau memanggil SensorAdapterCancel. Ini tidak memanggil fungsi ini jika panggilan ke SensorAdapterStartCapture gagal.
Ketika implementasi fungsi ini kembali, data dalam alur harus siap untuk panggilan berikutnya ke fungsi seperti SensorAdapterPushDataToEngine atau SensorAdapterExportSensorData.
Ini adalah fungsi pemblokiran yang harus kembali hanya setelah operasi I/O sensor berhasil, gagal, atau dibatalkan. Biasanya, Anda akan membuat blok fungsi ini dengan meneruskan struktur TUMPANG TINDIH dalam konteks adaptor sensor ke fungsi GetOverlappedResult . Handel hEvent dalam struktur TUMPANG TINDIH harus diberi sinyal ketika SensorAdapterFinishCapture kembali. Fungsi GetOverlappedResult mengatur handel ini secara otomatis saat mendeteksi akhir operasi I/O sensor. Jika adaptor Anda menggunakan beberapa mekanisme lain untuk mendeteksi penyelesaian I/O, Anda harus memberi sinyal peristiwa sendiri.
Contoh
Pseudocode berikut menunjukkan satu kemungkinan implementasi fungsi ini. Contoh tidak dikompilasi. Anda harus menyesuaikannya agar sesuai dengan tujuan Anda.
//////////////////////////////////////////////////////////////////////////////////////////
//
// SensorAdapterFinishCapture
//
// Purpose:
// Waits for the completion of a capture operation initiated by the
// SensorAdapterStartCapture function.
//
// Parameters:
// Pipeline - Pointer to a WINBIO_PIPELINE structure associated with
// the biometric unit.
// RejectDetail - Pointer to a WINBIO_REJECT_DETAIL value that receives
// additional information about the failure to capture a
// biometric sample.
//
static HRESULT
WINAPI
SensorAdapterFinishCapture(
__inout PWINBIO_PIPELINE Pipeline,
__out PWINBIO_REJECT_DETAIL RejectDetail
)
{
HRESULT hr = S_OK;
WINBIO_SENSOR_STATUS sensorStatus = WINBIO_SENSOR_FAILURE;
WINBIO_CAPTURE_PARAMETERS captureParameters = {0};
BOOL result = TRUE;
DWORD bytesReturned = 0;
// Verify that pointer arguments are not NULL.
if (!ARGUMENT_PRESENT(Pipeline) ||
!ARGUMENT_PRESENT(RejectDetail))
{
hr = E_POINTER;
goto cleanup;
}
// Retrieve the context from the pipeline.
PWINBIO_SENSOR_CONTEXT sensorContext =
(PWINBIO_SENSOR_CONTEXT)Pipeline->SensorContext;
// Verify the state of the pipeline.
if (sensorContext == NULL ||
Pipeline->SensorHandle == INVALID_HANDLE_VALUE)
{
return WINBIO_E_INVALID_DEVICE_STATE;
}
// Initialize the RejectDetail argument.
*RejectDetail = 0;
// Wait for I/O completion. This sample assumes that the I/O operation was
// started using the code example shown in the SensorAdapterStartCapture
// documentation.
SetLastError(ERROR_SUCCESS);
result = GetOverlappedResult(
Pipeline->SensorHandle,
&sensorContext->Overlapped,
&bytesReturned,
TRUE
);
if (!result)
{
// There was an I/O error.
return _AdapterGetHresultFromWin32(GetLastError());
}
if (bytesReturned == sizeof (DWORD))
{
// The buffer is not large enough. This can happen if a device needs a
// bigger buffer depending on the purpose. Allocate a larger buffer and
// force the caller to reissue their I/O request.
DWORD allocationSize = sensorContext->CaptureBuffer->PayloadSize;
// Allocate at least the minimum buffer size needed to retrieve the
// payload structure.
if (allocationSize < sizeof(WINBIO_CAPTURE_DATA))
{
allocationSize = sizeof(WINBIO_CAPTURE_DATA);
}
// Free the old buffer and allocate a new one.
_AdapterRelease(sensorContext->CaptureBuffer);
sensorContext->CaptureBuffer = NULL;
sensorContext->CaptureBuffer =
(PWINBIO_CAPTURE_DATA)_AdapterAlloc(allocationSize);
if (sensorContext->CaptureBuffer == NULL)
{
sensorContext->CaptureBufferSize = 0;
return E_OUTOFMEMORY;
}
sensorContext->CaptureBufferSize = allocationSize;
return WINBIO_E_BAD_CAPTURE;
}
// Normalize the status value before sending it back to the biometric service.
if (sensorContext->CaptureBuffer != NULL &&
sensorContext->CaptureBufferSize >= sizeof (WINBIO_CAPTURE_DATA))
{
switch (sensorContext->CaptureBuffer->SensorStatus)
{
case WINBIO_SENSOR_ACCEPT:
// The capture was acceptable.
break;
case WINBIO_SENSOR_REJECT:
// The capture was not acceptable. Overwrite the WinBioHresult value
// in case it has not been properly set.
sensorContext->CaptureBuffer->WinBioHresult = WINBIO_E_BAD_CAPTURE;
break;
case WINBIO_SENSOR_BUSY:
// The device is busy. Reset the WinBioHresult value in case it
// has not been properly set.
sensorContext->CaptureBuffer->WinBioHresult = WINBIO_E_DEVICE_BUSY;
break;
case WINBIO_SENSOR_READY:
case WINBIO_SENSOR_NOT_CALIBRATED:
case WINBIO_SENSOR_FAILURE:
default:
// There has been a device failure. Reset the WinBioHresult value
// in case it has not been properly set.
sensorContext->CaptureBuffer->WinBioHresult = WINBIO_E_INVALID_DEVICE_STATE;
break;
}
*RejectDetail = sensorContext->CaptureBuffer->RejectDetail;
hr = sensorContext->CaptureBuffer->WinBioHresult;
}
else
{
// The buffer is not large enough or the buffer pointer is NULL.
hr = WINBIO_E_INVALID_DEVICE_STATE;
}
return hr;
}
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows 7 [hanya aplikasi desktop] |
Server minimum yang didukung | Windows Server 2008 R2 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | winbio_adapter.h (termasuk Winbio_adapter.h) |