LECTURA DE UN DLL ..

LECTURA DE UN DLL ..

Postby Busmatic_wpb » Sat Aug 05, 2017 1:57 am

Saludes.
haber i me logran echar una mano. Estoy tratando de leer el contexto de un lector de tarjetas Sin Contacto para detetectar cuanos lectores hay conectados.
Me podran ayudar como estoy tratando lo datos des la libreria si estan correctos. Hasta Ahora el programa no hace nada y no da errores.

#include "FiveWin.ch"
#include "dll.ch"


FUNCTION LEEC1()

Local notUsed:="" , notUsed1:=""

Local MAXIMUM_SMARTCARD_READERS:=10
Local SCARD_SCOPE_USER:=0
Local SCARD_S_SUCCESS :=0

hDLL := LoadLibrary( "WINSCARD.DLL")



RetVar :="" &&cardinal;
ReaderList :=space(1) && string;
ReaderListSize := 0 &&integer;
FContext :=space(30)

v :={MAXIMUM_SMARTCARD_READERS} &&array[0..MAXIMUM_SMARTCARD_READERS] of string;
i :=0 &&integer;

RetVar := SCardEstablishContext(SCARD_SCOPE_USER, @notUsed, @notUsed1, @FContext)

FreeLibrary( hDLL )
return nil



DLL FUNCTION SCardEstablishContext( SCARD_SCOPE_USER AS LONG , notUsed AS VOID , notUsed1 AS VOID , @FContext AS STRING ) AS LONG PASCAL LIB "WINSCARD.DLL"
Regards.
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
User avatar
Busmatic_wpb
 
Posts: 162
Joined: Wed Feb 22, 2017 2:19 am

Re: LECTURA DE UN DLL ..

Postby Antonio Linares » Sat Aug 05, 2017 6:48 am

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41211
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Lectura de una dll parte 2

Postby Busmatic_wpb » Tue Aug 08, 2017 11:47 pm

Un saludito gente y por curiocidad a alguien le ha pasado esto.

Tengo un lector ACS128U con su libreria propietaria uso la funcion ACR120_Open(INT16 ReaderPort) donde el parametro en un int
deberia de devolver el puerto donde esta contetado el lector. Logro ver cuando ejecuto la aplicacion las luces del lector sin contacto parpadean. No da error de ningun tipo y sale sin errores. Solo eso he logrado y los tipos de datos _INT, DWORD LPTRS, BOOL, BYTE, STRING, LPSTR,VOID LO mismo ya no se que mas usar. Alguna idea..
Agradeceria si alguien puede compartir alguna esperiencia y logro resolverlo..

Dejo el ejemplo...



/*
3.0.Group A. Reader Commands

3.1. ACR120_Open High Level API: DLLAPI INT16 AC_DECL ACR120_Open(INT16 ReaderPort);

The port number. Available choices are ACR120_USB1 to ACR120_USB8

*/

FUNCTION CONECTXTO()


LOCAL ACR120libHandle

LOCAL frHandle:= 0
LOCAL fPuerto := 0

ACR120libHandle := LoadLibrary( "ACR120U.DLL")

//Puerto del lector, es 0 si solo hay un lector conectado.


//Abrir comunicación con el lector

frHandle := ACR120_Open(fPuerto)

?? frHandle

If frHandle<0
MsgStop( "NO SE PUDO HABRIR EL PUERTO DEL LECTOR",+"LECTOR NO CONECTADO " )
ENDIF



FreeLibrary(ACR120libHandle)


return nil

DLL FUNCTION ACR120_Open(fPuerto AS LONG ) AS LONG FROM "ACR120_Open" LIB "ACR120U.DLL"
Regards.
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
User avatar
Busmatic_wpb
 
Posts: 162
Joined: Wed Feb 22, 2017 2:19 am

Re: LECTURA DE UN DLL ..

Postby Antonio Linares » Wed Aug 09, 2017 2:18 am

Llega a mostrar este valor ?

?? frHandle

Que valor muestra ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41211
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: LECTURA DE UN DLL ..

