У меня есть устаревшее приложение vb6, которое вылетает при выходе - как в виде исполняемого файла, так и в среде IDE. Как я могу избежать аварии?
- В настоящее время я выгружаю формы (кроме frmmain) в
form_unload
, освобождаю все ADODB RecordSets, устанавливая все boundcollections = none.
- Я попытался
SetErrorMode SEM_NOGPFAULTERRORBOX
в событии form_terminate
, и это не остановило возникновение ошибки.
- Я также проверил наличие экземпляров подклассов в моем коде и не нашел ни одного.
- Я проверил используемые компоненты извне Microsoft - это орфография 8 ComponentOne flexgrid 8 и элемент управления sizer ComponentOne. Обширный поиск в Интернете и на форуме не выявил каких-либо известных проблем, похожих на мою, для этих элементов управления.
Похоже, проблема не возникает, если я выключаю программу перед тем, как что-то делать. Однако загрузка связанных элементов управления, по-видимому, близка к месту возникновения проблемы, несмотря на неоднократные действия с отладчиком, кажется, что начало проблемы «движется». Проблема возникает при программном выходе, элементе управления "X" и IDE "конец"
Сообщение об ошибке
The instruction at "0x77d042b8" referenced memory at "0x055c9028". The memory could not be "Read"
. Заголовок в окне ошибок - это всплывающая подсказка (различающаяся в разное время) внутри моего приложения
Я сделал разрывы при пошаговом выполнении кода - приложение вылетает на выходной подстроке при событии Form_Unload
ДОБАВЛЕНО
Я понял, что должен был включить некоторую другую информацию в свой оригинальный пост. Я очень устал и расстроился, когда сделал это, и сожалею, что это было так трудно читать.
Теперь
1) У меня установлен последний пакет обновления (6) и последние сборки компонентов
2) выполняя отладку в моем VS2010 ide (который находится на том же сервере), я получил очень длинный дамп стека, начиная с OLEAUT32.dll, я обновил эту DLL, но не нашел изменений
3) Я фактически запускаю (и работаю) программу через подключение к удаленному рабочему столу. Сбой программы на моем рабочем столе, а также на пользовательских подключениях к терминальному серверу.
4) ОС, под которой я работаю - Windows Server 2003
5) код, который я использую:
'Код'
Private Sub Form_Unload(Cancel As Integer)
Set rsChild = Nothing
Set rsCaseFile = Nothing
' many similar record sets closing
ys.CloseConnection
Set ys = Nothing
UnloadAllForms (Me.Name)
' closeing bound collections
Set bndChild = Nothing
Set bndAuth = Nothing
' more bound collections closed
' i had added the next two lines but it made no difference
frmmain.close
Set frmMain = nothing
getout
end sub
Public Sub UnloadAllForms(Optional FormToIgnore As String = "")
Dim f As Form
For Each f In Forms
If Not f Is Nothing Then
If f.Name <> FormToIgnore Then
Unload f
Set f = Nothing
End If
End If
Next f
End Sub
'\code'
6) Я добавил подпрограмму «getout» в модуль запуска в надежде, что это позволит аккуратно закрыть объект формы, но это не устранило проблему
Большое спасибо всем за помощь