AccessViolationException из комбо: попытка чтения или записи в защищенную память

Пользователи иногда получают указанную выше ошибку при использовании нашего приложения (VB.Net, Winforms, с использованием v2 фреймворка). Я не могу это воспроизвести. Стек вызовов выглядит следующим образом:

: System.AccessViolationException: попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена. в System.Windows.Forms.UnsafeNativeMethods.CallWindowProc (IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam) в System.Windows.Forms.NativeWindow.DefWndProc (Message & m) в System.Control.Control.Windows (Сообщение & m) в System.Windows.Forms.Control.WndProc (Сообщение & m) в System.Windows.Forms.ComboBox.WndProc (Сообщение & m) в ControlEx.AutoCompleteCombo.WndProc (Сообщение & m) в System.Windows.Forms.Control .ControlNativeWindow.OnMessage (сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (сообщение & m) в System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Код для ControlEx.AutoCompleteCombo.WndProc выглядит следующим образом:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Try
        If Not m_fReadOnly Then
            MyBase.WndProc(m)
        Else
            Select Case m.Msg
                Case WM_LBUTTONDOWN, WM_LBUTTONDBLCLK
                    ' do nothing
                Case Else
                    MyBase.WndProc(m)
            End Select
        End If
    Catch ex As OutOfMemoryException
        Throw New OutOfMemoryException("Exception during WndProc for combo " & Me.Name, ex)
    End Try
End Sub

Была добавлена ​​обработка ошибок, чтобы мы могли определить, какая комбинация вызывает проблему, когда мы получаем OutOfMemoryException.

Мы будем очень благодарны за любые подсказки относительно причин этого! :-)


person Sparky    schedule 04.11.2008    source источник


Ответы (5)


У меня странное недетерминированное ощущение с OutOfMemoryException в вашем коде.

Зачем тебе это надо? И если оно вам нужно, может это быть причиной ваших проблем? OutOfMemoryExceptions очень редки. Если они у вас есть, я думаю, это явный признак того, что что-то еще не так.

person GvS    schedule 05.11.2008

Похоже, вы используете настраиваемый элемент управления полем со списком под названием AutoCompleteCombo. Я подозреваю, что переопределение WndProc в этом классе содержит ошибку - вероятно, изменение значения параметра сообщения. Можете ли вы опубликовать код этого метода, чтобы мы могли посмотреть?


В опубликованном вами коде нет ничего, что могло бы вызвать проблему. Вероятно, вам стоит посмотреть на остальную часть кода AutoCompleteCombo на предмет потенциальных ошибок. Больше нечего делать.

person Stu Mackellar    schedule 04.11.2008

Спасибо за ваш вклад, GvS и Стю. Я немного больше исследую OutOfMemory и нашел интересный способ, которым это может произойти (добавление двух элементов в комбо, которые возвращают Nothing в их переопределении ToString - http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=247053&SiteID=1)

person Sparky    schedule 11.11.2008

Я только что обнаружил, что исходное исключение (AccessViolationException) также вызвано наличием элемента в ComboBox, ToString которого возвращает Nothing (null). Я не знаю, почему вы иногда получаете OutOfMemory, иногда Accessviolation и иногда исключение NullReference.

person pipTheGeek    schedule 02.01.2009

Снято в темноте, но, возможно, вы пытаетесь изменить список автозаполнения во время события KeyDown, KeyUp или KeyPress?

Согласно Microsoft, это может вызвать нарушения доступа.

person Special Touch    schedule 07.04.2010