Postby Busmatic_wpb » Wed Aug 09, 2017 3:39 pm

Estimado.
No muestra ningún valor pero el lector parpadea y no retorna nada. Aveces el programa se detiene y se sale..
Será el tipo de dll su compilación algo porque es muy simple el comando.. Agradezco su ayuda.
Regards.
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
User avatar
Busmatic_wpb
 
Posts: 162
Joined: Wed Feb 22, 2017 2:19 am

Re: LECTURA DE UN DLL ..

Postby Antonio Linares » Wed Aug 09, 2017 3:42 pm

Prueba usando la claúsula PASCAL:

DLL FUNCTION ACR120_Open(fPuerto AS LONG ) AS LONG PASCAL FROM "ACR120_Open" LIB "ACR120U.DLL"
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41211
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: LECTURA DE UN DLL ..

Postby Busmatic_wpb » Wed Aug 09, 2017 4:18 pm

No tampoco he tratado de todas las maneras posibles y no da el mismo resultado la dll propietaria viene con el mismo lector..
Graxias por tu ayuda. A lo.mejor si compro la versión de nueva del fhw y a lo mejor me resuelva algo yo uso una versión muy vieja.
Gracias .
User avatar
Busmatic_wpb
 
Posts: 162
Joined: Wed Feb 22, 2017 2:19 am

Re: LECTURA DE UN DLL ..

Postby karinha » Wed Aug 09, 2017 4:53 pm

Hola, para que sirve ACR120U.DLL? como se llama el lector de códigos de barras?

http://forums.fivetechsupport.com/viewtopic.php?f=6&t=33761#p199475

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7154
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: LECTURA DE UN DLL ..

Postby Busmatic_wpb » Wed Aug 09, 2017 6:33 pm

Gracias Karina. Es para una lector de tarjetA sin contacto. Gracias. Ese ejemplo funciona para acr38. El que uso es un acr128u. No se porque pero debería funcionar. Esta versión es el api fabricante.
Graxias
Regards.
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
User avatar
Busmatic_wpb
 
Posts: 162
Joined: Wed Feb 22, 2017 2:19 am

Re: LECTURA DE UN DLL ..

Postby karinha » Wed Aug 09, 2017 6:47 pm

USB ó Puerto serial?

saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7154
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: LECTURA DE UN DLL ..

Postby Busmatic_wpb » Thu Aug 10, 2017 12:27 am

Gracias por responder.
Este tipo de lectores pueden venir tanto para serial como USB. En este caso es USB. :roll:

Es muy simple lo unico que debe de decirme es cual puerto USB esta conectado el lector y de ahi el resto es relativamente simple pero alguna razon que no entiendo no puedo tener acceso a la funcion

fPuerto:= 0

Donde puerto puede ser de 0.. 1..18 ACR120_Open(fPuerto) me dara el puerto donde se conecta..
Pero me da un error y se tira a fuera donde dice prepay.exe has stopped working y da la opcion de enviar el reporte a soporte de windows.

Lo unico que logro es hacer parpaderar el las luces del lector y me da ese error..
Gracias. desde ya
Regards.
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
User avatar
Busmatic_wpb
 
Posts: 162
Joined: Wed Feb 22, 2017 2:19 am

Re: LECTURA DE UN DLL ..

Postby Antonio Linares » Thu Aug 10, 2017 9:10 am

Prueba a hacer esta única llamada:

ACR120libHandle := LoadLibrary( "ACR120U.DLL")

y comprueba si con eso ya parpadea el lector
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41211
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: LECTURA DE UN DLL ..

Postby Busmatic_wpb » Fri Aug 11, 2017 12:48 am

Les comento.
Logre leer el dll
Gracias por la ayuda.

Ahora mi pregunta es esta

como logro hacer el llamado de una arreglo a un dll.
si
Local TagType :={} // array[0..50] of Byte;
Local SN:={450} //array[0..450] of Byte;[/color]
Local SN:={450} //array[0..450] of Byte;[/color]

Estos variables son de tipo Array

