AccessViolationException для всплывающей подсказки, которая вызывает ошибку COMCTL32.dll - .NET 4.0 - PullRequest
14 голосов
/ 01 декабря 2011

У нас возникла проблема с нашим приложением форм Windows, когда оно завершается из-за необработанного исключения типа AccessViolationException, которое указывает трассировка стека, происходит в элементе управления ToolTip.

Ошибка возникает в разное время в приложении, и в настоящее время мы не можем ее надежно воспроизвести. На этом этапе это происходит только в рабочей среде в Windows 7 и только для некоторых пользователей, но не для других - даже среди пользователей, которые используют приложение аналогичным образом. Похоже, что это связано с машиной, поэтому мы сделали такие вещи, как обеспечение обновления графического драйвера.

В журнале событий всегда регистрируются 2 разные ошибки, одна из которых относится к нашему приложению:

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

И один, относящийся к 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

Первая трассировка стека изменяется в зависимости от того, где в рабочем процессе возникает ошибка, однако, первые 9 элементов в стеке всегда одинаковы, разница обычно заключается в вызове showDialog, который появляется между методом Main () и RunMessageLoop метод. E.g.:

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

---- Обновление ----

У меня был запрос на включение некоторого кода из Main, я не хочу включать весь код, но выдержка:

 <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

Некоторые дополнительные примечания:

  • Мы используем блок приложения процесса пользовательского интерфейса из MS Patterns and Practices
  • Мы переопределяем WndProc в нескольких элементах управления, включая CheckBoxComboBox из проекта кода в http://www.codeproject.com/KB/combobox/extending_combobox.aspx

Кто-нибудь знает, что может быть причиной этого?

Спасибо

Ответы [ 3 ]

22 голосов
/ 08 декабря 2011

Согласно MS, в определенных ситуациях существует известная проблема с элементом управления DataGrid, и способ избежать этой проблемы состоит в том, чтобы отключить всплывающие подсказки для элементов управления DataGrid.

Мы будем внедрять изменения и переходитьв течение следующих нескольких дней я отправлю его в экспериментальную группу, и примерно через неделю я опубликую его с успехом / неудачей (если, конечно, до этого не произойдет сбой).

Свойство, установленное в соответствии с MS, -DataGridView.ShowCellToolTips = false;

Это исправило проблему для нашего приложения.

Чтобы воспроизвести проблему, нам нужно было сделать следующее:

  • Наведите указатель мыши на ячейкув нашем DataGridView, который, как мы знали, будет отображаться всплывающая подсказка
  • для другого приложения (которая будет отображаться поверх вашего приложения) до отображения всплывающей подсказки
  • Не перемещайте мышь
  • Alt tab к нашему приложению
  • Сбой нашего приложения.
10 голосов
/ 19 марта 2012

Кажется, что установка DataGridView.ShowCellToolTips = false на Form.Deactivate предотвращает сбой. Может быть сброшено в true на Form.Activate.

Однако всплывающая подсказка по-прежнему отображается над вновь сфокусированными окнами, но я думаю, что это лучше, чем сбой.

Или еще лучше:

Проблема возникает только тогда, когда визуальные стили не включены.

Добавление Application.EnableVisualStyles() в main() перед созданием любых форм решает проблему.

0 голосов
/ 06 марта 2018

подробнее https://github.com/Microsoft/dotnet/issues/402

6 лет спустя решение, к сожалению, до сих пор «использует comctl v6»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...