2011-12-01 14 views
14

Estamos teniendo un problema con nuestra aplicación Windows forms donde termina debido a una excepción no controlada de tipo AccessViolationException que el seguimiento de pila indica que se produce dentro del control ToolTip.AccessViolationException en ToolTip que produce errores COMCTL32.dll - .NET 4.0

El error se produce en diferentes momentos de la aplicación, y actualmente no podemos reproducirlo con fiabilidad. En esta etapa, está ocurriendo solo en producción en Windows 7 y solo para algunos usuarios, pero no en otros, incluso entre usuarios que usan la aplicación de manera similar. Parece estar relacionado con la máquina, por lo que hemos hecho cosas como garantizar que el controlador de gráficos esté actualizado.

En el registro de eventos, siempre hay 2 errores diferentes se conectaron, uno relacionado con nuestra aplicación:

Application: <Application>.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.AccessViolationException 
Stack: 
    at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr, IntPtr, Int32, IntPtr, IntPtr) 
    at System.Windows.Forms.NativeWindow.DefWndProc(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.ToolTip.WndProc(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.ToolTip+ToolTipNativeWindow.WndProc(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr, Int32, IntPtr, IntPtr) 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef) 
    at System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32) 
    at System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext) 
    at System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext) 
    at <Company>.Windows.Forms.<Application>.Startup.Main(System.String[]) 

y uno relativos a comctl32.dll:

Faulting application name: <Application>.exe, version: 7.13.0.2086, time stamp: 0x4ec5e710 
Faulting module name: comctl32.dll, version: 5.82.7601.17514, time stamp: 0x4ce7b82c 
Exception code: 0xc0000005 
Fault offset: 0x00043286 
Faulting process id: 0xcdc 
Faulting application start time: 0x01cca96312446309 
Faulting application path: C:\Program Files\<Company>\Client\<Application>.exe 
Faulting module path: C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.17514_none_ec83dffa859149af\comctl32.dll 
Report Id: b425143c-1575-11e1-bccf-6c626d955bf1 

Los cambios traza primera pila dependiendo de en qué parte del flujo de trabajo se produzca el error, sin embargo, los primeros 9 elementos en la pila son siempre los mismos, la diferencia suele ser una llamada showDialog que aparece entre el método Main() y el método RunMessageLoop. Por ejemplo:

Application: <Application>.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.AccessViolationException 
Stack: 
    at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr, IntPtr, Int32, IntPtr, IntPtr) 
    at System.Windows.Forms.NativeWindow.DefWndProc(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.ToolTip.WndProc(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.ToolTip+ToolTipNativeWindow.WndProc(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr, Int32, IntPtr, IntPtr) 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef) 
    at System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32) 
    at System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext) 
    at System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext) 
    at System.Windows.Forms.Application.RunDialog(System.Windows.Forms.Form) 
    at System.Windows.Forms.Form.ShowDialog(System.Windows.Forms.IWin32Window) 
    at System.Windows.Forms.Form.ShowDialog() 
    at <Company>.Windows.Forms.<Application>.ApplicationForm.<EventSubscribingMethod>(System.Object, System.EventArgs) 
    at <Company>.<Application>.<Class1>.RaiseShowResultDialogNowEvent() 
    at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry) 
    at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(System.Object) 
    at System.Threading.ExecutionContext.runTryCode(System.Object) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object) 
    at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry) 
    at System.Windows.Forms.Control.InvokeMarshaledCallbacks() 
    at System.Windows.Forms.Control.WndProc(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.ScrollableControl.WndProc(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.Form.WndProc(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.Control+ControlNativeWindow.OnMessage(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.Control+ControlNativeWindow.WndProc(System.Windows.Forms.Message ByRef) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr, Int32, IntPtr, IntPtr) 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef) 
    at System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32) 
    at System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext) 
    at System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext) 
    at <Company>.Windows.Forms.<Application>.Portal.Startup.Main(System.String[]) 

---- ---- Actualización

he tenido una petición para incluir una parte del código de la principal, no quiero para incluir todo el código, pero es un extracto :

<System.STAThread()> _ 
    Public Shared Function Main(ByVal args() As String) As Integer 
     -- Perform startup validation, setup logging framework, etc 
     ... 
     Dim appLife as new ApplicationContext(myStartupForm) 
     Application.Run(appLife) 
     Return 0 

    End Function 

Algunas notas adicionales:

¿Alguien sabe qué podría estar causando esto?

Gracias,

+0

mostrará el código en 'Principal()' por favor. Parece que no estás llamando 'Application.Run'. – leppie

+0

Gracias por la información adicional. '0xc0000005' es una' NullReferenceException' nativa. Como dices que estás anulando 'WndProc', probablemente buscaría punteros nulos. – leppie

Respuesta

21

De acuerdo con la EM, no es un problema conocido con el control DataGrid en ciertas situaciones, y la manera de evitar este problema es desactivar las sugerencias para sus controles DataGrid.

Implementaremos el cambio y lo implementaremos en un grupo piloto en los próximos días. Volveré a publicar con éxito/falla en aproximadamente una semana (a menos que ocurra una falla antes).

La propiedad para establecer de acuerdo con la EM es DataGridView.ShowCellToolTips = false;

Esto ha solucionado el problema para nuestra aplicación.

Para reproducir el problema, que teníamos que hacer lo siguiente:

  • pasa el ratón sobre una celda en nuestro DataGridView que sabíamos que mostrar una información sobre herramientas
  • pestaña Alt a otra aplicación (que se mostrarán en la parte superior de la aplicación) antes de que aparezca la información sobre herramientas
  • no mueva el ratón
  • pestaña Alt vuelta a la aplicación
  • Nuestros bloquea la aplicación.
+0

¡Guau! ¡Finalmente pude duplicar mi problema http://stackoverflow.com/q/7458915/68936 gracias a su respuesta! Es una mierda tener que desactivar la información sobre herramientas para todos los datagridview, pero supongo que es mejor que una violación de acceso. ¿Tendría alguna URL de referencia, o "Según MS" significa que obtuvo la información a través de conversaciones privadas con ellos? Gracias de nuevo por publicar tu respuesta. – Jimmy

+1

Hola Jimmy, recibí la respuesta a través del soporte pago. No había un KB oficial por el que pudieran señalarme desafortunadamente. Me alegro de que esto te haya ayudado :-) – Sean

+0

te debo un almuerzo ... muchas gracias por esta gran respuesta. Me tomó 2 semanas encontrar que todavía no salió nada, pero hoy por su cortesía ... pude encontrarlo todo. ¿Cómo llegaste a saber acerca de lo mismo? – Dhananjay

10

Parece que la configuración DataGridView.ShowCellToolTips = false en Form.Deactivate previene el bloqueo. Se puede restablecer a verdadero en Form.Activate.

Sin embargo, la información sobre herramientas aún se muestra arriba de las ventanas recientemente enfocadas, pero supongo que es mejor que colgar.

O aún mejor:

El problema sólo se produce cuando los estilos visuales no están habilitadas.

Al agregar Application.EnableVisualStyles() en main() antes de que se hayan creado las instancias de los formularios, se resuelve el problema.

+0

Confirmado que al establecer Application.EnableVisualStyles() se resuelve el problema – Jimmy

Cuestiones relacionadas