Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память была повреждена - PullRequest
3 голосов
/ 09 января 2009

Я создал элемент управления со списком Winforms AutoComplete, унаследованный от ComboBox, следующим методом:

Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
        MyBase.OnKeyPress(e)
        Dim text As String = Me.Text
        If Char.IsLetter(e.KeyChar) Then
            text = text + e.KeyChar
        End If
        If (text.Length = AutoCompleteSearchChars And Char.IsLetter(e.KeyChar)) Then
            SetAutoCompleteMethod.Invoke(text)
            Me.AutoCompleteSource = AutoCompleteSource.ListItems
            Me.Text = text
            Me.SelectionStart = text.Length
            Me.SelectionLength = 0
            If Me.Items.Count > 0 Then
                Me.SelectedIndex = 0
            End If
            e.Handled = True
        End If
    End Sub

«SetAutoCompleteMethod» - это делегат, указывающий на метод, который заполняет элементы комбинированного списка, основанные на использовании текущего текста в поле со списком в качестве префикса для поиск по шаблону. Это обеспечивает функциональность, аналогичную списку ajax autocomplete.

Все работает нормально при первом вызове, но при втором вызове появляется сообщение «Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена» Ошибка появляется после того, как весь код для обновления выпадающего списка завершен. Я получаю следующую трассировку стека:

в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW (MSG & сообщение) в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms. UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Int32 dwComponentID, причина Int32, Int32 pvLoopData) в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (Int32 причина, контекст ApplicationContext)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoop (Int32 причина, контекст ApplicationContext)
в System.Windows.Forms.Application.Run (ApplicationContext контекст) в Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun () в Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel () в Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run (String [] commandLine) в ApplicationShell.My.MyApplication.Main (String [] Аргс) в 17d14f5c-a337-4978-8281-53493378c1071.vb: линия 81 в System.AppDomain._nExecuteAssembly (Собрание сборка, строка [] args) в System.AppDomain.ExecuteAssembly (String AssemblyFile, Доказательства AssemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.ThreadHelper.ThreadStart_Context (Объект состояние) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, ContextCallback обратный вызов, состояние объекта) в System.Threading.ThreadHelper.ThreadStart ()

Кто-нибудь может указать мне правильное направление, чтобы решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 09 января 2009

Когда я получил эту ошибку, оказалось, что действительно возникла проблема с разыменованием нулевого указателя, но он все равно вызвал метод и не падал, пока не попытался получить доступ к одной из переменных-членов. Я до сих пор не работал с VB до появления .Net, но ваша трассировка стека предполагает, что он умер где-то при нативном вызове. Если это так, вы можете столкнуться с той же проблемой, и в этом случае я бы рекомендовал вам дважды проверить эти указатели, не только там, где он падает, но и на нескольких уровнях вверх.

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

Добавление объекта в коллекцию элементов, метод ToString () которой ничего не возвращает, - это простой способ получить это. Возможно, есть и другие способы достичь такого же поведения.

Перейдите к диагностике, как если бы это было исключение NullReferenceException.

См. Какой самый странный угловой случай вы видели в C # или .NET? для другого случая.

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