Процедура Halt в Delphi заканчивает программу с дополнительным диалогом.
Процедура Halt вынуждает резкое завершение текущего приложения.
Предупреждение: не гарантируется, что ресурсы будут освобождены при вызове halt.
Переменная ExitCode может быть произвольно установлена, передавая значение ExitValue. Этот код передается прерывателю приложения как код возврата от приложения.
Если значение ErrorAddr уже было присвоено, перед тем как был вызван Halt, то диалог отображается, показывая значение ErrorAddr и ExitCode.
После выполнения Halt, перед фактическим завершением программы, выполняется секция модуля finalization.
Предупреждение.
Используйте эту процедуру только в исключительных случаях.
Процедура Halt: Останавливает программу с диалогом ошибки
var i : Integer; begin // Set up an error address so that halt shows a termination dialog ErrorAddr := Addr(i); // Stop the program with exit code 4 Halt(4); // The following will not be executed ShowMessage(‘We do not get this far’); end;
Результат
Программа заканчивается, не выполнив инструкцию ShowMessage. Диалог ошибки отобразит:
Как отключить демонстрационный режим Delphi
Runtime error 4 at 0069FC94
Похожие функции, процедуры и команды
Break — выполняет выход из одного цикла.
Continue — заставляет перейти к следующей итерации цикла.
Exit — осуществляет выход из функции или процедуры.
ExitCode — устанавливает код возврата, когда приложение заканчивается.
Goto — вызывает скачок к метке, независимо от вложения.
RunError — заканчивает программу с диалогом ошибки.
Abort — прерывает обработку команд и выходит к последнему исключительному блоку.
Вас может заинтересовать
- Процедура Abort – прерывает обработку команд и выходит к последнему исключительному блоку
- Процедура Append – открывает текстовый файл, для добавления записей в файл (добавляет в конец файла)
- Процедура AssignFile – связывает дескриптор файла с бинарным или текстовым файлом
- Процедура AssignPrn – обрабатывает принтер как текстовый файл (простой способ печати текста)
- Процедура Beep – делает звук гудка
- Процедура BlockRead – читает блок записей данных из нетипизированного двоичного файла
- Процедура BlockWrite – записывает блок записей данных в нетипизированный двоичный файл
- Процедура Break – выполняет выход из одного цикла
- Процедура ChDir – выбор диска и директории (папки), в которой будет производиться работа
- Процедура CloseFile – закрывает открытый файл
Источник: d-nik.site
Программирование на Delphi
Как завершить любой процесс, в том числе и системный
// Включение, приминение и отключения привилегии. // Для примера возьмем привилегию отладки приложений ‘SeDebugPrivilege’ // необходимую для завершения ЛЮБЫХ процессов в системе (завершение процесов // созданных текущим пользователем привилегия не нужна. function ProcessTerminate(dwPID:Cardinal):Boolean; var hToken:THandle; SeDebugNameValue:Int64; tkp:TOKEN_PRIVILEGES; ReturnLength:Cardinal; hProcess:THandle; begin Result:=false; // Добавляем привилегию SeDebugPrivilege // Для начала получаем токен нашего процесса if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken ) then exit; // Получаем LUID привилегии if not LookupPrivilegeValue( nil, ‘SeDebugPrivilege’, SeDebugNameValue ) then begin CloseHandle(hToken); exit; end; tkp.PrivilegeCount:= 1; tkp.Privileges[0].Luid := SeDebugNameValue; tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; // Добавляем привилегию к нашему процессу AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength); if GetLastError() < >ERROR_SUCCESS then exit; // Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем // завершить и системный процесс // Получаем дескриптор процесса для его завершения hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID); if hProcess =0 then exit; // Завершаем процесс if not TerminateProcess(hProcess, DWORD(-1)) then exit; CloseHandle( hProcess ); // Удаляем привилегию tkp.Privileges[0].Attributes := 0; AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength); if GetLastError() < >ERROR_SUCCESS then exit; Result:=true; end; // Название добавление/удаление привилгии немного неправильные.
Привилегия или // есть в токене процесса или ее нет. Если привилегия есть, то она может быть в // двух состояниях — или включеная или отключеная. И в этом примере мы только // включаем или выключаем необходимую привилегию, а не добавляем ее.
Программа и Интерфейс — Процессы и Сервисы
Autocom cdp, Delphi DS150e. Пример работы Часть 1
Unit с полезными функциями для работы с процессами
Запустить процесс в защищенной области другого пользователя
Инсталляция и удаление сервисов под НТ
Как выполнить какой-то процесс тогда, когда пользователь не работает с моим приложением
Как завершить любой процесс, в том числе и системный
Как заказать сервисный процесс
Как запустить апплет панели управления
Как запустить и остановить сервис (или получить его статус)
Как запустить и подождать завершения 2х процессов
Как определить откуда был запущен процесс
Как получить или установить приоритет процесса в Win9x или Me
Как получить список всех запущенных процессов
Как получить хэндлы всех пpоцессов, котоpые запущены на данный момент в системе
Как поместить приложение Delphi в Панель Управления
Как узнать имя файла текущего процесса
Как узнать, запущен ли процесс в Win9x
Написание сервисов Windows NT на WinAPI
Обнаружить терминальные сервисы
Остановка и запуск сервисов
Отсортировать выполнение процессов в системе
Передать строки, картинки (streams) между процессами
Перечислить процессы и завершить их
Получение списка окон, с возможностью указания типа окна
Получение списка процессов в Windows 9x и NT
Получить заголовки и названия классов форм активных процессов
Получить количество памяти, занимаемое процессом
Получить сведения о процессе
Приверить, запущен ли сервис
Источник: delphibaza.ru
Delphi Day Blog ✎
Не секрет, что даже если код приложения компилируется, далеко не факт, что приложение будет работать верно. В нём могут быть логические и динамические ошибки, на которые нам не может указать компилятор, как он делает это при синтаксических ошибках.
Логические ошибки – это ошибки в самой логике выполнения программы. Примером логической ошибки в программе может служить например ситуация, когда программа учёта разрешает приходовать один и тот же товар дважды. Логическая ошибка как правило не вызывает сбоя работы программы, но заставляет ее работать не так, как этого задумывал программист.
Динамические ошибки – это ошибки, которые всплывают на этапе выполнения программы. Примером может служить ситуация, когда в переменную типа byte программа будет пытаться положить значение большее, чем этот тип сможет в себе содержать. Например, число 3000.
Для локализации и исправления таких ошибок необходимо использовать отладчик. Отладка приложения позволяет выявить место возникновения ошибки и принять меры по ее исправлению.
Средства отладки в Delphi
Точки останова на код
Точки останова (Breakpoint) – это прерывание хода выполнения программы в том месте, где была установлена точка останова. На этом этапе, если программа запущена под отладчиком (из среды), она будет продолжать выполнение, пока не дойдёт до точки останова. После этого выполнение программы останавливается (но не завершается). Теперь можно посмотреть значения переменных, например, или продолжить выполнение программы пошагово (трассировать).
Интегрированный отладчик Delphi использует два типа точек останова (далее по тексту: BP ) – условные и безусловные. На безусловных BP отладчик будет останавливаться всегда, в то время как на условных остановится только в том случае, если заданное условие выполнится.
Установка безусловных точек останова
Устанавливать точки останова можно различными методами. Можно установить безусловный BP простым кликом по полоске в редакторе кода, левее требуемой инструкции (рис. 1). Строка, на которую был поставлен BP окрасится в другой цвет, а на месте клика появится красная точка, которая символизирует точку останова. Другим способом установки безусловного BP является нажатие клавиши F5, будучи на той инструкции, на которой планируется останавливать отладчик.
Установка условных точек останова
Как уже было сказано, кроме безусловных точек останова, можно использовать так называемые условные BP. Условные точки устанавливаются из главного меню, а именно Run | Add Breakpoint | Source Breakpoint. После, появится диалоговое окно, в котором, в поле “Condition” нужно указать условие останова в виде логического выражения.
После этого, программа прервётся на указанном месте только тогда, когда переменная “i” примет значение “3”. В окне установки BP есть дополнительные поля, введённые для других нужд:
Filename – поле, в котором указывается, в каком файле устанавливается BP.
Line number – номер строки, на которой нужно установить BP.
Thread – здесь можно указать поток, к которому будет применена точка останова. Можно задать номер потока или если он именован, задать его имя.
Pass count – количество холостых проходов программы через точку без прерывания на ней.
Group – можно указать имя для группы, к которой будет относиться точка прерывания. Точки останова можно разделять на логические группы и затем активировать или деактивировать их все вместе. Например, очень удобно, если у вас все BP которые тормозят циклы, находятся например в группе “Cycle”, а точки, которые навешаны на вызовы WinAPI-фунций, в группе “API”.
Группа Actions:
Break – Определяет, будет ли точка останова, тормозить программу (как классический BP)
Ignore subsequent exceptions – если включено, то отладчик перестанет всплывать на любом последующем исключении. Я использую эту опцию для того, чтобы не брякаться второй раз на одном и том же месте, при обработке исключений.
Handle subsequent exceptions – действие, обратное предыдущему.
Log message – здесь можно указать текст, который появится в окне “Event log” (Ctrl+Alt+V) вашего IDE Delphi, когда сработает BP. В конце этой строки отладчик автоматически добавит имя процесса и его дескриптор. Полезность сомнительная.
Eval expression – отладчик вычислит выражение из этого поля и покажет его в “Event log”. Очень полезное поле. Можно например быстро посмотреть значение переменной или результат выражения на момент срабатывания точки останова. “Птичка Log result” при этом должна быть “чекнута”, иначе результат выражения нигде не показывается. Другими словами, без этого чекбокса, поле “Eval expression” абсолютно бесполезно.
Enable group – активирует все точки останова выбранной группы, после того как настраиваемый BP сработал.
Disable group – деактивирует все точки останова выбранной группы.
Последние два поля используются для того, чтобы например если сработал один BP, а следом за ним стоит ещё несколько, из этой же или из другой группы, можно было бы их отключить автоматически, чтобы при продолжении выполнения программы, не брякнуться ещё раз где-то рядом.
Log call stack – включает логирование всего стека вызовов или нескольких фреймов на момент срабатывания точки. Собственно говоря, эта опция – синоним отладочному окну “Call stack” (Ctrl+Alt+S).
Точки останова на адрес и данные
Такие точки останова возможно устанавливать только в процессе прогона программы под отладчиком. Они позволяют останавливать выполнение в тех случаях, если программа обращается по адресу (Address breakpoint) или если программа читает изменяет данные (переменные, константы и записи. Data Breakpoint).
Когда срабатывает такой BP, отладчик автоматически вываливается на следующую инструкцию после той, которая выполнила обращение к адресу или данным. Установить такие BP можно из главного меню Run | Add breakpoint | Address / Data breakpoint. К слову, точки останова такого вида удобнее всего использовать, когда отладка протекает непосредственно с использованием окна низкоуровневой отладки – CPU (Ctrl+Alt+C). BP на адрес мало чем интересна, а вот на точки останова да запись данных мы рассмотрим.
Для этого нам понадобится небольшой пример кода, который мы будем отлаживать. Мы создадим его позже. Сначала нужно отключить оптимизацию, чтобы отладчик не был слишком самостоятельным и не выключал наши точки останова. Выключить оптимизацию можно так: Project | Options | Compiling | Optimization > False.
Если отладочная информация не включена в проект, то нужно включить, но обычно по дефолту она всё же включена. Если нет, то в том же окне настроек проекта включите “Debug information”, “Local symbols” и “Refference Info”. Я думаю все знают, за что означают эти опции, так как у меня нет ни малейшего желания расписывать их (лень-матушка обуяла). Тем более, их уже расписал Александр Алексеев в своём переводе “Настройки проектов в Delphi с точки зрения поиска ошибок”, очень советую, если возникают вопросы.
Итак, пример. Он будет тривиальным, может быть даже глупым, но он всё же достаточно наглядным, так что сделайте ему “скидку”:
- Определите глобальные переменные “i” и “j” типа “Integer”.
- Создайте на форме две управляющие кнопки.
- На обработчики OnClick для каждой кнопки напишите инструкции: “i:=1;” и “j:=1;”.
- PROFIT.
Нам нужно установить точку останова на запись в переменные “i” и “j”. Для этого запустите проект на выполнение и вызовите диалог “Add data breakpoint” так, как я описал выше. Хоть и выглядит он довольно уныло и очень похожим на диалог установки “Source breakpoint”, в нём есть некоторые моменты, о которых стоит сказать пару слов.
Address – адрес переменной, на который нужно установить точку останова. Следует заметить тот факт, что если отладчик сможет “сопоставить” адрес и строку исходника, он автоматом изменит тип BP на Source breakpoint.
Length – размер данных. Автоматически рассчитывается отладчиком для всех стандартных типов, но можно указать и свой размер.
Даже если переменную будет писать функция или процедура из другого модуля, отладчик всё равно это “увидит” и покажет нам место, где произошла запись. Кстати о модулях!
Точки останова “на модули”
Собственно, ничего в них интересного нет. Срабатывают тогда, когда подгружаются различные модули. Например BPL, DLL, EXE или OCX. Устанавливаются из главного меню Run | Breakpoint | Module load breakpoint. В диалоговом окне нужно указать (или выбрать) тот модуль, на загрузку которого вы хотите поставить точку останова.