Как вы чисто прервать программу Delphi?

У меня есть программа, которая испытывает некоторые проблемы во время выключения, вызывая исключения, которые я не могу отследить до их источника. Это, по-видимому, связано со временем и недетерминировано. Это происходит после того, как все общие ресурсы были освобождены, и поскольку это завершение работы, утечки памяти не являются проблемой, поэтому мне интересно, есть ли способ просто сказать программе немедленно и молча завершить работу после освобождения общих ресурсов, а не продолжать выключение последовательность и окно сообщения об исключении.

кто-нибудь знает, как это сделать?

5 ответов


после просмотра исходного кода библиотеки времени выполнения Delphi и документации Microsoft; я могу подтвердить комментарии Мейсона и пола-Яна.

иерархия выключения выглядит следующим образом

  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

ExitProcess(0) ?


Halt (0) раньше был хорошим старомодным способом сказать программе, чтобы закончить с немедленным эффектом. Вероятно, есть более удобный для Delphi способ сделать это сейчас, но я на 95% уверен, что halt(0) все еще работает. :-)


в случае, если предложение HeartWare об использовании ExitProcess () терпит неудачу, возможно, вы используете некоторые DLL, которые не хорошо реагируют на DLL_PROCESS_DETACH. В этом случае попробуйте использовать TerminateProcess (getCurrentProcess, 0 );

Как только вы прибегаете к таким мерам, можно задаться вопросом, по-прежнему ли "чистая" часть названия темы выдерживает проверку.


в последний раз, когда мне пришлось искать проблему, как это было выключение было причиной события (изменение размера? Это было в то время.) стрелять по умирающему окну, вызывая попытку перерисовать что-то, что нуждалось в материале, который уже был удален.