Muy buenas,
estoy haciendo una aplicación que no requiere del control de un usuario (desatendida). El problema que tengo, és que aunque intento controlar todos los errores que me puedan aparecer, de tanto en quanto me aparece la típica ventana de error incontrolado a la que le tienes que dar al cerrar. Como no hay ningún usuario, no se aprieta a ningún botón y el tema se queda colgado. Hay alguna manera de decirle a windows que no saque este tipo de errores? He trasteado con la opción de informes de errores del panel de control -> sistema y no ha habido manera de sacar nada bueno... :(
Gracias!
Te muestro el codigo que uso yo en VB que facilmente imagino podras portar a C++. Es todo a traves del API de Windows oviamente:
'Esto en C++ supongo que iria en una cabecera *.h:
Public Const EXCEPTION_CONTINUE_EXECUTION = -1 'Continua la ejecucion ignorando el error.
Public Const EXCEPTION_NONCONTINUABLE As Long = &H1 'Detiene la ejecucion al instante, sin mostrar el mensaje de windows.
Public Declare Function SetUnhandledExceptionFilter Lib "kernel32" (ByVal lpTopLevelExceptionFilter As Long) As Long
Public Function MyExceptionHandler(lpEP As EXCEPTION_POINTERS) As Long
'Terminamos la ejecucion del programa:
MyExceptionHandler = EXCEPTION_NONCONTINUABLE
End Function
En el inicio del programa deberias hacer una llamada tal que asi:
'Activa la intercepcion de errores de Windows:
Call SetUnhandledExceptionFilter(AddressOf MyExceptionHandler)
Para desactivar la intercepcion de errores seria hacer otra llamada a SetUnhandledExceptionFilter() pasandole de parametro 0.
Esto haria que si se produce un error el programa ejecutaria al instante la funcion MyExceptionHandler() donde tendriamos el codigo que responderia al error antes de que Windows reaccione, mostrando nosotros por ejemplo un mensaje de error propio o guardando datos importantes antes de perderlos, lo bueno esta en que la constante EXCEPTION_NONCONTINUABLE hace que el programa, una vez ejecutada la funcion MyExceptionHandler() se cierre sin mostrar Windows ningun aviso ni reporte de errores ni nada, osea, se cerrara de forma silenciosa, que imagino es lo que andas buscando.
Un consejo, la constante EXCEPTION_CONTINUE_EXECUTION hace que el programa ignore totalmente el error y trate de seguir su ejecucion. No recomiendo mucho el uso de esta constante, ya que si el error del programa se produce de forma continuada al producirse en un punto clave, el programa entraria en un bucle cerrado tratando de ejecutarse sin lograrlo. Lo aviso por que esto me ha pasado alguna vez haciendo pruebas.
Salu2...
Interesante código... (ole)
Me estudiaré tu código con calma pq me parece tb bastante interesante. Gracias!!
Yo lo he conseguido con la función SetErrorMode(2).
Gracias!! (ole)
Añado unas estructura de datos que requeria uno de los parametros de la funcion (se me escaparon con las prisas el otro dia xD)
'Esto en C++ supongo que iria en una cabecera *.h:
Public Const EXCEPTION_CONTINUE_EXECUTION = -1 'Continua la ejecucion ignorando el error.
Public Const EXCEPTION_NONCONTINUABLE As Long = &H1 'Detiene la ejecucion al instante, sin mostrar el mensaje de windows.
Public Const EXCEPTION_MAXIMUM_PARAMETERS = 15
Public Type CONTEXT
FltF0 As Double
FltF1 As Double
FltF2 As Double
FltF3 As Double
FltF4 As Double
FltF5 As Double
FltF6 As Double
FltF7 As Double
FltF8 As Double
FltF9 As Double
FltF10 As Double
FltF11 As Double
FltF12 As Double
FltF13 As Double
FltF14 As Double
FltF15 As Double
FltF16 As Double
FltF17 As Double
FltF18 As Double
FltF19 As Double
FltF20 As Double
FltF21 As Double
FltF22 As Double
FltF23 As Double
FltF24 As Double
FltF25 As Double
FltF26 As Double
FltF27 As Double
FltF28 As Double
FltF29 As Double
FltF30 As Double
FltF31 As Double
IntV0 As Double
IntT0 As Double
IntT1 As Double
IntT2 As Double
IntT3 As Double
IntT4 As Double
IntT5 As Double
IntT6 As Double
IntT7 As Double
IntS0 As Double
IntS1 As Double
IntS2 As Double
IntS3 As Double
IntS4 As Double
IntS5 As Double
IntFp As Double
IntA0 As Double
IntA1 As Double
IntA2 As Double
IntA3 As Double
IntA4 As Double
IntA5 As Double
IntT8 As Double
IntT9 As Double
IntT10 As Double
IntT11 As Double
IntRa As Double
IntT12 As Double
IntAt As Double
IntGp As Double
IntSp As Double
IntZero As Double
Fpcr As Double
SoftFpcr As Double
Fir As Double
Psr As Long
ContextFlags As Long
Fill(4) As Long
End Type
Public Type EXCEPTION_RECORD
ExceptionCode As Long
ExceptionFlags As Long
pExceptionRecord As Long ' Pointer to an EXCEPTION_RECORD structure
ExceptionAddress As Long
NumberParameters As Long
ExceptionInformation(EXCEPTION_MAXIMUM_PARAMETERS - 1) As Long
End Type
Public Type EXCEPTION_POINTERS
pExceptionRecord As EXCEPTION_RECORD
ContextRecord As CONTEXT
End Type
Public Declare Function SetUnhandledExceptionFilter Lib "kernel32" (ByVal lpTopLevelExceptionFilter As Long) As Long
Public Function MyExceptionHandler(lpEP As EXCEPTION_POINTERS) As Long
'Terminamos la ejecucion del programa:
MyExceptionHandler = EXCEPTION_NONCONTINUABLE
End Function
Salu2...
La verdad que lo que quieres lo consigues con SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX)
Pero una forma limpia de tratar con errores a nivel de sistema es con SetUnhandledExceptionFilter, asi puedes guardar el estado del programa antes de salir por un error.