VB6 application's process continues running after application closes

Posted on 2008-10-30
Last Modified: 2013-12-26
My VB6 application continues to run indefinitely as a process after the application closes.  The phantom process uses 0 cpu but it takes up memory and ties up the .exe file as being in-use.  The task manager doesn't show it listed as applications but it does show it in the process list.

I added "EndProcess(function shown below) programname.exe" at the start of the program to kill any processes leftover from any previous executions.  Prior to that line of code, more and more phantom processes would appear in the process list each time the program ran. This line of code prevents the accumulation of phantom processes but I still can't get rid of the process that remains after the program finishes.  This problem only occurs when running the .exe.  When I run it in the IDE, it doesn't leave any processes running after it ends.

It looks to me through tracing in the IDE and msgboxes that all of the forms are being unloaded.  Shouldn't that clear out all of the memory and kill the application and process when the final form is unloaded?  I dynamically create a few controls while the program is running, are they removed from memory when the form is unloaded?  I also define some variables as public in a module.  Are the module's variables removed from memory when the final form is unloaded?  How can I determine what is remaining resident in memory after the program runs?  

Public Function EndProcess(ByVal sExeName As String) As Boolean
' This works at the beginning of the program to end any processes that are still running since the last time this program ran
   On Error GoTo Err_Handler  
   Dim oProcessCollection, oProcess, ok, ii
   Set oProcessCollection = GetObject("WinMgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & sExeName & "'")   
   ii = oProcessCollection.Count
   Debug.Print "Total: " & ii   
   If oProcessCollection.Count > 1 Then
      For Each oProcess In oProcessCollection
         ok = (oProcess.Terminate = 0)
         If ok Then
            ii = ii - 1
            Debug.Print "Count: " & ii
            If ii = 1 Then
               Exit For
            End If
         End If
   End If   
   Exit Function
   Debug.Print Err.Description
   EndProcess = False
End Function

Open in new window

Question by:SteveQ2
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 22843584
Do you have any "infinite processing loops" in your app with DoEvents() within to keep the app responsive?

What does your app do?

Expert Comment

ID: 22843628
This generally happen when unhandled object exists in memory, cause program not to terminate properly....

I suggest you to check if any - late binding object in project are handled properly? Or any form object not closed before user try to close application!

 I dynamically create a few controls while the program is running, are they removed from memory when the form is unloaded?   - Yes
I also define some variables as public in a module.  Are the module's variables removed from memory when the final form is unloaded?  - Yes
LVL 10

Accepted Solution

peetm earned 500 total points
ID: 22844343
Not a 'debug', but you could just call 'End' in the main form's Unload event!

Author Closing Comment

ID: 31511772
I would love to know what is really causing the leftover process after the program finishes; but your suggestion seems to be a good quick fix.  Thank you.

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Spell Check in VB6 13 144
How to hault or freeze parent form when a 2d form is open in vb6 3 46
VB6 ListBox Question 4 61
Modify Text File with Excel Macro 13 43
There are many ways to remove duplicate entries in an SQL or Access database. Most make you temporarily insert an ID field, make a temp table and copy data back and forth, and/or are slow. Here is an easy way in VB6 using ADO to remove duplicate row…
Introduction In a recent article ( for the Excel community, I showed an improved version of the Excel Concatenate() function.  While writing that article I realized that no o…
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

738 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question