fretcode me Retorna 63506 lo cual esta bin.. lo datos que debe de rotornar como se tratan los arreglos es este caso ?? String , Long ect
gracias desde ya..


Function Prepago()

LOCAL fPuerto := 0
LOCAL cDllName:="acr120u.DLL"

Local TagLength :={} && array[0..50] of Byte;
local TagType :={} &&: array[0..50] of Byte;
local TagFound:=0 && Byte;
Local SN:={450} && array[0..450] of Byte;

local i:=0 &&smallint;
local j:=0 &&smallint;
Local snstr:=space(100) && string;

Public frHandle:= 0, ACR120libHandle ,fretcode


ACR120libHandle := LoadLibrary( cDllName)

//Puerto del lector, es 0 si solo hay un lector conectado.

//Abrir comunicación con el lector

frHandle := ACR120_Open(fPuerto)

//Obtener la lista de tarjetas dentro del rango del lector

fretcode := ACR120_ListTags(frhandle, TagFound, @TagType, @TagLength, @SN)

for i:= 0 to (TagFound-1)
snstr := ''
for j:= i * 10 To ((TagLength[i] + i * 10) - 1)
snstr := snstr + chr(SN[j])
?? snstr
NEXT
NEXT

?? frHandle,"HANLDE del puerto ", fretcode ,"RETORNO fretcode"

?? TagFound, TagType, TagLength, SN



If frHandle >= 0
* ACR120_Close(frhandle)
ENDIF

if ACR120libHandle <> 0
FreeLibrary(ACR120libHandle)
ENDIF

return


DLL FUNCTION ACR120_Open(fPuerto AS _INT ) AS LONG PASCAL FROM "ACR120_Open" LIB ACR120libHandle

DLL FUNCTION ACR120_ListTags(fPuerto AS _INT , TagFound AS _INT , @TagType AS STRING , ;
@TagLength AS STRING , @SN AS STRING
);
AS LONG PASCAL FROM "ACR120_ListTags" LIB ACR120libHandle
Regards.
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
User avatar
Busmatic_wpb
 
Posts: 162
Joined: Wed Feb 22, 2017 2:19 am

Re: LECTURA DE UN DLL ..

Postby Antonio Linares » Fri Aug 11, 2017 6:15 am

Les comento.
Logre leer el dll
Gracias por la ayuda.


Que cambiaste para que funcionase ? Esta conversación puede ayudar a otros usuarios

Cual es el prototipado de esta función en C ?
ACR120_ListTags()

En vez de _INT usa LONG
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41211
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: LECTURA DE UN DLL ..

Postby Busmatic_wpb » Fri Aug 11, 2017 11:45 pm

Gracias a todos por su ayuda.

Estimados el asunto de la tarjetas sin contacto al final no es tan dificil si tienes el conocimiento minimo de como manejar el mapping de estas y al final son 5 o 6 funciones que utiliare para trabajar las el tipo de tarjeta Midfare 1k .Hay varias tipos de 1,2,4,8,16 k ademas desfire ,nautilus y su variedad y tipo son una gama amplia.

Asi como los lectores y sus compatibilidad para cada uan de ellas y tambien su dll propietaria. Yo apenas termine este proyecto pubicare mi todas las funciones necesarias para controlar y manera las gama de tarejtas Midafare 1k. Asi como un ejemplos validos para salir de este Guru y comparti la informacion.

Ahora yo maneje dll producidas por un empresa en España y trabajaba para ella no tenia acceso a los Fucniones ni como lo hacian.

Por eso dede ahora empeze a hacerlo desde 0 por tal razon mi conocimiento de maping de lo tarjeta es amplio mas no del dll propietario.
Hasta ahora en concreto vamos podremos decir que ya logramos lo siguiente.

*************************************************************************************************************
///Variables Delphi

ACR120libHandle

frHandle: Smallint;
fPuerto: Smallint;


ACR120libHandle := LoadLibrary( "ACR120U.DLL")
//Puerto del lector, es 0 si solo hay un lector conectado.
fPuerto := 0

//Abrir comunicación con el lector

