каждому. Я надеюсь, что во время этой пандемии все в порядке. 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 » ".
- [Имя проекта] Свойства -> вкладка« Компиляция »->« Параметры компиляции »->« Целевой ЦП »
- Перестроить / построить проект. (Я снова изменил его на «Любой процессор», когда «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
Мне очень важен ввод.