Search code examples
delphishutdownabort

How do you cleanly abort a Delphi program?


I've got a program that's having some trouble during shutdown, raising exceptions that I can't trace back to their source. It appears to be timing-related and non-deterministic. This is occurring after all shared resources have been released, and since it's shutdown, memory leaks are not an issue, so that makes me wonder if there's any way to just tell the program to terminate immediately and silently after releasing the shared resources, instead of continuing with the shutdown sequence and giving an exception message box.

Does anyone know how to do that?


Solution

  • After looking at the Delphi Run Time Library source code, and at the Microsoft documentation; I can corroborate Mason and Paul-Jan comments.

    The hierarchy of shutdown is as follows

      Application.Terminate()
        performs some unidentified housekeeping of application
        calls Halt()
    
      Halt()
        calls ExitProc if set
        alerts the user in case of runtime error
        get rid of PackageLoad call contexts that might be pending
        finalize all units
        clear all exception handlers
        call ExitprocessProc if set
        and finally, call ExitProcess() from 'kernel32.dll'
    
      ExitProcess() 
        unloads all DLLs
        uses TerminateProcess() to kill the process