Page 1 of 1

Funciones en DLL lector biometrico

PostPosted: Tue May 17, 2022 1:48 pm
by csincuir
Hola a todos.
No soy muy bueno con C++, y tengo que acceder a un biometrico SeguGen Haster IV
Tengo la dll que me enviaron con el SDK "SecuBSPMx.dll", y tengo este ejemplo en C++
Code: Select all  Expand view

#include "stdafx.h"
#include "BSPDemo.h"
#include "BSPDemoDlg.h"

// Initialize variables
m_hLib = 0;
m_hBSP = 0;

BOOL OnInitDialog()
{
if (InitSecuBSP())
  m_StatusBar = _T("BSP module initialization success !");
else
  m_StatusBar = _T("BSP module initialization failed !");

return TRUE;  // return TRUE  unless you set the focus to a control
}

//-------------------------------------------------------
bool InitSecuBSP()
{
    CString strSecuBSPMx(_T("SecuBSPMx.dll"));
   m_hLib = LoadLibrary(strSecuBSPMx);
   
   if ( !m_hLib )
   {
       CString strError;
       strError.Format(_T("LoadLibrary failed [%s]; GetLastError[%d];"), strSecuBSPMx, GetLastError());

      return false;
   }
 
   // Basic Functions
   SecuAPI_Init = (FP_SecuAPI_Init) GetProcAddress(m_hLib, "SecuAPI_Init");
   SecuAPI_Terminate = (FP_SecuAPI_Terminate) GetProcAddress(m_hLib, "SecuAPI_Terminate");
 
   // Device Functions
   SecuAPI_EnumerateDevice = (FP_SecuAPI_EnumerateDevice) GetProcAddress(m_hLib, "SecuAPI_EnumerateDevice");
   SecuAPI_OpenDevice = (FP_SecuAPI_OpenDevice) GetProcAddress(m_hLib, "SecuAPI_OpenDevice");
   SecuAPI_CloseDevice = (FP_SecuAPI_CloseDevice) GetProcAddress(m_hLib, "SecuAPI_CloseDevice");
   
   // BSP Functions
   SecuAPI_Capture = (FP_SecuAPI_Capture) GetProcAddress(m_hLib, "SecuAPI_Capture");
   SecuAPI_VerifyMatch = (FP_SecuAPI_VerifyMatch) GetProcAddress(m_hLib, "SecuAPI_VerifyMatch");
   SecuAPI_Enroll = (FP_SecuAPI_Enroll) GetProcAddress(m_hLib, "SecuAPI_Enroll");
   SecuAPI_Verify = (FP_SecuAPI_Verify) GetProcAddress(m_hLib, "SecuAPI_Verify");
   
   SecuAPI_Init(&m_hBSP);

   if (m_hBSP)
      return true;
   else
      return false;
}


Yo trate convertirlo a FWH/Harbour de esta forma, pero me salieron un monto de errores:
Image
Code: Select all  Expand view

#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

#include "stdafx.h"
#include "BSPDemo.h"
#include "BSPDemoDlg.h"

// Initialize variables
static m_hLib = 0;
static m_hBSP = 0;

