我有一个遗留的vb6应用程序,该应用程序在退出时崩溃-无论是作为可执行文件还是在IDE中。如何避免车祸?

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

  • 如果我在实际执行任何操作之前先关闭程序,似乎不会出现此问题。但是,加载绑定(bind)的控件似乎在问题根源附近,尽管反复调试器,问题的开始似乎“四处走动”。通过程序退出,“X”和IDE“end”控件出现问题
    错误消息是The instruction at "0x77d042b8" referenced memory at "0x055c9028". The memory could not be "Read"。错误框中的标题是我应用内部的工具提示(在不同时间有所不同)
    在单步执行代码时,我已经放下了中断-应用程序在Form_Unload事件的退出子行中崩溃

    已添加
    我意识到我应该在原始帖子中包含其他信息。当我这么做时,我感到非常疲倦和沮丧,对不起,它是如此难以阅读。
    现在
    1)我确实安装了最新的Service Pack(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”例程,希望它可以使窗体对象干净地关闭,但不能解决问题
    非常感谢大家的帮助

    最佳答案

    看来该错误已死,最终被杀了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,以按照论坛标准编辑我的原始稿件-我会尽力偿还

    10-05 19:04