VB. Net в Visual Studio 2015 - «Попытка чтения или записи в защищенную память. Часто это указывает на повреждение другой памяти». - PullRequest
1 голос
/ 28 мая 2020

каждому. Я надеюсь, что во время этой пандемии все в порядке. c.

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

Помимо прочего, моя программа отображает документы PDF, отсканированные в Xerox Docushare. Документы связаны с идентификатором ссылки из штрих-кода. Может быть один или несколько экземпляров сканирования для одного обложки (штрих-кода).

У меня есть определяемый пользователем элемент управления (ucDocushare_DocumentSetByRefID.vb), который имеет ListView (lvwDocuments) и TabControl (tcDocumentScanInstances). Функциональность заключается в том, что ListView отображает титульные листы, которые представляют наборы сканирования. Когда пользователь щелкает элемент в ListView, TabControl отображается с вкладкой для каждого отдельного экземпляра сканирования, связанного с выбранным титульным листом.

Время от времени, без видимой причины, когда я нажимаю элемент обложки в ListView программа завершается напрямую. При отладке в Visual Studio 2015 отображается следующее сообщение. Это не связано ни с размером документа, ни с количеством экземпляров сканирования. Я успешно поднял очень большие документы со многими страницами. У меня также было много успешных экземпляров сканирования.

System.AccessViolationException не было обработано Сообщение: необработанное исключение типа 'System.AccessViolationException' произошло в System. Windows .Forms.dll

Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Кроме того, появляется вкладка режима прерывания со следующим текстом:

Приложение находится в режиме прерывания

Ваше приложение перешло в состояние останова, но нет кода для отображения, потому что все потоки выполняли внешний код (обычно код системы или фреймворка).

Ошибка возникает сразу при переходе с конца Подстрока этого:

Private Sub tcDocumentScanInstances_DrawItem(sender As Object, e As DrawItemEventArgs) _
    Handles tcDocumentScanInstances.DrawItem

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

Это полный код для этого sub:

'Color code document tab labels and display appropriate icons.
 Private Sub tcDocumentScanInstances_DrawItem(sender As Object, e As DrawItemEventArgs) _
    Handles tcDocumentScanInstances.DrawItem