//-------------------------------------------------------
HB_FUNC( InitSecuBSP )
//bool CBSPDemoDlg::InitSecuBSP()
{

   m_hLib = LoadLibrary("SecuBSPMx.dll");
   
   if ( !m_hLib )
   {
      return false;
   }
 
   // Basic Functions
   SecuAPI_Init = (FP_SecuAPI_Init) GetProcAddress(m_hLib, "SecuAPI_Init");
   SecuAPI_Terminate = (FP_SecuAPI_Terminate) GetProcAddress(m_hLib, "SecuAPI_Terminate");
 
   // Device Functions
   SecuAPI_EnumerateDevice = (FP_SecuAPI_EnumerateDevice) GetProcAddress(m_hLib, "SecuAPI_EnumerateDevice");
   SecuAPI_OpenDevice = (FP_SecuAPI_OpenDevice) GetProcAddress(m_hLib, "SecuAPI_OpenDevice");
   SecuAPI_CloseDevice = (FP_SecuAPI_CloseDevice) GetProcAddress(m_hLib, "SecuAPI_CloseDevice");
   
   // BSP Functions
   SecuAPI_Capture = (FP_SecuAPI_Capture) GetProcAddress(m_hLib, "SecuAPI_Capture");
   SecuAPI_VerifyMatch = (FP_SecuAPI_VerifyMatch) GetProcAddress(m_hLib, "SecuAPI_VerifyMatch");
   SecuAPI_Enroll = (FP_SecuAPI_Enroll) GetProcAddress(m_hLib, "SecuAPI_Enroll");
   SecuAPI_Verify = (FP_SecuAPI_Verify) GetProcAddress(m_hLib, "SecuAPI_Verify");

   SecuAPI_Init(&m_hBSP);

   if (m_hBSP)
      return .t.;
   else
      return .f.;
}
#pragma ENDDUMP


Estos son los errores que obtuve:
Code: Select all  Expand view

Warning W8069 .\\source\\SEM3201.PRG 22927: Nonportable pointer conversion in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22931: Undefined symbol 'false' in function HB_FUN_InitSecuBSP
Warning W8081 .\\source\\SEM3201.PRG 22931: void functions may not return a value in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22935: Undefined symbol 'SecuAPI_Init' in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22935: Undefined symbol 'FP_SecuAPI_Init' in function HB_FUN_InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22935: Statement missing ; in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22936: Undefined symbol 'SecuAPI_Terminate' in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22936: Undefined symbol 'FP_SecuAPI_Terminate' in function HB_FUN_InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22936: Statement missing ; in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22939: Undefined symbol 'SecuAPI_EnumerateDevice' in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22939: Undefined symbol 'FP_SecuAPI_EnumerateDevice' in function HB_FUN_InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22939: Statement missing ; in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22940: Undefined symbol 'SecuAPI_OpenDevice' in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22940: Undefined symbol 'FP_SecuAPI_OpenDevice' in function HB_FUN_InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22940: Statement missing ; in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22941: Undefined symbol 'SecuAPI_CloseDevice' in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22941: Undefined symbol 'FP_SecuAPI_CloseDevice' in function HB_FUN_InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22941: Statement missing ; in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22944: Undefined symbol 'SecuAPI_Capture' in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22944: Undefined symbol 'FP_SecuAPI_Capture' in function HB_FUN_InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22944: Statement missing ; in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22945: Undefined symbol 'SecuAPI_VerifyMatch' in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22945: Undefined symbol 'FP_SecuAPI_VerifyMatch' in function HB_FUN_InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22945: Statement missing ; in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22946: Undefined symbol 'SecuAPI_Enroll' in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22946: Undefined symbol 'FP_SecuAPI_Enroll' in function HB_FUN_InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22946: Statement missing ; in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22947: Undefined symbol 'SecuAPI_Verify' in function HB_FUN_InitSecuBSP
Error E2451 .\\source\\SEM3201.PRG 22947: Undefined symbol 'FP_SecuAPI_Verify' in function HB_FUN_InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22947: Statement missing ; in function HB_FUN_InitSecuBSP
Error E2188 .\\source\\SEM3201.PRG 22952: Expression syntax in function HB_FUN_InitSecuBSP
Warning W8081 .\\source\\SEM3201.PRG 22952: void functions may not return a value in function HB_FUN_InitSecuBSP
Error E2188 .\\source\\SEM3201.PRG 22954: Expression syntax in function HB_FUN_InitSecuBSP
Warning W8081 .\\source\\SEM3201.PRG 22954: void functions may not return a value in function HB_FUN_InitSecuBSP


Podría alguien ayudarme a trasaladar el codigo de C++ a FWH por favor, gracias.

Saludos cordiales.

Carlos Sincuir

Re: Funciones en DLL lector biometrico

