FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Problema de Access Violation en Delphi 7
Hola:
Estoy migrando un driver de POS de una impresora fiscal de PowerBasic 8.0 a Delphi 7, y en la rutina de enviar los comandos a la impresora obtengo siempre alguno de estos errores: Project C:\Developers\Impresora Fiscal\Delphi 7 PrnFiscal\POSPrnFiscalDLL32.EXE faulted with message: 'access violation at 0x0629f46c: read of address 0x0629f46c'. Process Stoped. Use Step or Runtime to continue. Project C:\Developers\Impresora Fiscal\Delphi 7 PrnFiscal\POSPrnFiscalDLL32.EXE raised too many consecutive exceptions access violation at 0x00000000: read of address 0x00000000. Process Stoped. Use Step or Runtime to continue. Considere varias causas para este error y todas fueron descartadas en base a pruebas, las causas descartadas fueron: 01.- Problemas de Instalación con Delphi 7 Enterprise. 02.- Problemas de Update con Delphi 7 Enterprise. 03.- Problemas con Services de WinXP 04.- Problemas con programas en el Startup de WinXP 05.- Problemas con la App Host hecha en VB6 (Se hizo un host básico en Delphi 7 con los mismos resultados) 06.- Problemas con el registro de WinXP 07.- Problemas con la inicialización de la estructura DCB La rutina ejecuta completamente sin errores, pero al finalizar la última instrucción (La cual ejecuta sin ningun problema, dado que si agrego una nueva instrucción al final de esta como por ejemplo un try..except..end o un simple exit, todas se ejecutan correctamente), da el error antes mencionado. Como dije anteriormente, la misma rutina funciona perfectamente en PowerBasic 8.0, el problema parece ser en mi humilde opinión al liberar los recursos asignados a la función en cuestión SendCmd(). Investigue varias posibles causas de los AV en la pagina web: http://delphi.about.com/od/objectpas.../aa052201a.htm, sin ningun resultado positivo. He revisado los mensajes de Access Violation en este site (http://www.clubdelphi.com) y no he podido encontrar ninguna información que me ayude a eliminar el error. Lo cierto es que cada mensaje que he leido me ha dado ideas, pero lamentablemente ninguna ha funcionado hasta ahora. Puedo decirles que llegue al punto de hacer un debub de cada una de las unidades que usa el programa sin ningún resultado. Se que el error se debe a un acceso indebido a una posición de memoria, y parece que lo más comun es por el uso de objetos que no se han creado o que ya han sido liberados, pero ese no es mi caso. Lo fundamental de este código es lo siguiente: 1.- No usa BD 2.- Hace uso de las API WIN32 para el manejo del puerto serial, via Overlapped (Aunque falla de igual forma en forma sincronizada). 3.- Esta implementado en forma de DLL. 4.- No hace uso de OOP (De forma directa). 5.- El programa original funciona sin ningún problema en PowerBasic 8.0 6.- Es 100% programatico, no hace uso de DLLs externos, ActiveX o llamadas a ningún tipo de programa externo. 7.- La comunicación con el printer fiscal solo hace uso de las lineas TX y RX, dado que asi esta implementado por hardware, el resto de las lineas del puerto serial rs232 no son utilizadas. 8.- La versión de Delphi que utilizo es Delphi 7.0 Enterprise (Build 8.1), pero el error persiste aun uso el Delphi 7.0 Entreprise sin el Update Pack 7.1 9.- El ambiente de desarrollo es un Pentium III a 1 Ghz, 1GB de Ram, 120 GB de HD con Windows XP SP2. Agradezco cualquier idea que me puedan dar, muchas gracias de antemano. La rutina es la siguiente: Nota: Las rutinas que se muestran en el código más abajo y que no he enviado para minimizar la cantidad de código a revisar y evitar la sobresaturación de información, ejecutan sin ningún problema y los typos de datos Buffer_n son UDT del tipo: Buffer_n = Record b : Array[0..n-1] of Byte; end;
Gracias por revisar el código. Última edición por nlsgarcia fecha: 18-02-2007 a las 00:25:49. |
#2
|
||||
|
||||
Solución al Problema de Access Violation en Delphi 7
Hola:
El Error estaba en este fragmento de código:
El índice declarado es menor al índice usado en el for, y el error de índice fuera de secuencia no fue detectado en tiempo de ejecución de forma explicita, sino de forma genérica como un AV, dado que no estaba activa la opción de Range Checking en Runtime, en las opciones del compilador. Revise una buena parte de los errores que fueron publicados relacionados a Access Violation, en mi humilde opinión yo pienso que parte de la velocidad del compilador de Delphi se debe a un compromiso entre chequeo de elementos en memoria (objetos, variables, estructuras y arreglos) y velocidad de compilación, el cual confia en parte sea responsabilidad del programador, dado que es un lenguaje para uso profesional, a diferencia de VB. Gracias a las personas que se tomaron la molestia de leer este problema y revisar el código asociado. Última edición por nlsgarcia fecha: 20-02-2007 a las 03:10:17. |
#3
|
||||
|
||||
Pues es que el compilador no tiene manera de saber que el índice está fuera de rango. Tendría que ser un compilador muy avanzado, para poder analizar tu código y darse cuenta de que hay una posible violación de rango, y digo posible, porque el compilador no tiene manera de saber qué va a pasar en el ciclo, quizá algo lo haga salir del bucle antes de llegar al extremo del rango.
Otra cosa sería si pones:
porque explícitamente le estás diciendo que pase un índice fuera del rango que el compilador ya conoce por la declaración de la variable. // Saludos |
#4
|
||||
|
||||
Respuesta a Roman
Hola Roman:
Gracias por tu comentario, cambiare la nota que hice a: El error de índice fuera de secuencia no fue detectado en tiempo de ejecución de forma explicita, sin de forma genérica como un AV. Saludos. |
#5
|
||||
|
||||
¡Ah! Pero en tiempo de ejecución la cosa cambia . Por defecto, Delphi no verifica el rango, pero sí que puede hacerlo si activas la opción Range Checking en Project|Options|Compiler. Claro que igualmente obtienes una excepción, pero de alguna manera, es menos severa que un Acces Violation.
// Saludos |
#6
|
||||
|
||||
Respueta 2 a Roman
Hola:
Revise la opción que me indicastes y el error es detectado en el momento que ocurre si esta activa la opción, nuevamente gracias por tu comentario. Saludos. Última edición por nlsgarcia fecha: 20-02-2007 a las 03:11:07. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Problema de Access Violation | johurgi | Varios | 3 | 18-07-2006 19:04:58 |
Delphi 7 Access Violation at 0x7c91edcd | Barzaugc | Varios | 2 | 03-06-2005 05:03:24 |
Delphi 7 Access Violation at 0x7c91edcd | Barzaugc | Varios | 1 | 03-06-2005 02:34:25 |
RTL70.BPL - Access violation en delphi 7 | zylmig | Varios | 1 | 22-05-2005 20:15:48 |
Problema con Quick report 'Access Violation at address 00575B9B in module' | danielcordovahe | Varios | 3 | 13-05-2005 00:51:08 |
|