Imagen

DESCARGA SOFTWARE PARA FACTURA ELECTRONICA DE AQUI.
Facturacion, Validacion, Addendas, Librerias de programacion, etc.


ECODEX TIENE ESTOS NUEVOS DATOS DE CONTACTO :
Comercializacion y Ventas - Evelia Vicke evicke@ecodex.com.mx 33-16-03-03-48
Soporte - Humberto Guerrero soporte@ecodex.com.mx 33-34-90-46-03

Access violation al timbrar con Delphi Rio

Este es el foro para resolver dudas y hacer comentarios de las librerias DLL de generacion y timbrado que se ofrece aqui en el foro
fanchondo
Mensajes: 101
Registrado: Mié Abr 06, 2011 7:06 pm

Access violation al timbrar con Delphi Rio

Mensajepor fanchondo » Lun Dic 06, 2021 11:06 am

Buenos dias, al intentar timbrar un complemento de pago me da el error "access violation at address 00000000" el detalle es que si se timbra, pero salta el error, en la linea de if TimbrarCFD(ToChar(SobreT)) = OK then, la libreria ya la he usado en muchos programas, aqui la unica cuestion es que estoy compilando con Delphi Rio, que creo no deberia tener problema,
¿alguna idea de que puede ser?, Saludos!!!!!

la bitacora de proceso me da:
06/dic. 10:48:54 ---Iniciando creacion de CFDI---CFDLib V3.3.181215
06/dic. 10:48:54 Abriendo archivo ini : C:\Porteo\pago.ini
06/dic. 10:48:54 Abriendo Certificado : C:\Porteo\Certificado\00001000000412065575.cer
06/dic. 10:48:54 Abriendo Llave Privada : C:\Porteo\Certificado\CSD_Matriz_PPN090130KB1_20180910_130216.key
06/dic. 10:48:54 Iniciando creacion de XML
06/dic. 10:48:54 Insertando Datos Generales
06/dic. 10:48:54 Insertando Datos del Emisor
06/dic. 10:48:54 Insertando Datos del Receptor
06/dic. 10:48:54 Insertando Conceptos
06/dic. 10:48:54 Insertando Impuestos
06/dic. 10:48:54 Insertando Complemento Recepcion de Pagos
06/dic. 10:48:54 Creando sello digital
06/dic. 10:48:55 Exportando el XML a disco
06/dic. 10:48:55 Exportando variables CadenaOriginal y Sello
06/dic. 10:48:55 ---FIN CFDI---
06/dic. 10:49:10 ---Iniciando Timbrado---CFDLib V3.3.181215
06/dic. 10:49:10 Abriendo archivo ini : C:\PorteoDelNorte\timbradopago.ini
06/dic. 10:49:10 Creando objeto CFDI
06/dic. 10:49:10 Cargando CFDI de disco : C:\Porteo\ArchivosXML\PagoNo1239.xml
06/dic. 10:49:10 Cargando Datos del PAC : ECODEX
06/dic. 10:49:11 Exportando resultados: XML, Cadena del timbre y SelloSAT
06/dic. 10:49:11 ---FIN TIMBRADO---

Avatar de Usuario
Dado
Mensajes: 15838
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Access violation al timbrar con Delphi Rio

Mensajepor Dado » Lun Dic 06, 2021 11:17 am

Recuerdo que hace una decada cuando empezamos con la DLL muchos de los errores de AV eran debido a la diferencia entre cadenas.

Algunas versiones de Delphi usan STRING, pero despues cambio a ANSISTRING, luego a UNICODESTRING, etc

Incluso recuerdo que teniamos una unidad especialmente programada para detectar que version de Delphi se estaba usando y asi usar el tipo de cadena correcto

Checalo por ese lado
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

fanchondo
Mensajes: 101
Registrado: Mié Abr 06, 2011 7:06 pm

Re: Access violation al timbrar con Delphi Rio

Mensajepor fanchondo » Lun Dic 06, 2021 11:30 am

Gracias!!!, voy a revisar por ese lado, ¿te refieres a la creacion de los archivos ini? o al string que va como parametro en la funcion TimbrarCFD(ToChar(String)) ? saludos!!!

Avatar de Usuario
Dado
Mensajes: 15838
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Access violation al timbrar con Delphi Rio

Mensajepor Dado » Lun Dic 06, 2021 11:39 am

Al string que pasa como parametro
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

euro
Mensajes: 53
Registrado: Vie Mar 04, 2016 11:56 am

