2011-06-15 123 views
3

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

  • 我目前卸载形式(除了frmmain)在form_unload,释放所有的ADODB记录集,将所有的boundcollections =什么都没有。
  • 我试图在form_terminate事件中发现SetErrorMode SEM_NOGPFAULTERRORBOX,但这并未阻止发生错误。
  • 我也检查了在我的代码中实例化的子类,发现没有。
  • 我检查了使用的外部组件 - 它们是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”例行“代码”的启动希望模块能够让表单对象干净地关闭这并没有解决问题
非常感谢大家的帮助

+0

你可以发布你关闭时运行的代码吗? – jac 2011-06-15 20:09:00

+0

哇,这是一个段落中的大量密集文本供人阅读和理解免费...在格式化文本可读的一些努力可能是为了 – 2011-06-15 20:15:03

+0

@ p.campbell问题是在那里的第一个句子“我的vb6应用程序在退出时崩溃 - 既作为可执行文件又作为IDE使用。”这意味着“我怎样才能避免崩溃”! @Jarrod这是一个措词良好的问题,只需要一些格式。我会编辑它。如果你自己编辑它,将来它可能对noobie更友好? @关闭选民和downvoters。没有冒犯,但**你怎么了**?这是一个明确的问题。这很长,但那是因为IronHead在研究这个问题上做了很好的工作。这不是“太本地化”。对问题+1,我将投票重新打开,如果它关闭。 – MarkJ 2011-06-16 11:58:04

回答

0

发生了什么是有一些背景工作正在进行。最有可能的是,某个进程触发了异步代码,该进程在发出close()后由事件处理程序处理。避免方法是隐藏表单,然后在结束close方法之前等待一下。为了解决这个问题,你必须确定什么是在后台线程上工作。在经典的VB中,这可能最终会让人痛苦。

+0

你会如何建议我'停止'让它关闭。我会想,如果我做了一些像打电话的计时器,可以保持表格的开放性。我可以打电话给一个计时器,然后以某种方式放置一个me.hide语句吗?感谢您对我的看法 – IronHead83 2011-06-17 13:10:38

0

令人讨厌的情况。

  • 您最新的Windows服务包,VB SP6和latest builds of the components
  • 问题是否发生在其他机器上,还是仅仅是您的机器?如果它只是你的机器 - 购买另一台机器。
  • 尝试通过移除程序片段来追踪它,直到它停止崩溃。然后放回部分,直到它崩溃。这应该有助于您追踪哪些组件或代码涉及。程序是否正常工作并不重要,只需知道它是否在退出时崩溃。你可以注释掉或删除整个类,删除控件,任何东西。
+0

MarkJ非常感谢您的重新格式化和我的道歉,我一直在研究该代码很久,甚至没有意识到我的写作很混乱。 – IronHead83 2011-06-16 13:03:43

+0

@IronHead不用担心。这并不令人困惑,但有一点额外的格式可以帮助读者 – MarkJ 2011-06-16 13:20:57

3

看来,这个错误是死,杀在10份
1)非常仔细地处置确认之前它被设置为无每个记录被关闭所有对象
2)的
3)从最后的形式封闭每个形式关闭事件
4)设置的最后一个表格。可见=假,则称为定时器1秒钟
5)加入一个getout呼叫的最后形式的底部卸载事件
6)放7)广告模块
DED

'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)在声明呼吁在getout子
9开始与

'code' 
SetErrorMode SEM_NOGPFAULTERRORBOX 
'code' 

该声明)证实,最后开放的形式被关闭
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

谢谢你回答你自己的问题。第7步和第8步解决了我的问题,我试着像你一样清理所有的清理工作,但是在退出时抑制窗口错误是唯一有帮助的。 – 2015-03-06 21:54:59