PostPosted: Tue May 17, 2022 3:12 pm
by Antonio Linares
Carlos,

la línea 22919 tienes que cambiarla asi:

static HMODULE m_hLib = NULL;

fijate en los errores, porque ellos te marcan las soluciones :-)

Re: Funciones en DLL lector biometrico

PostPosted: Wed May 18, 2022 12:22 pm
by csincuir
Gracias Antonio por contestar.
Realmente soy malo para el C++, hice lo que me sugeriste y cambien otras cosas:
Code: Select all  Expand view

#pragma BEGINDUMP

#include <stdio.h>
#include <windows.h>
#include "hbapi.h"

//#include "stdafx.h"
//#include "BSPDemo.h"
//#include "BSPDemoDlg.h"

// Initialize variables
static HMODULE m_hLib = NULL;
static m_hBSP = 0;


static FP_SecuAPI_Init = NULL;
static FP_SecuAPI_Terminate = NULL;
static FP_SecuAPI_EnumerateDevice = NULL;
static FP_SecuAPI_OpenDevice = NULL;
static FP_SecuAPI_CloseDevice = NULL;
static FP_SecuAPI_Capture = NULL;
static FP_SecuAPI_VerifyMatch = NULL;
static FP_SecuAPI_Enroll = NULL;
static FP_SecuAPI_Verify = NULL;

static SecuAPI_Init = NULL;
static SecuAPI_Terminate = NULL;
static SecuAPI_EnumerateDevice = NULL;
static SecuAPI_OpenDevice = NULL;
static SecuAPI_CloseDevice = NULL;
static SecuAPI_Capture = NULL;
static SecuAPI_VerifyMatch = NULL;
static SecuAPI_Enroll = NULL;
static SecuAPI_Verify = NULL;

//-------------------------------------------------------
static void InitSecuBSP( void )
{

   static BOOL bInit = FALSE;
   if( ! bInit )
   {
       m_hLib = LoadLibrary("SecuBSPMx.dll");
       
       //if ( !m_hLib )
       //{
       // return FALSE;
       //}
     
       // Basic Functions
       SecuAPI_Init = (FP_SecuAPI_Init) GetProcAddress(m_hLib, "SecuAPI_Init");
       SecuAPI_Terminate = (FP_SecuAPI_Terminate) GetProcAddress(m_hLib, "SecuAPI_Terminate");
     
       // Device Functions
       SecuAPI_EnumerateDevice = (FP_SecuAPI_EnumerateDevice) GetProcAddress(m_hLib, "SecuAPI_EnumerateDevice");
       SecuAPI_OpenDevice = (FP_SecuAPI_OpenDevice) GetProcAddress(m_hLib, "SecuAPI_OpenDevice");
       SecuAPI_CloseDevice = (FP_SecuAPI_CloseDevice) GetProcAddress(m_hLib, "SecuAPI_CloseDevice");
       
       // BSP Functions
       SecuAPI_Capture = (FP_SecuAPI_Capture) GetProcAddress(m_hLib, "SecuAPI_Capture");
       SecuAPI_VerifyMatch = (FP_SecuAPI_VerifyMatch) GetProcAddress(m_hLib, "SecuAPI_VerifyMatch");
       SecuAPI_Enroll = (FP_SecuAPI_Enroll) GetProcAddress(m_hLib, "SecuAPI_Enroll");
       SecuAPI_Verify = (FP_SecuAPI_Verify) GetProcAddress(m_hLib, "SecuAPI_Verify");

       //SecuAPI_Init(&m_hBSP);
       
       FreeLibrary( m_hLib );
       bInit = TRUE;
    }
}
#pragma ENDDUMP
 


Pero ahora me salen estos errores:
Code: Select all  Expand view

Error E2379 .\\source\\SEM3201.PRG 22978: Statement missing ; in function InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22979: Statement missing ; in function InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22982: Statement missing ; in function InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22983: Statement missing ; in function InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22984: Statement missing ; in function InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22987: Statement missing ; in function InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22988: Statement missing ; in function InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22989: Statement missing ; in function InitSecuBSP
Error E2379 .\\source\\SEM3201.PRG 22990: Statement missing ; in function InitSecuBSP
*** 9 errors in Compile ***

