Prueba asi:
msginfo( CChex_Update( Anviz_handle, iDx, tipo, aDatos, nLen ) )
Prueba asi:
msginfo( CChex_Update( Anviz_handle, iDx, tipo, aDatos, nLen ) )
int CChex_Update(IntPtr CchexHandle, int[] DevIdx, int[] Type, IntPtr Buff, int Len) int ret = 0;
int[] Type = new int[1];
int[] dev_idx = new int[1];
IntPtr pBuff;
int len = 32000;
pBuff = Marshal.AllocHGlobal(len);
CChex_Update(anviz_handle, dev_idx, Type, pBuff, len);Esta declaración:
int CChex_Update(IntPtr CchexHandle, int[] DevIdx, int[] Type, IntPtr Buff, int Len)
no es una declaración de lenguaje C, sino de C#, lo cual significa que puede ser una DLL para .Net
De ser asi, no podemos usarla directamente desde Harbour
Puedes preguntarle al fabricante que te confirme si esa DLL es para ser usada desde .Net ? Y si tienen una DLL para lenguaje C ?
HB_FUNC( CCHEX_UPDATE )
{
int DevIdx = hb_parni( 2 );
int Type = hb_parni( 3 );
hb_retnl( CChex_Update( ( void * ) hb_parnl( 1 ), &DevIdx, &Type, ( char * ) hb_parc( 4 ), hb_parni( 5 ) ) );
} {
AnvizNew.CCHEX_RET_RECORD_INFO_STRU_CARD_ID_LEN_7 record_info;
record_info = (AnvizNew.CCHEX_RET_RECORD_INFO_STRU_CARD_ID_LEN_7)Marshal.PtrToStructure(pBuff, typeof(AnvizNew.CCHEX_RET_RECORD_INFO_STRU_CARD_ID_LEN_7));
DateTime date = new DateTime(2000, 1, 2).AddSeconds(swapInt32(BitConverter.ToUInt32(record_info.Date, 0)));
string dateStr = date.ToString("yyyy-MM-dd HH:mm:ss");
string info_buff = "Record Info ----[ Mid:" + record_info.MachineId
+ " Date:" + dateStr
+ "PersonID: " + CardId_array_to_string(record_info.CardId)
+ " RecType:" + record_info.RecordType.ToString()
+ " ]" + "(" + record_info.CurIdx.ToString() + "/" + record_info.TotalCnt.ToString() + ")";
log_add_string(info_buff);
}Guarda todo lo que recibes en un fichero de texto y enviamelo
hb_memoWrit( "datos.txt", aDatos )
y me envias datos.txt por email, gracias
vRet:=CChex_DownloadAllRecords(Anviz_handle,1)
syswait(2)
vCual:=0
do while .t.
aDatos:=space(32000)
nLen:=len(aDatos)
vRet:=(CChex_Update(Anviz_handle,iDx,tipo,aDatos,32000))
syswait(2)
if vRet > 0
vCual++
nomf = "Fichero"+strzero(vCual,3)+".txt"
handle = fcreate(nomf)
for x=1 to len(aDatos)
fwrite(handle,substr(aDatos,x,1),1)
next x
fclose(handle)
else
exit
end if
end do public struct CCHEX_RET_RECORD_INFO_STRU_CARD_ID_LEN_7
{
public uint MachineId; //机器号
public byte NewRecordFlag; //是否是新记录
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 7)]
public byte[] CardId; //
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] Date; //日期时间
public byte BackId; //备份号
public byte RecordType; //记录类型
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] WorkType; //工种 (ONLY use 3bytes )
public byte Rsv;
public uint CurIdx; //add VER 22
public uint TotalCnt; //add VER 22
}Comenzamos a analizar el primer fichero:
#include "FiveWin.ch"
function Main()
local aInfo := StructToArray( hb_memoRead( "Fichero001.txt" ) )
MsgInfo( StructLen(), "CardId struct length" )
MsgInfo( aInfo[ 1 ], "MachineId" )
MsgInfo( aInfo[ 2 ], "NewRecordFlag" )
MsgInfo( hb_hexToNum( hb_strToHex( aInfo[ 3 ] ) ), "CardId" )
MsgInfo( hb_strToHex( aInfo[ 4 ] ), "Date" )
MsgInfo( aInfo[ 5 ], "BackId" )
MsgInfo( aInfo[ 6 ], "RecordType" )
MsgInfo( hb_hexToNum( hb_strToHex( aInfo[ 7 ] ) ), "WorkType" )
MsgInfo( aInfo[ 8 ], "Rsv" )
MsgInfo( aInfo[ 9 ], "CurIdx" )
MsgInfo( aInfo[ 10 ], "TotalCnt" )
return nil
#pragma BEGINDUMP
#include <hbapi.h>
typedef struct CCHEX_RET_RECORD_INFO_STRU_CARD_ID_LEN_7
{
unsigned int MachineId;
unsigned char NewRecordFlag;
unsigned char CardId[ 7 ]; // ademas en el nombre de la estructura se especifica CARD_ID_LEN_7
unsigned char Date[ 4 ];
unsigned char BackId;
unsigned char RecordType;
unsigned char WorkType[ 3 ];
unsigned char Rsv;
unsigned int CurIdx;
unsigned int TotalCnt;
} CARDINFO;
HB_FUNC( STRUCTLEN )
{
hb_retnl( sizeof( CARDINFO ) );
}
HB_FUNC( STRUCTTOARRAY )
{
CARDINFO * data = ( CARDINFO * ) hb_parc( 1 );
hb_reta( 10 );
hb_storvni( data->MachineId, -1, 1 );
hb_storvni( data->NewRecordFlag, -1, 2 );
hb_storvclen( ( const char * ) data->CardId, 7, -1, 3 );
hb_storvclen( ( const char * ) data->Date, 4, -1, 4 );
hb_storvni( data->BackId, -1, 5 );
hb_storvni( data->RecordType, -1, 6 );
hb_storvclen( ( const char * ) data->WorkType, 3, -1, 7 );
hb_storvni( data->Rsv, -1, 8 );
hb_storvni( data->CurIdx, -1, 9 );
hb_storvni( data->TotalCnt, -1, 10 );
}
#pragma ENDDUMPAntonio,
Muchas gracias por tu ayuda.
Ya tengo todo lo que pretendia hacer solucionado.
Cuando lo tenga todo solucionado lo subiré por si puede ayudar a alguien a conectar con los dispositivos biométricos de ANVIZ.
De nuevo, Gracias y un saludo.
Muy bien!
muchas gracias
Conseguiste integrar los terminales de Anviz?