【问题标题】:VB 6 crash on exitVB 6 退出时崩溃
【发布时间】:2011-06-15 20:05:42
【问题描述】:

我有一个旧版 vb6 应用程序在退出时崩溃 - 无论是作为可执行文件还是在 IDE 中。如何避免崩溃?

  • 我目前正在卸载form_unload 中的表单(除了frmmain),释放所有ADODB 记录集,设置所有boundcollections = 无。
  • 我试图在form_terminate 事件中SetErrorMode SEM_NOGPFAULTERRORBOX 并没有阻止错误的发生。
  • 我还检查了在我的代码中实例化的子类,但没有找到。
  • 我已经检查了 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 事件的退出子行上崩溃

添加
我意识到我应该在我的原始帖子中包含一些其他信息。当我完成它时我感到非常疲倦和沮丧,很抱歉它很难阅读。
现在
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”例程,希望可以让表单对象干净地关闭这并没有解决问题
非常感谢大家的帮助

【问题讨论】:

  • 能贴出你关机时运行的代码吗?
  • 哇,一个段落中有很多密集的文本供人们免费阅读和理解......在格式化文本以使其可读方面可能需要付出一些努力
  • @p.campbell 问题就在第一句“我的 vb6 应用程序在退出时崩溃 - 无论是作为可执行文件还是在 IDE 中。”它的意思是“我怎样才能避免崩溃”! @Jarrod这是一个措辞很好的问题,只是需要一些格式。我会编辑它。如果您自己编辑它,将来它可能对新手更友好? @Close 选民和反对票。没有冒犯,但是你怎么了?这是一个明确的问题。这很长,但那是因为 IronHead 在研究这个问题方面做得很好。它不是“过于本地化”。 +1 问题,如果关闭,我将投票重新开放。
  • @p.campbell 好的,只是为了你,我将再次编辑问题并添加“如何避免崩溃?”。如果你真的需要被告知他不希望他的程序崩溃。 IronHead无法发布代码,因为他有一个大型程序,而且他不知道哪个部分导致了崩溃。它不一定是程序退出时运行的代码,很可能早期的一些内存损坏/错误指针仅在退出时出现。我向你保证,这是一个很好的问题。 FWIW 我有some VB6 stats around here

标签: vb6 crash exit


【解决方案1】:

看来这个bug已经死了,杀了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 编辑我的原始提交以符合论坛标准 - 我会尽力偿还

【讨论】:

  • 感谢您回答自己的问题。第 7 步和第 8 步解决了我的问题,我尝试像你一样很好地完成所有清理工作,但在退出时抑制窗口错误是唯一有帮助的。
【解决方案2】:

正在发生的事情是正在进行一些后台工作。很可能某些进程在发出 close() 之后触发了事件处理程序正在处理的异步代码。避免方法是隐藏表单,然后在完成关闭方法之前稍等片刻。要修复它,您必须确定在后台线程上触发工作的原因。在经典的 VB 中,这最终会很痛苦。

【讨论】:

  • 你会如何建议我“停止”让它关闭。我想如果我做一些事情,比如调用一个计时器来保持表单打开。我可以调用一个计时器,然后以某种方式将 me.hide 语句放入其中吗?谢谢你帮我看这个
【解决方案3】:

情况很糟糕。

  • 您是否使用最新的 Windows 服务包、VB SP6 和latest builds of the components
  • 问题是发生在其他机器上还是只是您的机器上?如果只是您的机器,请购买另一台机器。
  • 尝试通过删除程序的各个部分直到它停止崩溃来追踪此问题。然后将碎片放回原处,直到它崩溃。这应该可以帮助您跟踪涉及哪些组件或代码。程序是否工作并不重要,您只需要知道它是否在退出时崩溃。您可以注释掉或删除整个课程、删除控件等等。

【讨论】:

  • MarkJ 非常感谢您的重新格式化和我的歉意,我一直在研究该代码,以至于我什至没有意识到我的写作是如此混乱。
  • @IronHead 不用担心。这并不令人困惑,但一些额外的格式可以帮助读者
猜你喜欢
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2016-11-06
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多