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.WrolFor. (Сообщение & 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.
Любые подсказки относительно того, что вызывает это, очень ценились бы!:-)
5 ответов
У меня странное недетерминированное чувство с OutOfMemoryException в вашем коде.
Зачем тебе это надо? И если вам это нужно, может ли это быть причиной ваших проблем? Исключения OutOfMemory очень редки. Если у вас есть такие, я думаю, это убедительный признак того, что что-то не так.
Я только что обнаружил, что исходное исключение (AccessViolationException) также вызвано наличием элемента в ComboBox, ToString которого возвращает Nothing (null). Я не знаю, почему вы иногда получаете OutOfMemory, иногда Accessviolation и иногда исключение NullReference.
Похоже, вы используете пользовательский элемент управления поля со списком под названием AutoCompleteCombo. Я подозреваю, что в переопределении WndProc в этом классе есть ошибка - возможно, изменение значения параметра сообщения. Можете ли вы опубликовать код этого метода, чтобы мы могли посмотреть?
В опубликованном вами коде нет ничего, что могло бы вызвать проблемы. Вероятно, вам стоит взглянуть на остальную часть кода AutoCompleteCombo на предмет потенциальных ошибок. Там на самом деле больше ничего не может продолжаться.
Выстрел в темноте, но, возможно, вы пытаетесь изменить список автозаполнения во время события KeyDown, KeyUp или KeyPress?
Это может привести к нарушениям доступа в соответствии с Microsoft.
Спасибо за ваш вклад, GvS и Stu. Я немного больше изучаю OutOfMemory и нашел интересный способ, которым это может произойти (добавление двух элементов в комбо, которые ничего не возвращают в их переопределении ToString - http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=247053&SiteID=1)