Try

    Dim intTabIndex As Integer = 0

    '  Identify which TabPage is currently selected
    Dim SelectedTab As TabPage = tcDocumentScanInstances.TabPages(e.Index)

    '  Get the area of the header of this TabPage.  This is the actual label for the tab page.
    Dim HeaderRect As Rectangle = tcDocumentScanInstances.GetTabRect(e.Index)

    '  Create a Brush to paint the Text
    Dim sbBlackBrush As New SolidBrush(Color.Black)
    Dim sbRedBrush As New SolidBrush(Color.Red)

    '  Set the Alignment of the Text
    Dim sf As New StringFormat()
    sf.Alignment = StringAlignment.Center
    sf.LineAlignment = StringAlignment.Center

    '  Paint the Text using the appropriate Bold setting 
    Dim intIconPositionX As Integer = HeaderRect.Left + 4
    Dim intIconPositionY As Integer = HeaderRect.Top + 7

    Dim dicImages As New Dictionary(Of String, Image)()
    dicImages("Tab" & e.Index) = Nothing  ' Set the value of the "variable"

    tcDocumentScanInstances.Padding = New System.Drawing.Point(15, 15)
    'tcDocumentScanInstances.TabPages(0).Width = 500

    If Convert.ToBoolean(e.State And DrawItemState.Selected) Then

        Dim BoldFont As New Font(tcDocumentScanInstances.Font.Name, tcDocumentScanInstances.Font.Size, FontStyle.Bold)

        e.Graphics.FillRectangle(New SolidBrush(SystemColors.ButtonFace), e.Bounds)

        If tcDocumentScanInstances.TabPages(e.Index).Tag Is Nothing Then
            tcDocumentScanInstances.TabPages(e.Index).Tag = ""
        End If

        Select Case tcDocumentScanInstances.TabPages(e.Index).Tag.ToString
            Case "Delete", "Delete Client Letter", "Excessive Documentation"
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.DeleteDocument)
                e.Graphics.DrawString(SelectedTab.Text, BoldFont, sbRedBrush, HeaderRect, sf)
                sbRedBrush.Dispose()
            Case "No Documentation"
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.NoDocumentExists)
                e.Graphics.DrawString(SelectedTab.Text, BoldFont, sbBlackBrush, HeaderRect, sf)
                sbBlackBrush.Dispose()
            Case Else
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.DocumentExists)
                e.Graphics.DrawString(SelectedTab.Text, BoldFont, sbBlackBrush, HeaderRect, sf)
                sbBlackBrush.Dispose()
        End Select

        e.Graphics.DrawImage(dicImages("Tab" & e.Index), intIconPositionX, intIconPositionY)

    Else

        e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(128, 167, 240)), e.Bounds)
        If tcDocumentScanInstances.TabPages(e.Index).Tag Is Nothing Then
            tcDocumentScanInstances.TabPages(e.Index).Tag = ""
        End If

        Select Case tcDocumentScanInstances.TabPages(e.Index).Tag.ToString
            Case "Delete", "Delete Client Letter", "Excessive Documentation"
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.DeleteDocument)
                e.Graphics.DrawString(SelectedTab.Text, e.Font, sbRedBrush, HeaderRect, sf)
                sbRedBrush.Dispose()
            Case "No Documentation", "Missing Documentation"
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.NoDocumentExists)
                e.Graphics.DrawString(SelectedTab.Text, e.Font, sbBlackBrush, HeaderRect, sf)
                sbBlackBrush.Dispose()
            Case Else
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.DocumentExists)
                e.Graphics.DrawString(SelectedTab.Text, e.Font, sbBlackBrush, HeaderRect, sf)
                sbBlackBrush.Dispose()
        End Select

        e.Graphics.DrawImage(dicImages("Tab" & e.Index), intIconPositionX, intIconPositionY)

    End If

    If tcDocumentScanInstances.SelectedTab.Tag Is Nothing Then
        tcDocumentScanInstances.SelectedTab.Tag = ""
    End If

    If frmCaseMaintenance.tcDocumentationByRefID.TabPages( _
        frmCaseMaintenance.tcDocumentationByRefID.SelectedIndex).Tag.ToString.Length >= "Delete".Length Then

        If frmCaseMaintenance.tcDocumentationByRefID.TabPages( _
            frmCaseMaintenance.tcDocumentationByRefID.SelectedIndex).Tag.ToString.Substring(0, "Delete".Length) <> "Delete" Then
            'The coversheet and all associated documents, together, are not marked for deletion.

            Select Case tcDocumentScanInstances.SelectedTab.Tag.ToString.Trim
                Case "Delete", "Delete Client Letter"
                    btnMarkCurrentDocumentForDeletion.Enabled = False
                    btnUnmarkCurrentDocumentForDeletion.Enabled = True
                Case "No Documentation", "Missing Documentation"
                    'A tab displaying a message that there is no documentation can not be deleted.
                    btnMarkCurrentDocumentForDeletion.Enabled = False
                    btnUnmarkCurrentDocumentForDeletion.Enabled = False
                Case Else
                    btnMarkCurrentDocumentForDeletion.Enabled = True
                    btnUnmarkCurrentDocumentForDeletion.Enabled = False
            End Select

        Else 'the coversheet and all associated documents, together, are marked for deletion.

            btnMarkCurrentDocumentForDeletion.Enabled = False
            btnUnmarkCurrentDocumentForDeletion.Enabled = False

        End If

    Else 'the coversheet and all associated documents, together, are marked for deletion.

            Select Case tcDocumentScanInstances.SelectedTab.Tag.ToString.Trim
                Case "Delete", "Delete Client Letter"
                    btnMarkCurrentDocumentForDeletion.Enabled = False
                    btnUnmarkCurrentDocumentForDeletion.Enabled = True
                Case "No Documentation", "Missing Documentation"
                    'A tab displaying a message that there is no documentation can not be deleted.
                    btnMarkCurrentDocumentForDeletion.Enabled = False
                    btnUnmarkCurrentDocumentForDeletion.Enabled = False
                Case Else
                    btnMarkCurrentDocumentForDeletion.Enabled = True
                    btnUnmarkCurrentDocumentForDeletion.Enabled = False
            End Select

    End If

