2011-12-01 9 views
14

Mamy problem z naszej aplikacji formularzy systemu Windows, gdzie kończy się z powodu nieobsługiwanego wyjątku typu AccessViolationException, że śledzenie stos wskazuje, występuje w formantu ToolTip.AccessViolationException na ToolTip, że błędy COMCTL32.dll - .NET 4.0

Błąd pojawia się w różnych momentach w aplikacji, a obecnie nie jesteśmy w stanie w wiarygodny sposób go odtworzyć. Na tym etapie występuje tylko w produkcji na Windows 7 i tylko dla niektórych użytkowników, ale nie dla innych - nawet wśród użytkowników, którzy korzystają z aplikacji w podobny sposób. Wygląda na to, że jest związany z maszyną, więc zrobiliśmy takie rzeczy, jak upewnienie się, że sterownik karty graficznej jest aktualny.

w dzienniku zdarzeń, zawsze są 2 różne błędy zalogowany, jedna odnosząca się do naszej aplikacji:

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

i jedno dotyczące 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 

Zmiany śladowe pierwszego stosu w zależności od tego, gdzie w przepływie pracy występuje błąd, 9 pierwszych elementów na stosie jest zawsze takich samych, różnica jest zazwyczaj wywoływana przez showDialog, która pojawia się pomiędzy metodą Main() i RunMessageLoop. Np:

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

---- Aktualizacja ----

miałem żądanie włączenia niektórych kodu od głównego, nie chcę, aby to cały kod, ale wyciąg jest :

<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 

Niektóre dodatkowe uwagi:

Czy ktoś wie co może być tego przyczyną?

Dzięki

+0

Pokaż kod w 'main()' proszę. Wygląda na to, że nie wywołujesz 'Application.Run'. – leppie

+0

Dzięki za dodatkowe informacje. '0xc0000005' jest natywnym' NullReferenceException'. Jak mówisz, nadpisujesz 'WndProc', prawdopodobnie szukałbym tam jakichkolwiek wskaźników zerowych. – leppie

Odpowiedz

21

Według SM, jest to znany problem z kontrolką DataGrid w pewnych sytuacjach, a także sposób na uniknięcie tego problemu jest wyłączenie podpowiedzi dla formantów DataGrid.

Będziemy wprowadzać zmiany i wprowadzać je do grupy pilotażowej w ciągu najbliższych kilku dni. W ciągu tygodnia wyślę z sukcesem/niepowodzeniem (chyba, że ​​wcześniej doszło do awarii).

Obiekt ustawić zgodnie z SM jest DataGridView.ShowCellToolTips = false;

ta stała się kwestią dla naszej aplikacji.

Aby odtworzyć problem, musieliśmy wykonać następujące czynności:

  • Najedź myszką na komórki w naszym DataGridView że wiedzieliśmy pokazać etykietkę
  • Alt zakładka do innej aplikacji (który będzie wyświetlany w górnej części aplikacji) przed etykietka jest pokazany
  • nie ruszaj myszką
  • Alt kartę z powrotem do naszej aplikacji
  • Nasze awarii aplikacji.
+0

Wow! W końcu udało mi się skopiować mój numer http://stackoverflow.com/q/7458915/68936 dzięki Twojej odpowiedzi! To jest suck, aby wyłączyć podpowiedzi dla wszystkich datagridview, ale lepsze niż naruszenie dostępu, jak przypuszczam. Czy masz jakiś referencyjny adres URL, czy też "według MS" oznacza, że ​​otrzymałeś informacje przez prywatne rozmowy z nimi? Jeszcze raz dziękuję za przesłanie odpowiedzi. – Jimmy

+1

Cześć Jimmy, dostałem odpowiedź dzięki płatnemu wsparciu. Nie było oficjalnego KB, na który mogliby mnie niestety wskazać. Cieszę się, że ci to pomogło :-) – Sean

+0

jestem ci winien lunch .. dziękuję za tę wspaniałą odpowiedź. zajęło mi to 2 tygodnie, aby znaleźć to jeszcze nic nie wyszło, ale dzisiaj z powodu twojej uprzejmości .. mogłem znaleźć to wszystko. skąd dowiedziałeś się o tym samym? – Dhananjay

10

Wygląda na to, że ustawienie DataGridView.ShowCellToolTips = false na Form.Deactivate zapobiega awariom. Można go zresetować do wartości true na Form.Activate.

Etykieta narzędzia jest nadal wyświetlana nad nowymi oknami, ale wydaje mi się, że jest to lepsze niż awaria.

Albo jeszcze lepiej:

Problem występuje tylko wtedy, gdy style wizualne nie są włączone.

Dodanie Application.EnableVisualStyles() w main() przed utworzeniem formularzy rozwiązuje problem.

+0

Potwierdzono, że ustawienie Application.EnableVisualStyles() rozwiązuje problem – Jimmy