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---

DESCARGA SOFTWARE PARA FACTURA ELECTRONICA DE AQUI.
Facturacion, Validacion, Addendas, Librerias de programacion, etc.
CARTA PORTE V3.1
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
-
- Mensajes: 101
- Registrado: Mié Abr 06, 2011 7:06 pm
- Dado
- Mensajes: 15981
- Registrado: Mar Jul 06, 2010 7:56 pm
Re: Access violation al timbrar con Delphi Rio
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
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 !!
-
- Mensajes: 101
- Registrado: Mié Abr 06, 2011 7:06 pm
Re: Access violation al timbrar con Delphi Rio
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!!!
- Dado
- Mensajes: 15981
- Registrado: Mar Jul 06, 2010 7:56 pm
Re: Access violation al timbrar con Delphi Rio
Al string que pasa como parametro
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
-
- Mensajes: 54
- Registrado: Vie Mar 04, 2016 11:56 am
Re: Access violation al timbrar con Delphi Rio
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.
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.
-
- Mensajes: 101
- Registrado: Mié Abr 06, 2011 7:06 pm
Re: Access violation al timbrar con Delphi Rio
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!!!!!!!!!!!!!!!
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!!!!!!!!!!!!!!!
-
- Mensajes: 54
- Registrado: Vie Mar 04, 2016 11:56 am
Re: Access violation al timbrar con Delphi Rio
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.
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.
- Dado
- Mensajes: 15981
- Registrado: Mar Jul 06, 2010 7:56 pm
Re: Access violation al timbrar con Delphi Rio
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
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

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