AccessViolationException от комбо: попытка чтения или записи в защищенную память - PullRequest
3 голосов
/ 04 ноября 2008

Пользователи иногда получают вышеупомянутую ошибку при использовании нашего приложения (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.Windows.Forms.Control.DefWndProc (сообщение & m) в System.Windows.Forms.Control.WndProc (сообщение & m) в System.Windows.Forms.ComboBox.WndProc (Message & m) в ControlEx.AutoCompleteCombo.WndProc (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & 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 ]

1 голос
/ 05 ноября 2008

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

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

0 голосов
/ 08 апреля 2010

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

Это может вызвать нарушение прав доступа в соответствии с Microsoft.

0 голосов
/ 02 января 2009

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

0 голосов
/ 11 ноября 2008

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

0 голосов
/ 04 ноября 2008

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


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

...