2011-12-01 15 views
14

Si verifica un problema con la nostra applicazione Windows Form in fase di chiusura a causa di un'eccezione non gestita di tipo AccessViolationException che indica che la traccia dello stack si verifica all'interno del controllo ToolTip.AccessViolationException su ToolTip che presenta errori COMCTL32.dll - .NET 4.0

L'errore si verifica in momenti diversi dell'applicazione e al momento non è possibile riprodurlo in modo affidabile. In questa fase si verifica solo in produzione su Windows 7 e solo per alcuni utenti, ma non per altri - anche tra gli utenti che utilizzano l'applicazione in modo simile. Sembra essere correlato alla macchina e quindi abbiamo fatto cose come assicurarsi che il driver grafico sia aggiornato.

Nel registro eventi, ci sono sempre 2 diversi errori registrati, uno relativo alla nostra applicazione:

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[]) 

e uno in materia di 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 

la prima pila modifiche traccia a seconda di dove nel flusso di lavoro si verifica l'errore, tuttavia, i primi 9 elementi nello stack sono sempre gli stessi, la differenza è solitamente una chiamata showDialog che appare tra il metodo Main() e il metodo RunMessageLoop. Ad esempio:

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[]) 

---- ---- Aggiornamento

ho avuto una richiesta di includere una parte del codice da Main, non voglio includere tutto il codice, ma è un estratto :

<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 

Alcune note aggiuntive:

Qualcuno sa che cosa potrebbe causare questo?

Grazie,

+0

Mostra il codice in 'Main()' per favore. Sembra che tu non stia chiamando 'Application.Run'. – leppie

+0

Grazie per ulteriori informazioni. '0xc0000005' è un nativo' NullReferenceException'. Come stai dicendo che stai eseguendo l'override di 'WndProc', probabilmente guarderei lì per eventuali puntatori nulli. – leppie

risposta

21

Secondo MS, v'è un problema noto con il controllo DataGrid in certe situazioni, e il modo per evitare questo problema è quello di disattivare la descrizione per i controlli DataGrid.

Implementeremo il cambiamento e lo inoltreremo a un gruppo pilota nei prossimi due giorni, pubblicherò con successo/insuccesso in circa una settimana (a meno che, ovviamente, non si verifichi prima di allora).

La proprietà per impostare in base a MS è DataGridView.ShowCellToolTips = false;

Questo risolto il problema per la nostra applicazione.

Per riprodurre il problema, abbiamo bisogno di fare quanto segue:

  • passa il mouse sopra una cella nel nostro DataGridView che sapevamo avrebbe mostrato un tooltip
  • scheda Alt a un'altra applicazione (che visualizzerà in cima alla vostra applicazione) prima che il tooltip è mostrato
  • non spostare il mouse
  • scheda Alt torna alla nostra applicazione
  • nostri crash dell'applicazione.
+0

Wow! Sono finalmente riuscito a duplicare il mio problema http://stackoverflow.com/q/7458915/68936 grazie alla tua risposta! Fa schifo dover disabilitare i tooltip per tutti i datagridview, ma meglio di una violazione di accesso, suppongo. Ti capita di avere qualsiasi URL di riferimento, o "Secondo MS" significa che hai ottenuto le informazioni attraverso conversazioni private con loro? Grazie ancora per aver postato la tua risposta. – Jimmy

+1

Ciao Jimmy, ho ricevuto la risposta tramite il supporto pagato. Non c'era un KB ufficiale a cui potessero indirizzare purtroppo. Sono contento che questo ti abbia aiutato comunque :-) – Sean

+0

ti devo un pranzo .. grazie mille per questa ottima risposta. mi ci sono voluti 2 settimane per trovare questo, ma non è venuto fuori nulla, ma oggi a causa della tua cortesia ... ho potuto trovare tutto. come sei venuto a sapere della stessa cosa? – Dhananjay

10

Sembra che impostare DataGridView.ShowCellToolTips = false sul Form.Deactivate impedisce l'incidente. Può essere ripristinato su true su Form.Activate.

Il tooltip è ancora mostrato sopra le finestre appena focalizzate, tuttavia - ma suppongo che sia meglio di crash.

O ancora meglio:

Il problema si verifica solo quando gli stili di visualizzazione non sono abilitati.

L'aggiunta di Application.EnableVisualStyles() a main() prima che qualsiasi istanza venga creata un'istanza risolve il problema.

+0

Confermato che l'impostazione Application.EnableVisualStyles() risolve il problema – Jimmy