# Solved: vb6 crash on exit



## IronHead83 (Jun 15, 2011)

I have a legacy vb6 app that crashes on exit - both as an executable and in the IDE. I am currently unloading the forms (except the frmmain) in form_unload, releasing all the adodb recordsets, setting all the boundcollections = nothing, I have attempted to SetErrorMode SEM_NOGPFAULTERRORBOX in the form_terminate event and that has not stopped the error from occurring. I have also checked for subclasses being instantiated in my code and found none. I have checked into the components from outside MS that are used - they are the Componentone flexgrid 8 spelling 8 and componentOne sizer control. An extensive web and forum search has not turned up any known problems similar to mine for these controls. The issue does not seem to occur if I shut down the program before actually doing anything. However loading the bound controls seems to be near where the problem is rooted, in spite of repeatedly stepping with the debugger it seems that the start of the problem "moves around". The problem occurs with the programmatic exit, the "X" and the IDE "end" control
The error message is 
The instruction at "0x77d042b8" referenced memory at "0x055c9028". The memory could not be "Read". The title in the error box is a tool tip (differing at different times) from inside my app 
OS is windows server 2003 and windows terminal server
sure appreciate any help I can get


----------



## centauricw (Jun 26, 2010)

> The instruction at "0x77d042b8" referenced memory at "0x055c9028".


This error means the program was trying to access protected memory, which is going to be hard to debug. But since you said this was running on Windows 2003 Terminal Server, does it work properly when run on a system without Terminal Services?


----------



## IronHead83 (Jun 15, 2011)

Thanks for helping, after I made that post I realized that I hadnt wrote it very well and I had left some things out.
Now
1) I do have the latest service pack (6) installed, and the latest builds of the components
2) doing a debug in my VS2010 ide (which is on the same server) I got a very long stack dump beginning with OLEAUT32.dll, I updated that DLL but found no change
3) I am actually running (and working on) the program through a remote desktop connection. The program crashes on my desktop as well as on the users terminal server connections.
4) The OS I am running under is Windows Server 2003
5) the code I am running is

```
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     
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
```
6) I have added a "getout" routine in the start up module on the hope that will allow the form object to close cleanly, the dba has the test server down at the moment and I have not been able to test it yet
Thank you all so much for your help


----------



## IronHead83 (Jun 15, 2011)

It appears that the bug is dead, the kill was in 10 parts
1) very carefully disposing of all objects
2) confirming that each recordset was closed before it was set to nothing
3) closing each form from the last forms close event
4) set the last form .visible = false then called a timer for 1 second
5) added a getout call to the bottom of the last forms unload event
6) put the getout in a module
7) added 

```
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&
```
to the declarations in that module 
8) called that declaration with

```
SetErrorMode SEM_NOGPFAULTERRORBOX
```
at the start of the getout sub
9) confirmed that the last open form was closed
10) included this code at the bottom of the getout sub to make sure it could close

```
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
```
that last part was sorta the equivalent of driving wooden stake into its heart
thanks for the help


----------

