PDA

Ver la Versión Completa : Aplicacion se cae al cerrar explorer u otro navegador


vicvil
08-04-2013, 17:07:43
Otra consulta con respecto a aplicación Delphi 5.
Cada vez que se tiene abierta la aplicación minimizada y se abre un navegador de internet, al cerrar este se cae la aplicación enviando el mensaje de Access Violation.
¿A que se puede deber?
Esto ocurre con cualquier windows y con el navegador Explorer y Google Chrome, no lo he probado con otros.

Neftali [Germán.Estévez]
08-04-2013, 18:57:46
Estaría bien saber qué hace la aplicación y si tiene algo que ver con estos programas...

vicvil
09-04-2013, 17:58:30
Son programas contables, pero al parecer debe ser algún componente que estoy utilizando, porque viendo otro programa pequeño que hice para generar codigos de barra no me pasa.
Ahora el problema será investigar cual de los componentes es el que genera el problema. Tendré que hacer un pequeño sistema, agregandole componentes hasta dar con el causante (trabajo de chinos porque son varios).
Cuando lo encuentre les digo, pero si a alguien le ha pasado lo mismo que me evite el trabajito se lo agradeceria.

Neftali [Germán.Estévez]
09-04-2013, 18:11:20
Si los comentas tal vez te podamos dar alguna pista de cual puede ser.
Los componentes normales de la VCL no deberían generar estos errores. ¿Algún componente externo?

Al González
09-04-2013, 19:06:45
Tendré que hacer un pequeño sistema, agregandole componentes hasta dar con el causante (trabajo de chinos porque son varios).
Una prueba aislada. ^\||/

Pero considera la alternativa de tener Delphi instalado en esa misma computadora, y ejecutar el programa desde el IDE habiéndolo compilado con las opciones "Debug information" y "Use debug DCUs". Así, cuando el Access Violation ocurra, el depurador te permitirá ver la pila de llamadas (call stack) y con ello descubrir en qué punto del programa se dispara la situación de falla y su posible causa.

Saludos.

vicvil
09-04-2013, 20:37:35
Al hice la prueba desde delphi como tu lo indicaste, pero no envía ningún mensaje que me de una pista solo aparece "Exception EAccessVoilation in Module Programa.exe at 0007C12C. Access violation at address xxxxx in module Programa.exe. Read of address xxxx" y se cae sin mas.

Los componentes que tengo son de TurboPower, Rx, GNostice, FastReport, CGIExpert.

Ya probé con algunos de ellos en forma individual y no se caen.

vicvil
09-04-2013, 21:04:11
Ya encontré cual es el componente que me causa el problema, es el componente TStShellTreeView que pertenece a Systools de TurboPower.
Ahora hay que averiguar por que pasa eso.

Al González
09-04-2013, 21:32:31
[...] solo aparece "Exception EAccessVoilation in Module Programa.exe at 0007C12C. Access violation at address xxxxx in module Programa.exe. Read of address xxxx" [...]
No hay que subestimar a esas "x", dicen más de lo que crees. ;)

Cuando te aparezca el mensaje de error puedes presionar la combinación de teclas Ctrl+C para copiarlo al portapapeles y luego mostrarlo aquí.

Y también, muy importante, tras cerrar la ventana de error presiona Ctrl+Alt+S para ver la pila de llamadas, muéstranos ésta por favor. Se trata del camino que siguió tu aplicación hasta ocurrir la excepción.

De preferencia compila con Build, tras asegurarte de marcar el par de opciones que te sugerí anteriormente.

Saludos.

vicvil
09-04-2013, 22:16:53
---------------------------
Application Error
---------------------------
Exception EAccessViolation in module Project1.exe at 00061069.
Access violation at address 00461069 in module 'Project1.exe'. Read of address 00000004.
---------------------------
Aceptar
---------------------------

Al dar Ctrl+Alt+S aparece un recuadro indicando

Call Stack

Process is not accessible

Al González
09-04-2013, 23:27:38
Read of address 00000004.
Es muy probablemente por un objeto Nil, intento de leer algún elemento de una instancia de objeto no creada.

Call Stack

Process is not accessible
Esto puede ser porque el programa ya no está en ejecución (no lo cierres / termines cuando aparezca el error). :)

vicvil
10-04-2013, 15:30:32
Al el mensaje de "Process is not accesible" aparece aun cuando el programa no ha sido cerrado.
Ahora bien, como te dije anteriormente, el problema se da en el componente ShellTreeview en el evento ShellEvent, al parecer es una pifia del componente. Si no logro arreglarlo voy a tener que buscar un componente similar (que no he encontrado) o generar código que haga algo similar.

vicvil
10-04-2013, 16:51:21
Encontré la solución, era una falla del componente.
Solo agregué un try except end en un parrafo del evento ShellEvent, lo probé y ya no se cayó el sistema.

if ((neFolderDelete in Events) or (neDriveRemove in Events)
or ((neFileDelete in Events) and (toShowFiles in Options))) then begin
{ A folder was deleted. See if it is one we have in the list. }
Node := FindNodeByPidl(SI1.Pidl);
if Node = nil then
Node := FindNodeByPath(SI1.Path);
if Selected = Node then
try
Selected := Node.GetNext;
except
end;

Espero le sirva de ayuda por si a alguien le ocurre lo mismo.

Al González
10-04-2013, 18:41:38
Que bueno que lograste encontrar la causa, y gracias por mostrarla. :)

Un mejor parche podría ser (para el último de esos Ifs):
If (Node <> Nil) And (Selected = Node) Then
Selected := Node.GetNext;
En lugar de reprimir la excepción, la evita.

Entonces Node era el objeto Nil en cuestión. La ejecución del método GetNext intentaba leer el primero de sus campos (desplazamiento 4).

vicvil
10-04-2013, 20:42:18
Al puse la excepción como una forma rápida de salir del paso y me funcionó bien, pero voy a probar lo que tu me dices y te cuento.