frHandle := ACR120_Open(fPuerto);

If (frHandle<0) Then DarError(‘No se pudo abrir el puerto del lector.’);

*********************************************************************************************************************
Desarrollo FWH
#define E1 -1000 // ERRORES LECTOR-TARJETA
#define E2 -1001 // Error en la apertura del lector de tarjetas.
#define E3 -1002 // Error al ejecutar la sentencia "SELECT" sobre la tarjeta
#define E4 -1003 // Error al ejecutar LOGIN para acceder a un sector.
#define E5 -1004 // Error durante la escritura de un bloque.
#define E6 -1005 // Error durante la lectura de un bloque.
#define E7 -1006 // Error obtención claves tarjeta
#define E8 -1007 // Error obtención tabla de bonos
#define E9 -2000 // ERRORES PARAMETROS
#define E10 -2001 // ERROR NumTarjeta Erróneo. El número de tarjeta tendrá un máximo de 8 dígitos.
#define E11 -2002 // Parámetro cTipoTarjeta erróneo.
#define E12 -2003 // Parámetro iDNI erróneo. Máximo 8 dígitos
#define E13 -2004 // Parámetro sFechaCaducidad incorrecto. Formato “ddmmyy”
#define E14 -2005 // El bono para este mes ya está cargado en la tarjeta
#define E15 -2006 // Origen de Anulación desconocido.
#define E16 -2007 // No se puede realizar la operación, debido a que ya la última operación no es una recarga.
#define E17 -2008 // No se puede realizar la operación, debido a que se supero el tiempo límite desde que se realizó la recarga.
#define E18 -2009 // No se puede realizar la operación, debido a que el importe a anular es superior al saldo restante en la tarjeta.
#define E19 -2010 // No se puede anular debido a que la última operación no fue un consumo
#define E20 -2011 // No existe operación que anular en el histórico
#define E21 -2012 // No se puede realizar la operación, debido a que se supero el tiempo límite desde que se realizó el consumo.
#define E22 -2013 // Error, Tarjeta Desactivada.
#define E23 -2010 //ERR_PORT_OCCUPIED = -2010,
#define E24 -2020 //ERR_HANDLE_INVALID = -2020,
#define E25 -2030 //ERR_INCORRECT_PARAM = -2030,
#define E26 -3000 //ERR_READER_NO_TAG = -3000,
#define E27 -3030 //ERR_READER_OP_FAILURE = -3030,
#define E28 -3040 //ERR_READER_UNKNOWN = -3040,
#define E29 -4010 //ERR_READER_LOGIN_INVALID_STORED_KEY_FORMAT = -4010,
#define E30 -4011 //ERR_READER_LOGIN_FAIL = -4011,
#define E31 -4012 //ERR_READER_OP_AUTH_FAIL = -4012,
#define E32 -4030 //ERR_READER_VALUE_DEC_EMPTY = -4030,
#define E33 -4031 //ERR_READER_VALUE_INC_OVERFLOW = -4031,
#define E34 -4032 //ERR_READER_VALUE_OP_FAILURE = -4032,
#define E35 -4033 //ERR_READER_VALUE_INVALID_BLOCK = -4033,
#define E36 -4034 //ERR_READER_VALUE_ACCESS_FAILURE = -4034;


Function Prepago()

LOCAL fPuerto := 0

LOCAL cDllName:="acr120u.DLL"

Public frHandle:= 0, ACR120libHandle ,fretcode

ACR120libHandle := LoadLibrary( cDllName)

//Puerto del lector, es 0 si solo hay un lector conectado.

//Abrir comunicación con el lector

frHandle := ACR120_Open(fPuerto)

?? SI RETORNO 0..XX E EL PUERTO QUE SE ENCUENTRA EL LECTOR SIN CONTACTO

// SI RETORNA ERRRO -xxxx QUE PUSIMOS ARRIBA Y VER ARRIBA.
return

DLL FUNCTION ACR120_Open(fPuerto AS LONG ) AS LONG PASCAL FROM "ACR120_Open" LIB ACR120libHandle

