我有一个遗留的vb6应用程序,该应用程序在退出时崩溃-无论是作为可执行文件还是在IDE中。如何避免车祸?
form_unload
中卸载表单(frmmain除外),释放所有ADODB RecordSet,设置所有boundcollections =无。 SetErrorMode SEM_NOGPFAULTERRORBOX
事件中进行form_terminate
,但并没有阻止错误的发生。 如果我在实际执行任何操作之前先关闭程序,似乎不会出现此问题。但是,加载绑定(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,以按照论坛标准编辑我的原始稿件-我会尽力偿还