Image

Intente tambien hacer la conexion con el biometrico, usando la forma de VB, pero igual, no logro hacer la conexion:
Code: Select all  Expand view
oNBioBSP := CreateObject("SecuBSPCOM.APIInterface")

Code: Select all  Expand view
Error TOleAuto/-1  CO_E_CLASSSTRING: TOLEAUTO:NEW

Llamado desde MYERROR( 60 ) en el modulo: source\ErrorSys.prg
Llamado desde (b)ERRORSYS( 20 ) en el modulo: source\ErrorSys.prg
Llamado desde THROW( 0 )
Llamado desde TOLEAUTO:NEW( 0 ) en el modulo: xhb\xhbole.prg
Llamado desde CREATEOBJECT( 0 ) en el modulo: xhb\xhbole.prg
Llamado desde BIOCAPTURE( 16359 ) en el modulo: .\source\SEM3201.PRG


Como que no se puede acceder a estos biometricos con FWH?

Saludos cordiales.

Carlos.

Re: Funciones en DLL lector biometrico

PostPosted: Wed May 18, 2022 3:26 pm
by Antonio Linares
Estimado Carlos,

Se puede acceder perfectamente, asi que no desesperes. Vamos a ir arreglando los errores, uno a uno :-)

Cambia esta línea así:

static FP_SecuAPI_Init SecuAPI_Init = NULL;

y haz lo mismo para las otras static. Recuerda que en C, el "tipo" de una variable se escribe antes del nombre de la variable.

Si tienes prisa en tenerlo funcionando, envíame todo y te miro de hacértelo :-)

Re: Funciones en DLL lector biometrico

PostPosted: Wed May 18, 2022 5:25 pm
by csincuir
Antonio, voy a tomar tu palabra, si me pudieras apoyar por favor te lo agradeceré un montón.
https://tssemsa.com/sistemas/tools/SecuGenCpp.zip
En ese link esta todo el proyecto C++ que estoy tratando de portar a FWH, y el archivo donde obtuve el codigo es el "BSPDemoDlg.cpp" y el metodo es InitSecuBSP()

De nuevo, gracias por el apoyo Antonio.

Saludos cordiales,

Carlos

Re: Funciones en DLL lector biometrico

PostPosted: Wed May 18, 2022 9:12 pm
by Antonio Linares
Carlos,

No me has enviado nada de PRG, luego entiendo que lo que has hecho es lo que has publicado en mensajes anteriores.

Para probarlo necesito tener ese lector, puedes enviarme uno ?

Una vez lo tenga y pruebe el ejemplo, comenzaré a adaptarlo y te diré que tiempo es preciso y el precio del trabajo, gracias

Re: Funciones en DLL lector biometrico

PostPosted: Wed May 18, 2022 10:06 pm
by csincuir
Antonio, en el ultimo mensaje que envié lo último que he hecho en PRG, que es esto:
Code: Select all  Expand view


#pragma BEGINDUMP

#include <stdio.h>
#include <windows.h>
#include "hbapi.h"

//#include "stdafx.h"
//#include "BSPDemo.h"
//#include "BSPDemoDlg.h"

// Initialize variables
static HMODULE m_hLib = NULL;
static m_hBSP = 0;


static FP_SecuAPI_Init = NULL;
static FP_SecuAPI_Terminate = NULL;
static FP_SecuAPI_EnumerateDevice = NULL;
static FP_SecuAPI_OpenDevice = NULL;
static FP_SecuAPI_CloseDevice = NULL;
static FP_SecuAPI_Capture = NULL;
static FP_SecuAPI_VerifyMatch = NULL;
static FP_SecuAPI_Enroll = NULL;
static FP_SecuAPI_Verify = NULL;