Catch ex As Exception

    If Err.Description = "A generic error occurred in GDI+." Then
        'This error probably was tripped by this line:  e.Graphics.FillRectangle(New SolidBrush(SystemColors.ButtonFace), e.Bounds)
        'tabDocumentScanInstance_DrawItem() will execute again without that line causing a problem, so we do nothing here.
    Else
            MessageBox.Show( _
                 "Class Name:  " & Me.Name & vbCrLf & _
                 "Sub Name:  tcDocumentScanInstances_DrawItem()" & vbCrLf & _
                 "Error Number:  " & Err.Number & vbCrLf & _
                 "Message:  " & Err.Description, _
                 gstrExecutableName & " - Error", _
                 MessageBoxButtons.OK, MessageBoxIcon.Error)
    End If

End Try

End Sub

ИСПОЛЬЗУЕМЫЕ ПРОДУКТЫ

Microsoft Visual Studio Professional 2015 Версия 14.0.25431.01 Обновление 3

Microsoft. NET Версия Framework 4.8.03752

ПЫТАЕМЫЕ РЕШЕНИЯ

  • перезагруженный компьютер

  • удалил исполняемый файл и создал новый

  • выполнено “netsh winsock reset »в командной строке и перезагружено; также выполнил “netsh сброс Winsock каталог »в командной строке и перезагрузил

  • изменил« Целевую платформу »с« Любой ЦП »на« x86 » ".

    1. [Имя проекта] Свойства -> вкладка« Компиляция »->« Параметры компиляции »->« Целевой ЦП »
    2. Перестроить / построить проект. (Я снова изменил его на «Любой процессор», когда «x86» не смог решить проблему.)
  • Было предложено снять следующие флажки в Visual Studio. Он уже был.

       Tools menu ->Options -> Debugging -> General -> Uncheck this option "Suppress JIT optimization on module load"
    
  • заменил System. Windows .Forms.dll, расположенный здесь, другой копией файла (с той же датой / временем и размером файла): C : \ Windows \ Microsoft.NET \ Framework \ v2.0.50727

Мне очень важен ввод.

Ответы [ 2 ]

1 голос
/ 06 июля 2020

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

Решением было создать фиктивный документ и всегда загружать его первым.

Как и раньше, пользователь выбирает Категория, которая заполняет ListView (lvwDocuments), в котором отображаются титульные листы, представляющие наборы сканирования. Однако теперь, прежде чем эти титульные листы будут загружены в список, загружается элемент, представляющий фиктивный титульный лист. (Первый элемент в списке - это фиктивный титульный лист, а остальные - допустимые элементы для выбранной категории.) На основе этого фиктивного элемента в качестве первого элемента в списке я загружаю фиктивный документ на вкладку в tabControl (tcDocumentScanInstances) . Я удаляю фиктивный элемент обложки из ListView (lvwDocuments) и скрываю фиктивный документ на вкладке с помощью панели, которая отображает сообщение, сообщающее пользователю, что экземпляры сканирования появятся на вкладках, когда выбран элемент обложки. (Удивительно, но на самом деле он выглядит лучше, чем интерфейс, который у меня был раньше, и сообщение не кажется ненужным или неуместным!) Пользователь никогда не видит фиктивный элемент в списке, поскольку он загружается и удаляется так быстро.

Вот и все. Из того, что я обнаружил при поиске решения, похоже, существует очень много разных ситуаций, в которых возникает эта ошибка. Я sh Я знал лучший способ предотвратить это, способ, который можно было бы применить и в других ситуациях. Это решение работает для меня в этом случае. Надеюсь, это кому-то поможет.

0 голосов
/ 29 мая 2020

Могу я предложить вам открыть свой проект как администратор:

Щелкните правой кнопкой мыши VS2015-> Запуск от имени администратора и откройте свой проект.

Отладьте код. Я думаю, ваша проблема не в коде, а в доступе к ресурсам. Здесь написано : :

Вы можете делать почти все в Visual Studio IDE как обычный пользователь, но вам нужны права администратора для выполнения следующих задач:

Ящик для инструментов || Добавление элементов управления classi c COM в Toolbox. || Использование панели инструментов

Как вы упомянули

'У меня есть пользовательский элемент управления (ucDocushare_DocumentSetByRefID.vb)'

...