Как вы чисто прервать программу 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
Halt (0) раньше был хорошим старомодным способом сказать программе, чтобы закончить с немедленным эффектом. Вероятно, есть более удобный для Delphi способ сделать это сейчас, но я на 95% уверен, что halt(0) все еще работает. :-)
в случае, если предложение HeartWare об использовании ExitProcess () терпит неудачу, возможно, вы используете некоторые DLL, которые не хорошо реагируют на DLL_PROCESS_DETACH. В этом случае попробуйте использовать TerminateProcess (getCurrentProcess, 0 );
Как только вы прибегаете к таким мерам, можно задаться вопросом, по-прежнему ли "чистая" часть названия темы выдерживает проверку.
в последний раз, когда мне пришлось искать проблему, как это было выключение было причиной события (изменение размера? Это было в то время.) стрелять по умирающему окну, вызывая попытку перерисовать что-то, что нуждалось в материале, который уже был удален.