Funciona perfecto..
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Segunda funcion


//Vamos a probar si hay tarjetas en el lector ahora, obteniendo sus números Mifare
// var ejmplo en delphi

TagLength: array[0..50] of Byte;
TagType: array[0..50] of Byte;
TagFound: Byte;
SN: array[0..450] of Byte;
i,j: smallint;
snstr: string;

//Obtener la lista de tarjetas dentro del rango del lector

fretcode := ACR120_ListTags(frhandle, @TagFound, @TagType, @TagLength, @SN);

If (fretcode < 0) Then exit;
for i:= 0 to (TagFound-1) do begin
snstr := '';
for j:= i * 10 To ((TagLength[i] + i * 10) - 1) do snstr := snstr + chr(SN[j]);

En snstr se encuentra el número de serie Mifare que puedes guardar.

end;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ok ya con este numero de tarjeta MIDFARE podra determinar que fuciones podras utilizar del dll propietario recuerden que cada tarjetas midfare tiene sus propias funciones.

Ahora en FWH.

fretcode := ACR120_ListTags(frhandle, TagFound, TagType, TagLength, SN)

for i = 0 to TagFound-1
snstr := ''
for j:= i * 10 To ((TagLength[i] + i * 10) - 1)
snstr := snstr + chr(SN[j])
?? snstr
NEXT
NEXT

// recordando frHandle es el numero de puerto donde esta el lector Sin contacto
// fretcode podra ser 0 que fue exitoso

Return

DLL FUNCTION ACR120_ListTags(fPuerto AS LONG , TagFound AS LONG , TagType AS LPSTR , ;
TagLength AS LPSTR , SN AS LPSTR );
AS LONG PASCAL FROM "ACR120_ListTags" LIB ACR120libHandle
*****************************************************************************************************************************

Hasta aqui llego pues no se como manipular los Array pues no se como se hace el llamado a la dll, donde podremos ver el ejemlo del api propietario el siguiente.

Selects a TAG with specific serial number.
High Level API:

DLLAPI INT16 AC_DECL ACR120_MultiTagSelect( INT16 hReader,
UINT8 TagLength,
UINT8 SN[10],
UINT8* pResultTagType,
UINT8* pResultTagLength,
UINT8* pResultSN);

hReader Handle to the reader returned by AC_Open()

TagLength (N)
Contains the length of the serial number of the TAG TagLength (N) to be selected.
The TagLength may be 4, 7 or 10 bytes long

SN Contains the serial number of the TAG to be selected

pResultTagType Contains the selected TAG type

pResultTagLength (K)
Contains the length of the serial number of the selected TAG. The pResultTagLength may be 4, 7 or 10 bytes long.

pResultSN Serial number of the selected TAG

Return Value INT16 Result code. 0 means success.

Table 18: ACR120_MultiTagSelect Command Description
*******************************************************************************************************************************************


Donde tengo esto asi..

fretcode := ACR120_ListTags(frhandle, TagFound, TagType, TagLength, SN)



DLL FUNCTION ACR120_ListTags(fPuerto AS LONG , TagFound AS LONG , TagType AS LPSTR , ;
TagLength AS LPSTR , SN AS LPSTR );
AS LONG PASCAL FROM "ACR120_ListTags" LIB ACR120libHandle

Donde actulemente el fretcode me retorna un 63506 no se parece a Cero "0"
que seria lectura exitosa..

Bueno haber que podria cambiar en el uso de los arrary.

Ha Linares amigo para que me funcionara la primera funcion ... leyera cambiar a 9.09 fwh porque tenia usando la 2.7 y un compañero del foro compilo con la 16,12 y si trabajo asi use la version que te comente.

Gracias la yauda desde ya
Regards.
S.I.T.U.
Sistemas Inteligentes de transporte urbano
http://www.situcr.com
oscarchacon@Situcr.com
Desarrollos BA4/B4j androide
User avatar
Busmatic_wpb
 
Posts: 162
Joined: Wed Feb 22, 2017 2:19 am


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: GUSPRE and 13 guests