退出时VB 6崩溃

时间:2011-06-15 20:05:42

标签: vb6 crash exit

我有一个遗留的vb6应用程序在退出时崩溃 - 无论是作为可执行文件还是在IDE中。我怎样才能避免崩溃?

  • 我正在卸载form_unload中的表单(除了frmmain),释放所有ADODB RecordSets,设置所有boundcollections = nothing。
  • 我在SetErrorMode SEM_NOGPFAULTERRORBOX事件中试图form_terminate并且没有阻止错误发生。
  • 我还检查了在我的代码中实例化的子类,但没有找到。
  • 我已经检查过Microsoft以外的组件 - 它们是ComponentOne flexgrid 8拼写8和ComponentOne sizer控件。广泛的网络和论坛搜索没有发现任何类似于我的这些控件的已知问题。

如果我在实际执行任何操作之前关闭程序,似乎不会出现此问题。然而,加载绑定控件似乎接近问题所在的位置,尽管反复使用调试器,似乎问题的开始“移动”。程序退出,“X”和IDE“结束”控件出现问题 错误消息是 The instruction at "0x77d042b8" referenced memory at "0x055c9028". The memory could not be "Read"。错误框中的标题是我的应用内部的工具提示(在不同时间有所不同) 单步执行代码时我已经休息了 - 应用程序在Form_Unload事件的退出子行崩溃了

ADDED
 我意识到我应该在原帖中加入一些其他信息。当我做到这一点时,我感到非常疲惫和沮丧。抱歉这很难读 现在
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 个答案:

答案 0 :(得分:3)

看来这个虫已经死了,杀戮是10份 1)非常小心地处理所有物体
2)确认每个记录集在被设置为无之前已关闭 3)关闭每个表格从最后形式关闭事件
4)设置最后一个形式.visible = false然后称为计时器1秒 5)在最后一个表格卸载事件的底部添加了一个getout调用 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编辑我原来提交到论坛标准的内容 - 我会尽力付清代价

答案 1 :(得分:0)

正在发生的是有一些背景工作正在进行中。很可能某些进程触发了异步代码,该异步代码在发出close()之后由事件处理程序处理。 avoid方法是隐藏表单然后在完成close方法之前稍等一下。要修复它,您必须确定在后台线程上启动工作的内容。在经典的VB中,这最终会让人感到痛苦。

答案 2 :(得分:0)

令人讨厌的情况。

  • 您使用的是最新的Windows Service Pack,VB SP6和latest builds of the components吗?
  • 问题是在其他机器上发生还是仅仅是您的机器?如果它只是你的机器 - 买另一台机器。
  • 尝试通过取走程序直到停止崩溃来追踪这一点。然后把碎片放回去,直到它崩溃。这可以帮助您跟踪涉及的组件或代码。程序是否有效并不重要,您只需要知道它是否在退出时崩溃。您可以注释掉或删除整个类,删除控件,任何内容。