Сбой VB 6 при выходе - PullRequest
       25

Сбой VB 6 при выходе

3 голосов
/ 16 июня 2011

У меня есть устаревшее приложение 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» в модуль запуска в надежде, что это позволит аккуратно закрыть объект формы, но это не устранило проблему
Большое спасибо всем за помощь

Ответы [ 3 ]

3 голосов
/ 17 июня 2011

Похоже, что ошибка мертва, убийство состояло из 10 частей
1) очень тщательно избавлялись от всех объектов
2), подтверждая, что каждый набор записей был закрыт до того, как он был установлен в ничто
3)закрытие каждой формы из последнего события закрытия формы
4) установка последней формы .visible = false, затем вызывается таймер на 1 секунду
5) добавление вызова выхода в конец последнего события выгрузки форм
6) положить getout в модуль
7) добавили

'code'
Private Declare Function SetErrorMode Lib "kernel32" ( _
   ByVal wMode As Long) As Long  
Private Const SEM_FAILCRITICALERRORS = &H1  
Private Const SEM_NOGPFAULTERRORBOX = &H2  
Private Const SEM_NOOPENFILEERRORBOX = &H8000&  
'code'  

к объявлениям в этом модуле
8) вызвали это объявление с

'code'
SetErrorMode SEM_NOGPFAULTERRORBOX  
'code' 

в началеиз подпункта getout
9) подтвердил, что последняя открытая форма была закрыта
10) включил этот код внизу подпрограммы getout, чтобы убедиться, что он может закрыть

'code'  
    Dim tstart As Date  
    tstart = TimeValue(Now())  
    Dim i As Integer  
    i = 0  
    Do While (DateAdd("s", 3, tstart)) > TimeValue(Now())  
        For i = 0 To 1000  
            i = i + 1  
        Next  
        i = 0  
    Loop   
   ' endtask("PLacements") 

    End  
'code'  

в этой последней частиСорт был эквивалентом вбивания деревянного кола в его сердце
Спасибо всем за помощь, которую вы мне оказали, и особенно MarkJ за редактирование моего первоначального представления в соответствии со стандартами форума - я постараюсь вернуть его, когда яп * * тысяча двадцать-один

0 голосов
/ 16 июня 2011

неприятная ситуация.

  • Вы используете последние пакеты обновления для Windows, VB SP6 и последние сборки компонентов ?
  • Проблема возникает на других машинах или это просто ваша машина?Если это просто ваша машина - купите другую машину.
  • Попытайтесь отследить это, убирая части программы, пока она не перестанет падать.Затем положить кусочки обратно, пока он не рухнет.Это должно помочь вам отследить, какие компоненты или код задействованы.Неважно, работает ли программа, вам просто нужно знать, происходит ли сбой при выходе.Вы можете закомментировать или удалить целые классы, удалить элементы управления, что угодно.
0 голосов
/ 16 июня 2011

То, что происходит, - это какая-то фоновая работа.Скорее всего, какой-то процесс запустил асинхронный код, который обрабатывается обработчиком событий ПОСЛЕ того, как был выполнен close ().Метод избежания будет состоять в том, чтобы скрыть форму, а затем немного подождать, прежде чем завершить метод close.Чтобы это исправить, вы должны определить, что запускает работу в фоновом потоке.В классическом VB это может закончиться болезненно.

...