我是 c++ 和 vc++ 的新手,我使用了 3rd 方库bioapi
。我成功集成了它,但是当我尝试使用和的示例工作程序时,bioapi
我得到了一个错误和。misc.h
misc.cpp
LNK2005
LNK1160
顺便说一句,我在 vc++ 中将它创建为 CLR 项目,看来我不能使用 /FORCE 或 /FORCE:MULTIPLE。
这是杂项.h
/*---------------------------------------------------------------*/
/* */
/* Copyright (C) NEC Corporation 2011 */
/* NEC CONFIDENTIAL AND PROPRIETARY */
/* */
/* All rights reserved by NEC Corporation. This program must be */
/* used solely for the purpose for which it was furnished by NEC */
/* Corporation. No part of this program may be reproduced or */
/* disclosed to others, in any form, without the prior written */
/* permission of NEC Corporation. Use of copyright notice does */
/* not evidence publication of this program. */
/* */
/* NEC Corporation accepts no responsibility for any damages */
/* resulting from the use of this sample code. */
/* This sample code is provided "AS IS", and its user assume all */
/* risks when using it. */
/* */
/*---------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <sys/types.h> /* for stat() */
#include <sys/stat.h> /* for stat() */
#include <direct.h> /* for _mkdir() */
//#include "stdafx.h"
//#include "resource.h"
#include "BioAPI.h" /* include BioAPI Framework */
#include "BioAPI_util.h" /* include BioAPI Framework */
#include "hf-pid-bsp.h"
/*--------------------------------------------------------------------
*
* define
*
*--------------------------------------------------------------------*/
#define MaxN 1000 /* Max Identify Num */
#define MaxEnrollNum 999 /* Max Enroll Num */
#define MaxID 9999 /* Max Enroll ID */
#define MinID 0 /* Min Enroll ID */
#define Timeout 10000 /* Capture Timeout */
#define ERRCODE_ID_INPUT_ERROR -100
#define ERRCODE_NOT_ENROLLED -101
#define SECTION_IDENTIFYPARAM "IdentifyParam"
#define KEY_MAXNUMBEROFRESULTS "MaxNumberOfResults"
#define MESS_ALLEADY_STARTED "Application is already started."
#define MESS_USERREG "UserReg"
#define MESS_AP_ERROR "Error"
#define MESS_ID_INPUT_ERROR TEXT("Please input a value in the range of 0001-9999")
#define MESS_NOT_ENROLLED TEXT("The ID does not exist for")
#define MESS_BIOAPI_ERROR TEXT("BioAPI Error")
#define MESS_BIOAPI_ERROR_CODE TEXT("BioAPI Error Code: %ld")
#define MESS_ENROLL "Enrollment"
#define MESS_ENROLL_FAILED "Enroll process is failed."
#define MESS_ENROLL_SUCCESSED "Enroll process is successed."
#define MESS_VERIFY "Verification"
#define MESS_VERIFY_FAILED "Verification failed."
#define MESS_VERIFY_OK "Verification process is successed."
#define MESS_VERIFY_NG "Verification process is failed."
#define MESS_IDENTIFY "Identification"
#define MESS_IDENTIFY_FAILED "Identification failed."
#define MESS_IDENTIFY_OK "Identification process is successed."
#define MESS_IDENTIFY_NG "Identification process is failed."
#define MESS_CAPTION "Sample Application"
#define MESS_END "Exit"
#define MESS_MESSAGE1 "Please choose the function."
#define MESS_CLOSE "Close"
#define MESS_ENROLL1 "Enroll"
#define MESS_ENROLL2 "CreateTemplate"
#define MESS_MESSAGE2 "After entering ID(0001`9999), Please click [Enroll] button or [CreateTemplate] button."
#define MESS_ID "ID:"
#define MESS_ONETOONE "1:1 Verification"
#define MESS_ONETON "1:N Identification"
#define MESS_MESSAGE3 "Please choose the verification method."
#define MESS_VERIFY1 "VerifyMatch"
#define MESS_VERIFY2 "Verify"
#define MESS_MESSAGE4 "After entering ID(0001`9999), Please click [Verify] button or [Verification] button."
#define MESS_IDENTIFY1 "IdentifyMatch"
#define MESS_IDENTIFY2 "Identify"
#define MESS_MESSAGE5 "Please click [Identify] button or [Identification] button."
#define MESS_AUTH_MESSAGE "Identification process is successed.\r\nMaxNumberOfResults = (%d)\r\nNumberOfResults = (%d)\r\nID:"
#define MESS_INIFILE_GET_FAILED "sample.ini get failed."
#define PATH_ENROLLED_FILE ".\\enroll\\*.dat"
#define PATH_ENROLLED_FILE_IN_ID ".\\enroll\\%04d_*.dat"
#define PATH_ENROLLED_DIRECTORY ".\\enroll"
#define PATH_ENROLLED_NAME TEXT(".\\enroll\\%s_%03d.dat")
#define PATH_ENROLLED_DIRECTORY ".\\enroll"
#define INIFILE_NAME ".\\sample.ini"
/*--------------------------------------------------------------------
*
* global
*
*--------------------------------------------------------------------*/
static BioAPI_HANDLE gModuleHandle;
static BioAPI_RETURN bioReturn;
static BioAPI_BIR_HANDLE StoredTemplate;
static BioAPI_INPUT_BIR CapturedBIR;
static BioAPI_INPUT_BIR ProcessedBIR;
static BioAPI_INPUT_BIR StoredBIR;
static BioAPI_BIR_HANDLE CapturedTemplate;
static BioAPI_BOOL boolie = BioAPI_FALSE;
static BioAPI_BOOL result;
static BioAPI_FRR frr = HF_PID_BSP_LEVEL_MIDDLE; // Security Level
static BioAPI_FAR AchievedFAR = 1;
static uint32 MaxNumberOfResults = 1;
static uint32 NumberOfResults;
static BioAPI_CANDIDATE_ARRAY_PTR Candidates;
static BioAPI_INPUT_BIR InputBirProcessed_PopulationElem[MaxN];
static BioAPI_IDENTIFY_POPULATION *Population;
static BioAPI_BIR_PTR lpPopulationAryBIRData_Member;
static HANDLE hSearch;
static char fname_db[MAX_PATH + 1];
static char fid_db[MAX_PATH + 1];
static WIN32_FIND_DATA fd;
static BioAPI_BIR_ARRAY_POPULATION lPopulationAryBIRData;
static BioAPI_BIR_PTR FullBIR;
static BioAPI_UUID BSPUuid = HF_PID_BSP_UUID;
typedef struct stBIR_AND_FileName {
BioAPI_BIR* pPopulationBIRPointer;
char lptszUserName[_MAX_PATH];
}BIR_AND_FILENAME;
static BIR_AND_FILENAME RetBIR_And_FileName[MaxN];
static BioAPI_CANDIDATE_ARRAY lpWorkCandidates;
static char IdentificationMessage[MAX_PATH + 1];
/*--------------------------------------------------------------------
*
* function
*
*--------------------------------------------------------------------*/
void PrintErrorCode(BioAPI_RETURN bioReturn);
void LoadBSP(BioAPI_HANDLE_PTR gModuleHandle);
void ReleaseBSP(BioAPI_HANDLE_PTR gModuleHandle);
BioAPI_RETURN OutputToFile(BioAPI_HANDLE gModuleHandle, LPTSTR lptszUserName, BioAPI_BIR_HANDLE BirHandle);
BioAPI_RETURN InputFromFile(LPTSTR lptszUserName, BioAPI_INPUT_BIR * InputBir, uint32 count);
/*--------------------------------------------------------------------
*
* End of misc.h
*
*--------------------------------------------------------------------*/
杂项cpp
/*---------------------------------------------------------------*/
/* */
/* Copyright (C) NEC Corporation 2011 */
/* NEC CONFIDENTIAL AND PROPRIETARY */
/* */
/* All rights reserved by NEC Corporation. This program must be */
/* used solely for the purpose for which it was furnished by NEC */
/* Corporation. No part of this program may be reproduced or */
/* disclosed to others, in any form, without the prior written */
/* permission of NEC Corporation. Use of copyright notice does */
/* not evidence publication of this program. */
/* */
/* NEC Corporation accepts no responsibility for any damages */
/* resulting from the use of this sample code. */
/* This sample code is provided "AS IS", and its user assume all */
/* risks when using it. */
/* */
/*---------------------------------------------------------------*/
//#include "stdafx.h"
#include "misc.h"
/*--------------------------------------------------------------------
*
* PrintErrorCode
*
*--------------------------------------------------------------------*/
void PrintErrorCode(
BioAPI_RETURN bioReturn /* INPUT : BioAPI Error Code */
)
{
TCHAR szMessage[_MAX_PATH];
// ID Input Error
if (bioReturn == ERRCODE_ID_INPUT_ERROR)
{
wsprintf(szMessage, MESS_ID_INPUT_ERROR);
MessageBox(GetActiveWindow(), szMessage, MESS_BIOAPI_ERROR, MB_OK | MB_ICONSTOP);
}
// Not Enrolled Error
else if (bioReturn == ERRCODE_NOT_ENROLLED)
{
wsprintf(szMessage, MESS_NOT_ENROLLED);
MessageBox(GetActiveWindow(), szMessage, MESS_BIOAPI_ERROR, MB_OK | MB_ICONSTOP);
}
// BioAPI Error
else
{
wsprintf(szMessage, MESS_BIOAPI_ERROR_CODE, bioReturn);
MessageBox(GetActiveWindow(), szMessage, MESS_BIOAPI_ERROR, MB_OK | MB_ICONSTOP);
}
return;
}
/*--------------------------------------------------------------------
*
* LoadBSP
*
*--------------------------------------------------------------------*/
void LoadBSP(
BioAPI_HANDLE_PTR gModuleHandle /* INPUT : BSP Module Handle */
)
{
BioAPI_VERSION bioVersion;
bioVersion.Major = BioAPI_MAJOR;
bioVersion.Minor = BioAPI_MINOR;
bioReturn = BioAPI_Init(&bioVersion, 0, NULL, 0, NULL);
if (BioAPI_OK != bioReturn)
{
PrintErrorCode(bioReturn);
return;
}
bioReturn = BioAPI_ModuleLoad(&BSPUuid, 0, NULL, 0);
if (BioAPI_OK != bioReturn)
{
PrintErrorCode(bioReturn);
return;
}
bioReturn = BioAPI_ModuleAttach(&BSPUuid, &bioVersion, &BioAPIWinMemoryFuncs, 0, 0, 0, 0, NULL, 0, NULL, gModuleHandle);
if (BioAPI_OK != bioReturn)
{
PrintErrorCode(bioReturn);
return;
}
return;
}
/*--------------------------------------------------------------------
*
* ReleaseBSP
*
*--------------------------------------------------------------------*/
void ReleaseBSP(
BioAPI_HANDLE_PTR gModuleHandle /* INPUT : BSP Module Handle */
)
{
if (gModuleHandle != 0)
{
bioReturn = BioAPI_ModuleDetach(*gModuleHandle);
if (BioAPI_OK != bioReturn)
{
PrintErrorCode(bioReturn);
return;
}
gModuleHandle = 0;
}
bioReturn = BioAPI_ModuleUnload(&BSPUuid, NULL, 0);
if (BioAPI_OK != bioReturn)
{
PrintErrorCode(bioReturn);
return;
}
bioReturn = BioAPI_Terminate();
if (BioAPI_OK != bioReturn)
{
PrintErrorCode(bioReturn);
return;
}
return;
}
/*--------------------------------------------------------------------
*
* OutputToFile
*
*--------------------------------------------------------------------*/
BioAPI_RETURN OutputToFile(
BioAPI_HANDLE gModuleHandle, /* INPUT : BSP Module Handle */
LPTSTR lptszUserName, /* INPUT : Save File Neme */
BioAPI_BIR_HANDLE BirHandle /* INPUT : Save BIR Data */
)
{
TCHAR szFileName[_MAX_PATH];
HANDLE hFile;
DWORD dwBytesToWrite, dwBytesWritten;
BioAPI_BIR_PTR birData = NULL;
BioAPI_RETURN bioReturn;
uint32 count = 0;
struct stat buff;
// Retrieve the BIR from the BSP
bioReturn = BioAPI_GetBIRFromHandle(gModuleHandle, BirHandle, &birData);
if (bioReturn != BioAPI_OK)
{
return bioReturn;
}
// Search Save FileName
_mkdir(PATH_ENROLLED_DIRECTORY);
while (1)
{
if (++count > MaxEnrollNum)
{
return -1; // Can't make file
}
wsprintf(szFileName, PATH_ENROLLED_NAME, lptszUserName, count);
if ((stat(szFileName, &buff) != 0))
{
break;
}
}
// Open the file
hFile = CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return 0; // this return value is ignored anyway
}
// Write the header
WriteFile(hFile, &(birData->Header), sizeof(BioAPI_BIR_HEADER), &dwBytesWritten, NULL);
// Write the biometric data
dwBytesToWrite = LocalEndian4(birData->Header.Length) - sizeof(BioAPI_BIR_HEADER);
WriteFile(hFile, birData->BiometricData, dwBytesToWrite, &dwBytesWritten, NULL);
// Write the signature if present
if (birData->Signature)
{
WriteFile(hFile, &(birData->Signature->Length), 4, &dwBytesWritten, NULL);
dwBytesToWrite = LocalEndian4(birData->Signature->Length);
WriteFile(hFile, birData->Signature->Data, dwBytesToWrite, &dwBytesWritten, NULL);
}
// Close the file
CloseHandle(hFile);
// Free all the memory allocated for the BIR
if (birData != NULL) {
GlobalFree(birData->BiometricData);
if (birData->Signature)
{
GlobalFree(birData->Signature->Data);
GlobalFree(birData->Signature);
}
GlobalFree(birData);
}
return BioAPI_OK;
}
/*--------------------------------------------------------------------
*
* InputFromFile
*
*--------------------------------------------------------------------*/
BioAPI_RETURN InputFromFile(
LPTSTR lptszUserName, /* INPUT : Load File Name */
BioAPI_INPUT_BIR * InputBir, /* OUTPUT : Load BIR Data */
uint32 count /* INPUT : User Enroll Number */
)
{
TCHAR szFileName[_MAX_PATH];
HANDLE hFile;
DWORD dwBytesToRead, dwBytesRead;
BioAPI_BIR *bir;
// Open the file
wsprintf(szFileName, PATH_ENROLLED_NAME, lptszUserName, count);
hFile = CreateFile(szFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return BioAPIERR_BSP_RECORD_NOT_FOUND; // Return this BSP error if the file isn't present
}
// Read the header in, to determine the size
dwBytesToRead = sizeof(BioAPI_BIR_HEADER);
bir = (BioAPI_BIR*)GlobalAlloc(GPTR, sizeof(BioAPI_BIR));
if (!bir)
{
return !BioAPI_OK;
}
ReadFile(hFile, &(bir->Header), dwBytesToRead, &dwBytesRead, NULL);
// Read the biometric data
dwBytesToRead = LocalEndian4(bir->Header.Length) - sizeof(BioAPI_BIR_HEADER);
bir->BiometricData = (BioAPI_BIR_BIOMETRIC_DATA_PTR)GlobalAlloc(GPTR, dwBytesToRead);
if (!bir->BiometricData)
{
return !BioAPI_OK;
}
ReadFile(hFile, bir->BiometricData, dwBytesToRead, &dwBytesRead, NULL);
// Read the signature if present
dwBytesToRead = 0;
if (ReadFile(hFile, &dwBytesToRead, 4, &dwBytesRead, NULL) != 0 && dwBytesToRead != 0)
{
bir->Signature = (BioAPI_DATA_PTR)GlobalAlloc(GPTR, sizeof(BioAPI_DATA));
if (!bir->Signature)
{
return !BioAPI_OK;
}
bir->Signature->Length = dwBytesToRead;
dwBytesToRead = LocalEndian4(dwBytesToRead);
bir->Signature->Data = (uint8 *)GlobalAlloc(GPTR, dwBytesToRead);
if (!bir->Signature->Data)
{
return !BioAPI_OK;
}
ReadFile(hFile, bir->Signature->Data, dwBytesToRead, &dwBytesRead, NULL);
}
// Close the file
CloseHandle(hFile);
// Set up the return values
InputBir->InputBIR.BIR = bir;
InputBir->Form = BioAPI_FULLBIR_INPUT;
return BioAPI_OK;
}
/*--------------------------------------------------------------------
*
* End of misc.cpp
*
*--------------------------------------------------------------------*/
错误:
1>libucrt.lib(exit.obj) : error LNK2005: _cexit already defined in ucrtd.lib(ucrtbased.dll)
1>libucrt.lib(onexit.obj) : error LNK2005: _crt_at_quick_exit already defined in ucrtd.lib(ucrtbased.dll)
1>libucrt.lib(onexit.obj) : error LNK2005: _crt_atexit already defined in ucrtd.lib(ucrtbased.dll)
1>libucrt.lib(onexit.obj) : error LNK2005: _execute_onexit_table already defined in ucrtd.lib(ucrtbased.dll)
1>libucrt.lib(onexit.obj) : error LNK2005: _initialize_onexit_table already defined in ucrtd.lib(ucrtbased.dll)
1>libucrt.lib(onexit.obj) : error LNK2005: _register_onexit_function already defined in ucrtd.lib(ucrtbased.dll)
1>libucrt.lib(environment_initialization.obj) : error LNK2005: _initialize_narrow_environment already defined in ucrtd.lib(ucrtbased.dll)
1>libucrt.lib(exception_filter.obj) : error LNK2005: _seh_filter_dll already defined in ucrtd.lib(ucrtbased.dll)
1>LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'ucrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>C:\Users\Laptop-attendance\source\repos\Bioapitest\x64\Debug\Bioapitest.exe : fatal error LNK1169: one or more multiply defined symbols found