Buenas Tardes :
Estimado Ignacio y soporte tecnico:
Disculpen que los moleste nuevamente :
Tengo un problema al activar un driver al importar un Activex...
No me funcionan los métodos donde uso variables contenedoras. Sobre todo con MingW y Harbour
En Xailer se genera la clase de la siguiente forma
CLASS TCZKEM FROM TOcx
// CZKEM Object en Windows
PROPERTY cCLSID INIT "zkemkeeper.ZKEM.1"
...
PUBLISHED:
.....
y uno de los métodos que genera problema es el siguiente :
METHOD GetUserFaceStr( ndwMachineNumber, cdwEnrollNumber, ndwFaceIndex, @cTmpData, @nTmpLength ) AS LOGICAL ID 233
En mis formularios lo Instancio de la siguiente manera:
WITH OBJECT ::oZkem := TCZKEM():New( SELF )
:create()
END
En la llamada al método previa declaración de Variables lo llamo de la siguiente forma
::oZkem:GetUserFaceStr(::nreloj, sUserID, 50, @sTmpData, @iLength)
Cuando Hago la llamada me indica error. y sale del programa ignorando los TRY - CATCH
*******************************************************************************************************************************************************
El proveedor me ha enviado el SDK con ejemplos en Visual y C# que funcionan correctamente.
En C# instancian la clase así :
Al inicio del proyecto:
public zkemkeeper.CZKEMClass axCZKEM1 = new zkemkeeper.CZKEMClass();
Y la función tiene la siguiente forma :
private void LoadFace_Click(object sender, EventArgs e)
string sUserID = "";
string sPassword = "";
int iMachineNumber = 0;
int iFaceIndex = 50;//the only possible parameter value
string sTmpData = "";
int iLength = 0;
{
if (axCZKEM1.GetUserFaceStr(iMachineNumber, sUserID, iFaceIndex, ref sTmpData, ref iLength))//get the face template from the memory
{
}
}
*********************************************************************************************************************
Es posible instanciar dentro de un pcode? Como el siguiente?
#PRAGMA BEGIN DUMP
#include <windows.h>
#include "hbapi.h"
#include "stdio.h"
HB_FUNC( CHECKFACE )
{
int iFace = hb_parni(3);
int iLength = hb_parni(5);
int imaquina = hb_parni(1);
char * sUserID = hb_parc(2);
char * sTmpData = hb_parc(4);
if (axCZKEM1.GetUserFaceStr(iMaquina, sUserID, iFace, ref sTmpData, ref iLength)) // // PREGUNTO COMO INSTANCIO axCZKEM1 PARA USARLO ?
{
MessageBox( GetActiveWindow(),"Ok!", "Test",0x00000040); // Si es Correcto
}
}
************************************************
Agradeceré me apoyes al respecto.
Si necesitas mas información te la puedo hacer llegar
************************************************
Atentamente :
Michael Pavlich
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Ayuda para instanciar driver en codigo incrustado
-
- Mensajes: 32
- Registrado: Dom Jun 21, 2009 4:29 pm
Ayuda para instanciar driver en codigo incrustado
Última edición por Michael Pavlich el Mar Ago 16, 2016 3:40 am, editado 1 vez en total.
-
- Mensajes: 32
- Registrado: Dom Jun 21, 2009 4:29 pm
Re: Ayuda para instanciar driver en codigo incrustado
Mis Estimados amigos de Soporte Xailer necesitan mas información?
Re: Ayuda para instanciar driver en codigo incrustado
Michael,
en primer lugar, disculpa todo el retraso.
Por favor, muestranos todo el código donde lo estás instanciando y donde lo estás llamando. Quizás el problema es que no estás inicializando las variables sTmpData y iLength. ¿Hay alguna llamada a algún método del componente antes de GetUserFaceStr?
Por otro lado, supongo que este ActiveX sirve para acceder a algún elemento de hardware, por lo que me temo que va a ser complicado que podamos hacer pruebas nosotros.
Y por último, sí se podría usar el ActiveX desde C, pero es necesario un amplísimo conocimiento tanto de C como de COM (component object model) de MS, y puedo asegurar que se complica mucho.
en primer lugar, disculpa todo el retraso.
Por favor, muestranos todo el código donde lo estás instanciando y donde lo estás llamando. Quizás el problema es que no estás inicializando las variables sTmpData y iLength. ¿Hay alguna llamada a algún método del componente antes de GetUserFaceStr?
Por otro lado, supongo que este ActiveX sirve para acceder a algún elemento de hardware, por lo que me temo que va a ser complicado que podamos hacer pruebas nosotros.
Y por último, sí se podría usar el ActiveX desde C, pero es necesario un amplísimo conocimiento tanto de C como de COM (component object model) de MS, y puedo asegurar que se complica mucho.
-
- Mensajes: 32
- Registrado: Dom Jun 21, 2009 4:29 pm
Re: Ayuda para instanciar driver en codigo incrustado
Le agradezco la respuesta
En estos ejemplos he tratado de explicar lo mas detalladamente posible el problema.
Que es mucho mas agudo con MINGW , por lo que en algunos proyectos con dispositivos seguimos usando xharbour y la version 2.75.
Si Ustedes lo requieren con el fin de mejorar la siguiente version podríamos enviar los dispositivos a fin de que corrijan el bug de Harbour.
O en su defecto aplicar el PCODE
Todos esos gastos de envío correrían por nuestra cuenta.
//------------------------------------------------------------------------------
// Metodo de un Fabricante
METHOD mTest1() CLASS TDispositivos1
local nDisp:=1,cIp:="192.168.1.201"
Local cSerial:="",nUsuario:=91,cHuella:="",nDedo:=1,nPriv:=0
// Con este dispositivo todas las variables contenedoras funcionan en la version 2.75
// Pero en las versiones con Harbour no funcionan, incluso en la version 4 xailer
TRY
WITH OBJECT ::oTFK := TFKAttend():New(SELF) // Instancio el driver Dispositivo
:create()
END WITH
//METHOD ConnectNet( nnMachineNumber, cstrIpAddress, nnPort, nnTimeOut, nnProtocolType, nnNetPassword, nnLicense ) AS NUMERIC ID 2
//Metodo de Coneccion del OCX
if ::oTFK:ConnectNet(nDisp, cIp, 5005, 500, 0,0, 1250)=1 // Parametros de coneccion OK en ambos versiones
//METHOD GetProductData( nanProductIndex, @capstrProductData ) AS NUMERIC ID 13
// 1 es el parametro para extraer la serie , cSerial la variable contenedora
::oTFK:GetProductData(1,@cSerial) // xHarbour OK // Harbour no Funciona ni Con Borland ni con MINGW
Msginfo(cSerial) // Version 2.75 ok // Harbour devuelve vacio versiones xailer 3 a mayor
//extrayendo las huellas
//En este caso igualmente // Version 2.75 ok // Harbour devuelve vacio versiones xailer 3 a mayor
FOR nDedo = 0 TO 9
if ::oTFK:GetEnrollDataWithString( nUsuario, nDedo, @npriv, @cHuella ) = 1
msginfo(cHuella,"Ok") // cHuella una cadena de aprox. 850 caracteres
endif
next
// Con este OCX con la version 2.75 todo funciona dentro de lo establecido.
// Con Harbour no puedo usar las variables contenedoras.
else
Msgstop("ERROR: No se pudo Conectar al Dispositivo","Verifique Conexion")
endif
CATCH
MsgStop("Error del Dispositivo")
END
RETURN Nil
//------------------------------------------------------------------------------
// Metodo de un Fabricante
METHOD mTest2() CLASS TDispositivos1
local nDisp:=1,cIp:="192.168.1.201"
Local cSerial:="",cUsuario:="91",cHuella:="",nDedo:=1,nPriv:=0,cNombre:="",cPassword:="",lok:=.f.,nHuella:=0,cRostro:="",nRostro:=0
// Con este otro dispositivo todas las variables contenedoras funcionan en la version 2.75
// Con excepcion de algunas
// Pero en las versiones con Harbour no funcionan, incluso en la version 4 xailer
TRY
WITH OBJECT ::oZkem := TCZKEM():New(SELF) //Instancio el active del fabricante
:create()
END WITH
/* Method Connect_NET */
// METHOD Connect_Net( cIPAdd, nPort ) AS LOGICAL ID 39
if ::oZkem :Connect_Net( cIp, 4370 ) // Funciona bien con ambos
if ::oZkem:IsTFTMachine(nDisp) // Funciona bien con ambos * me indica el tipo de maquina
// 1 es el numero de maquina , cSerial la variable contenedora
::oZkem :GetSerialNumber(1, @cSerial )
Msginfo(cSerial) // Version 2.75 ok // Harbour devuelve vacio versiones xailer 3 a mayor
/* Method SSR_GetUserInfo * Del active */
// METHOD SSR_GetUserInfo( ndwMachineNumber, cdwEnrollNumber, @cName, @cPassword, @nPrivilege, @lEnabled ) AS LOGICAL ID 147
if ::oZkem:SSR_getUserInfo( 1, cUsuario, @cNombre, @cPassword, @npriv, @lok )
msginfo(cNombre,"ok")
//En este caso Version 2.75 ok // Harbour devuelve vacio versiones xailer 3 a mayor
/* Method SSR_GetUserTmpStr */ // Metodo de extraccion de Huella.
// 1 cUsuario 15 Huella Tamaño
// METHOD SSR_GetUserTmpStr( ndwMachineNumber, cdwEnrollNumber, ndwFingerIndex, @cTmpData, @nTmpLength ) AS LOGICAL ID 149
// Aqui se me presentan los mas graves problemas, funciona en forma aleatoria.
// Nota 15 es un codigo especial que devuelve todas las huellas en una variable
if ::oZkem:SSR_GetUserTmpStr(1,cUsuario,15, @cHuella, @nHuella )
msginfo(cHuella,"Huella Correcta")
endif
//Este método es similar al anterior devuelve una cadena de caracteres en cRostro
if ::oZkem:GetUserFaceStr(1, cUsuario, 50, @cRostro, @nRostro)
msginfo(cRostro,"Correcto")
endif
// Al usar en C no se presenta el problema
// Si le pongo a secas cHuella o cRostro no devuelve nada y no indica error
// Con @cHuella o cRostro se sale ignorando los try catch en forma aleatoria
endif
else
MsgAlert("El Equipo no es compatible con el Sistema","Importante")
endif
else
Msgstop("ERROR: No se pudo Conectar al Dispositivo","Verifique Conexion")
endif
::nTest:=0
CATCH
MsgStop("Error del Dispositivo")
END
RETURN Nil
Atentamente
Michael Pavlich.
En estos ejemplos he tratado de explicar lo mas detalladamente posible el problema.
Que es mucho mas agudo con MINGW , por lo que en algunos proyectos con dispositivos seguimos usando xharbour y la version 2.75.
Si Ustedes lo requieren con el fin de mejorar la siguiente version podríamos enviar los dispositivos a fin de que corrijan el bug de Harbour.
O en su defecto aplicar el PCODE
Todos esos gastos de envío correrían por nuestra cuenta.
//------------------------------------------------------------------------------
// Metodo de un Fabricante
METHOD mTest1() CLASS TDispositivos1
local nDisp:=1,cIp:="192.168.1.201"
Local cSerial:="",nUsuario:=91,cHuella:="",nDedo:=1,nPriv:=0
// Con este dispositivo todas las variables contenedoras funcionan en la version 2.75
// Pero en las versiones con Harbour no funcionan, incluso en la version 4 xailer
TRY
WITH OBJECT ::oTFK := TFKAttend():New(SELF) // Instancio el driver Dispositivo
:create()
END WITH
//METHOD ConnectNet( nnMachineNumber, cstrIpAddress, nnPort, nnTimeOut, nnProtocolType, nnNetPassword, nnLicense ) AS NUMERIC ID 2
//Metodo de Coneccion del OCX
if ::oTFK:ConnectNet(nDisp, cIp, 5005, 500, 0,0, 1250)=1 // Parametros de coneccion OK en ambos versiones
//METHOD GetProductData( nanProductIndex, @capstrProductData ) AS NUMERIC ID 13
// 1 es el parametro para extraer la serie , cSerial la variable contenedora
::oTFK:GetProductData(1,@cSerial) // xHarbour OK // Harbour no Funciona ni Con Borland ni con MINGW
Msginfo(cSerial) // Version 2.75 ok // Harbour devuelve vacio versiones xailer 3 a mayor
//extrayendo las huellas
//En este caso igualmente // Version 2.75 ok // Harbour devuelve vacio versiones xailer 3 a mayor
FOR nDedo = 0 TO 9
if ::oTFK:GetEnrollDataWithString( nUsuario, nDedo, @npriv, @cHuella ) = 1
msginfo(cHuella,"Ok") // cHuella una cadena de aprox. 850 caracteres
endif
next
// Con este OCX con la version 2.75 todo funciona dentro de lo establecido.
// Con Harbour no puedo usar las variables contenedoras.
else
Msgstop("ERROR: No se pudo Conectar al Dispositivo","Verifique Conexion")
endif
CATCH
MsgStop("Error del Dispositivo")
END
RETURN Nil
//------------------------------------------------------------------------------
// Metodo de un Fabricante
METHOD mTest2() CLASS TDispositivos1
local nDisp:=1,cIp:="192.168.1.201"
Local cSerial:="",cUsuario:="91",cHuella:="",nDedo:=1,nPriv:=0,cNombre:="",cPassword:="",lok:=.f.,nHuella:=0,cRostro:="",nRostro:=0
// Con este otro dispositivo todas las variables contenedoras funcionan en la version 2.75
// Con excepcion de algunas
// Pero en las versiones con Harbour no funcionan, incluso en la version 4 xailer
TRY
WITH OBJECT ::oZkem := TCZKEM():New(SELF) //Instancio el active del fabricante
:create()
END WITH
/* Method Connect_NET */
// METHOD Connect_Net( cIPAdd, nPort ) AS LOGICAL ID 39
if ::oZkem :Connect_Net( cIp, 4370 ) // Funciona bien con ambos
if ::oZkem:IsTFTMachine(nDisp) // Funciona bien con ambos * me indica el tipo de maquina
// 1 es el numero de maquina , cSerial la variable contenedora
::oZkem :GetSerialNumber(1, @cSerial )
Msginfo(cSerial) // Version 2.75 ok // Harbour devuelve vacio versiones xailer 3 a mayor
/* Method SSR_GetUserInfo * Del active */
// METHOD SSR_GetUserInfo( ndwMachineNumber, cdwEnrollNumber, @cName, @cPassword, @nPrivilege, @lEnabled ) AS LOGICAL ID 147
if ::oZkem:SSR_getUserInfo( 1, cUsuario, @cNombre, @cPassword, @npriv, @lok )
msginfo(cNombre,"ok")
//En este caso Version 2.75 ok // Harbour devuelve vacio versiones xailer 3 a mayor
/* Method SSR_GetUserTmpStr */ // Metodo de extraccion de Huella.
// 1 cUsuario 15 Huella Tamaño
// METHOD SSR_GetUserTmpStr( ndwMachineNumber, cdwEnrollNumber, ndwFingerIndex, @cTmpData, @nTmpLength ) AS LOGICAL ID 149
// Aqui se me presentan los mas graves problemas, funciona en forma aleatoria.
// Nota 15 es un codigo especial que devuelve todas las huellas en una variable
if ::oZkem:SSR_GetUserTmpStr(1,cUsuario,15, @cHuella, @nHuella )
msginfo(cHuella,"Huella Correcta")
endif
//Este método es similar al anterior devuelve una cadena de caracteres en cRostro
if ::oZkem:GetUserFaceStr(1, cUsuario, 50, @cRostro, @nRostro)
msginfo(cRostro,"Correcto")
endif
// Al usar en C no se presenta el problema
// Si le pongo a secas cHuella o cRostro no devuelve nada y no indica error
// Con @cHuella o cRostro se sale ignorando los try catch en forma aleatoria
endif
else
MsgAlert("El Equipo no es compatible con el Sistema","Importante")
endif
else
Msgstop("ERROR: No se pudo Conectar al Dispositivo","Verifique Conexion")
endif
::nTest:=0
CATCH
MsgStop("Error del Dispositivo")
END
RETURN Nil
Atentamente
Michael Pavlich.
Re: Ayuda para instanciar driver en codigo incrustado
Michael,
disculpa el retraso.
Comentas que en algunos proyectos estáis usando Xailer 2.7. Por favor, prueba si con esa versión te funciona. Lo digo porque esa versión usaba xHarbour y BCC, y así podemos centrarnos, o descartar, que sean un problema específico de Harbour o de MinGW.
disculpa el retraso.
Comentas que en algunos proyectos estáis usando Xailer 2.7. Por favor, prueba si con esa versión te funciona. Lo digo porque esa versión usaba xHarbour y BCC, y así podemos centrarnos, o descartar, que sean un problema específico de Harbour o de MinGW.