Re: Access violation al timbrar con Delphi Rio

Mensajepor euro » Mar Dic 07, 2021 10:19 am

Hola yo tengo exactamente el mismo problema con Delphi 10 Seattle.

Aunque sucede esto:

Si el aplicativo se encuentra corriendo en un sistema operativo de arquitectura x86 no da problema alguno.

El problema se presenta cuando ejecutas en sistemas operativos x64, comienzan a saltar Access Violation en el momento de generar el CFD (procedimiento GeneraCFD).

Saludos.

fanchondo
Mensajes: 101
Registrado: Mié Abr 06, 2011 7:06 pm

Re: Access violation al timbrar con Delphi Rio

Mensajepor fanchondo » Mar Dic 07, 2021 11:06 am

Con la pista que me dio DADO (muchísimas gracias por cierto Dado) estuvimos buscándole y lo solucionamos cambiando el tipo de parámetro que recibe las funciones GenerarCFD y TimbrarCFD. Esto en la forma CFDLibHeader

Normalmente estaban asi:
function GeneraCFD(IniFileName, ClaveLlavePrivada : PChar) : TError; stdcall; external 'CFDLib.dll';
function TimbrarCFD(IniFileName : PChar) : TError; stdcall; external 'CFDLib.dll';

cambiamos el tipo de PChar a String y funciono, asi quedaron:

function GeneraCFD(IniFileName, ClaveLlavePrivada : string) : TError; stdcall; external 'CFDLib.dll';
function TimbrarCFD(IniFileName : string) : TError; stdcall; external 'CFDLib.dll';

Ayer lo hicimos, timbro y han estado timbrando sin ningún problema, espero que así sigan y también espero que te sirva este tip.

Saludos!!!!!!!!!!!!!!!

euro
Mensajes: 53
Registrado: Vie Mar 04, 2016 11:56 am

Re: Access violation al timbrar con Delphi Rio

Mensajepor euro » Mar Dic 07, 2021 12:25 pm

Saludos me funcionó pero de una manera extraña

La declaración de la función quedó justamente como el amigo fanchondo comenta:

function GeneraCFD(IniFileName, ClaveLlavePrivada : string) : TError; stdcall; external 'CFDLib.dll';

Pero la llamada quedo así (de otra manera sigue marcando el Access Violation):

GeneraCFD(ToChar(IniFileName), ToChar(ClaveLlavePrivada));

No entiendo porque tengo que hacer Cast de un parametro String pero en fin ya funciona.

Gracias a Dado y fanchondo por el apoyo.

Saludos.

Avatar de Usuario
Dado
Mensajes: 15838
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Access violation al timbrar con Delphi Rio

Mensajepor Dado » Mar Dic 07, 2021 12:36 pm

Solo para "cultura general"

El problema es como se almacena en memoria las cadenas, hay basicamente dos formas (y una de ellas tiene dos sub-formas)

Tipo Delphi : el primer byte indica el tamaño del string, seguido de los caracteres
Ejemplo : [07] "Ejemplo" , el primer byte (7) indica que la cadena es de 7 bytes, despues la cadena en si.

Tipo lenguaje C, que ademas es el tipo que usa la DLL y Windows en general : la cadena y al final un byte #00 que indica el fin.
Ejemplo : "Ejemplo"#0, la cadena, luego el byte final #0

Dentro de Delphi hay basicamente (hay muchas) formas de almacenar las cadenas, una es ansi y la otro es unicode, aqui el problema es que las cadenas ansi ocupan un solo byte por letra, y el tipo unicode utiliza dos bytes

Y porque es importante para la DLL ? porque estas pasando como parametro cadenas y tienes que hacer coincidir la forma en que estan almacenadas, DELPHI MARCA ACCESS VIOLATION porque trata de pasar las cadenas CON EL DOBLE DE TAMAÑO ESPERADO (Unicode) y entonces windows dice no-no, no pases mas informacion de la que estoy esperando (a eso se le llama overflow, que a su vez genera un Access Violation)

PCHAR() es un truco mas especializado, en ese tipo de parametro NO se pasa la cadena en si, se pasa un APUNTADOR de memoria que le indica a la rutina donde esta la cadena, es como pasarla por referencia (a diferencia de pasarla como valor)

Espero haberme explicado y ayudado a entender :geek:
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!


Volver a “SOPORTE LIBRERIA CFDLib.dll, CELib.dll y RETLib.dll”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados