我有一个遗留的vb6应用程序在退出时崩溃 - 无论是作为可执行文件还是在IDE中。我怎样才能避免崩溃?
form_unload
中的表单(除了frmmain),释放所有ADODB RecordSets,设置所有boundcollections = nothing。 SetErrorMode SEM_NOGPFAULTERRORBOX
事件中试图form_terminate
并且没有阻止错误发生。 如果我在实际执行任何操作之前关闭程序,似乎不会出现此问题。然而,加载绑定控件似乎接近问题所在的位置,尽管反复使用调试器,似乎问题的开始“移动”。程序退出,“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 :(得分: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)
令人讨厌的情况。