1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
DWORD CDKBioAccessDlg::Identify(int Timeout)
{
//////////// load stored templates to buffer //////////
static unsigned char *pTemplate;
static BioAPI_BIR_PTR pBIRarray;
static BioAPI_BIR_PTR pBIRptr;
static int len = 1024;
static int i;
static int nTemplates = 0;
static WCHAR wcMsg[256];
pTemplate = LoadTemplateDB(&nTemplates, BIODATA_PATH);
if (!pTemplate)
{
if (nTemplates == 0)
{
wsprintf(wcMsg, _T("Empty DB: %s"), BIODATA_PATH);
m_Message.SetWindowText(wcMsg);
return BioAPI_ERRCODE_INTERNAL_ERROR;
}
wsprintf(wcMsg, _T("LoadTemplateDB error: nTemplates=%d"), nTemplates);
m_Message.SetWindowText(wcMsg);
return BioAPI_ERRCODE_INTERNAL_ERROR;
}
if (nTemplates == 0)
{
wsprintf(wcMsg, _T("Empty DB: %s"), BIODATA_PATH);
m_Message.SetWindowText(wcMsg);
return BioAPI_ERRCODE_INTERNAL_ERROR;
}
wsprintf(wcMsg, _T("%d templates loaded.\r\nPlease, pass your finger..."), nTemplates);
m_Message.SetWindowText(wcMsg);
pBIRarray = (BioAPI_BIR_PTR)malloc(nTemplates*sizeof(BioAPI_BIR));
if (!pBIRarray)
{
free(pTemplate);
goto IdentOut;
}
for (i=0; i<nTemplates; i++)
{
pBIRptr = pBIRarray + i;
//------ce qui ne marche pas ----->
pBIRptr->BiometricData = (BioAPI_BIR_BIOMETRIC_DATA_PTR)(split((char *)pTemplate,"$$$_$$$",0)[0] + i*len);
//avant et ce qui fonctionne ---->
pBIRptr->BiometricData = (BioAPI_BIR_BIOMETRIC_DATA_PTR)(pTemplate + i*len);
pBIRptr->Header.Length = len + sizeof(BioAPI_BIR_HEADER);
}
.....
//la fonction split
//Function to split char
char** split(char* chaine,const char* delim,int vide){
char** tab=NULL; //tableau de chaine, tableau resultat
char *ptr; //pointeur sur une partie de
int sizeStr; //taille de la chaine à recupérer
int sizeTab=0; //taille du tableau de chaine
char* largestring; //chaine à traiter
int sizeDelim=strlen(delim); //taille du delimiteur
largestring = chaine; //comme ca on ne modifie pas le pointeur d'origine
//(faut ke je verifie si c bien nécessaire)
while( (ptr=strstr(largestring, delim))!=NULL ){
sizeStr=ptr-largestring;
//si la chaine trouvé n'est pas vide ou si on accepte les chaine vide
if(vide==1 || sizeStr!=0){
//on alloue une case en plus au tableau de chaines
sizeTab++;
tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
//on alloue la chaine du tableau
tab[sizeTab-1]=(char*) malloc( sizeof(char)*(sizeStr+1) );
strncpy(tab[sizeTab-1],largestring,sizeStr);
tab[sizeTab-1][sizeStr]='\0';
}
//on decale le pointeur largestring pour continuer la boucle apres le premier elément traiter
ptr=ptr+sizeDelim;
largestring=ptr;
}
//si la chaine n'est pas vide, on recupere le dernier "morceau"
if(strlen(largestring)!=0){
sizeStr=strlen(largestring);
sizeTab++;
tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
tab[sizeTab-1]=(char*) malloc( sizeof(char)*(sizeStr+1) );
strncpy(tab[sizeTab-1],largestring,sizeStr);
tab[sizeTab-1][sizeStr]='\0';
}
else if(vide==1){ //si on fini sur un delimiteur et si on accepte les mots vides,on ajoute un mot vide
sizeTab++;
tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
tab[sizeTab-1]=(char*) malloc( sizeof(char)*1 );
tab[sizeTab-1][0]='\0';
}
//on ajoute une case à null pour finir le tableau
sizeTab++;
tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
tab[sizeTab-1]=NULL;
return tab;
} |