static SecuAPI_Init = NULL;
static SecuAPI_Terminate = NULL;
static SecuAPI_EnumerateDevice = NULL;
static SecuAPI_OpenDevice = NULL;
static SecuAPI_CloseDevice = NULL;
static SecuAPI_Capture = NULL;
static SecuAPI_VerifyMatch = NULL;
static SecuAPI_Enroll = NULL;
static SecuAPI_Verify = NULL;

//-------------------------------------------------------
static void InitSecuBSP( void )
{

   static BOOL bInit = FALSE;
   if( ! bInit )
   {
       m_hLib = LoadLibrary("SecuBSPMx.dll");
       
       //if ( !m_hLib )
       //{
       // return FALSE;
       //}
     
       // Basic Functions
       SecuAPI_Init = (FP_SecuAPI_Init) GetProcAddress(m_hLib, "SecuAPI_Init");
       SecuAPI_Terminate = (FP_SecuAPI_Terminate) GetProcAddress(m_hLib, "SecuAPI_Terminate");
     
       // Device Functions
       SecuAPI_EnumerateDevice = (FP_SecuAPI_EnumerateDevice) GetProcAddress(m_hLib, "SecuAPI_EnumerateDevice");
       SecuAPI_OpenDevice = (FP_SecuAPI_OpenDevice) GetProcAddress(m_hLib, "SecuAPI_OpenDevice");
       SecuAPI_CloseDevice = (FP_SecuAPI_CloseDevice) GetProcAddress(m_hLib, "SecuAPI_CloseDevice");
       
       // BSP Functions
       SecuAPI_Capture = (FP_SecuAPI_Capture) GetProcAddress(m_hLib, "SecuAPI_Capture");
       SecuAPI_VerifyMatch = (FP_SecuAPI_VerifyMatch) GetProcAddress(m_hLib, "SecuAPI_VerifyMatch");
       SecuAPI_Enroll = (FP_SecuAPI_Enroll) GetProcAddress(m_hLib, "SecuAPI_Enroll");
       SecuAPI_Verify = (FP_SecuAPI_Verify) GetProcAddress(m_hLib, "SecuAPI_Verify");

       //SecuAPI_Init(&m_hBSP);
       
       FreeLibrary( m_hLib );
       bInit = TRUE;
    }
}
#pragma ENDDUMP


Con lo de enviarte un biométrico, eso si esta difícil, el que tengo es del cliente y comprar uno nuevo mas enviarlo a España, imagínate en cuanto saldría eso, yo resido en Guatemala
https://secugen.com/products/hamster-iv/
https://www.amazon.com/-/es/secugen-h%C3%A1mster-esc%C3%A1ner-huella-dactilar/dp/B001P9OWRM

Como te decía, mejor le digo al cliente que no es posible acceder a este tipo de lectores biométricos con FWH.

Pero siempre, te agradezco el apoyo, no hay problema.

Saludos cordiales.

Carlos.

Re: Funciones en DLL lector biometrico

PostPosted: Mon May 23, 2022 10:51 pm
by Lailton
Hola Carlos,

Tiene el SDK? Tieno visto el fichero pero se falta alguns .h

Envia-me por correo lailton@paysoft.dev y lo preparo un exemplo para ti.

A primeira vista tu codigo carga la DLL y descarga en seguida, tambien te falta los prototype para las chamada.

:D

Re: Funciones en DLL lector biometrico

PostPosted: Tue May 24, 2022 11:16 am
by csincuir
Hola Laiton, si tengo el SDK, te envié por correo el link de descarga.
Te agradezco la ayuda.

Saludos cordiales

Carlos

Re: Funciones en DLL lector biometrico

PostPosted: Tue May 24, 2022 1:32 pm
by Lailton
Hola Carlos,

Voy a probar-lo hoy y te comendo aqui lo resultado :D

Re: Funciones en DLL lector biometrico

PostPosted: Tue May 24, 2022 3:22 pm
by csincuir
Gracias Laiton.
Saludos,
Carlos.