Как завершить программу delphi

У меня есть программа, которой нужны данные с SQL-сервера, без которой она не может работать (ну, может, но совершенно бесполезна). Есть 2 автоматически создаваемые формы, DMOD и Main, именно в таком порядке. Это код в OnCreate DMOD:

if not fileexists(UdlFile) then begin ITRCreateFile(UdlFile); ShellExecute(Application.Handle,’open’,UdlFile,nil,nil,SW_SHOW); try cnConnect.Close; if gServerPort <> » then cnConnect.connectionString:= ‘Provider=SQLOLEDB.1;Password=*;Persist Security Info=True;User Catalog=ExquisStudio;Data Source=’ + gServerName + » + gServerPort + ‘;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ;Use Encryption for Data=False;Tag with column collation when possible=False’ else cnConnect.connectionString:= ‘Provider=SQLOLEDB.1;Password=*;Persist Security Info=True;User Catalog=ExquisStudio;Data Source=’ + gServerName + ‘;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ;Use Encryption for Data=False;Tag with column collation when possible=False’; cnConnect.Open(); except Showmessage(‘Problems with dataconnection — error SQL data’); screen.Cursor := crDefault; Application.terminate; end; end else begin try cnConnect.Close; if gServerPort <> » then cnConnect.connectionString:= ‘Provider=SQLOLEDB.1;Password=*;Persist Security Info=True;User Catalog=ExquisStudio;Data Source=’ + gServerName + » + gServerPort + ‘;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ;Use Encryption for Data=False;Tag with column collation when possible=False’ else cnConnect.connectionString:= ‘Provider=SQLOLEDB.1;Password=*;Persist Security Info=True;User Catalog=ExquisStudio;Data Source=’ + gServerName + ‘;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ;Use Encryption for Data=False;Tag with column collation when possible=False’; cnConnect.Open(); except Showmessage(‘Problems with dataconnection — error SQL data’); screen.Cursor := crDefault; Application.terminate; end; end;

Проблема в том, что программа закрывается, ничего не видно, но процесс продолжает работать, в основном с загрузкой процессора 95% или выше.

урок на Делфи — 40. Закрыть чужую программу

Это не совсем хорошо. Я немного покопался и обнаружил, что Поток не завершен, а приложение завершено под Дельфи Я добавил ExitProcess(0); после обоих Application.terminate; , и теперь процесс закрывается, как и должно быть. Я использовал 0, потому что параметр обязателен, я понятия не имею, каким он должен быть на самом деле. Мой вопрос: можно ли делать это таким образом? Он делает то, что я хочу, но у меня такое чувство, что я что-то упускаю из виду.

person diedie2 schedule 30.04.2014 source источник

Вероятно, это не очень хорошая идея. Если ваш процесс не завершается сам по себе, и вы не знаете почему, это означает, что ваша программа содержит ошибки. Использование ExitProcess(0) просто заметает это под ковер. Вы лечите симптомы, а не причину. Лучше отладьте свою программу и выясните, почему она не завершается, и устраните основную проблему. — person sashoalm nbsp schedule 30.04.2014

Читайте также:
Программы сдай старый авто

урок на делфи 27. три способа закрыть программу.

Ответы (3)

  1. Запустите вашу программу под отладчиком.
  2. Выполните действие, которое вызывает Application.Terminate .
  3. Приостановите выполнение с помощью Run | Program Pause .
  4. Посмотрите на состояние потоков, используя View | Debug Windows | Threads .
  5. Дважды щелкните поток, чтобы выбрать его и просмотреть его стек вызовов.

Надеемся, что этих стеков вызовов должно быть достаточно, чтобы определить, какой поток занят, и, таким образом, предотвратить завершение вашей программы. Первое, на что стоит обратить внимание, — это основной поток. Чего он ждет? Ответьте на этот вопрос, и вы сможете решить проблему.

person David Heffernan schedule 30.04.2014

Должно быть, я делаю что-то не так. Я установил точку останова на Application.terminate , которая срабатывает, но я не могу приостановить программу, кнопка отключена. Что я заметил, ниже кода, который я разместил первым, есть еще код, который выполняется. Возможно, мне следует использовать логическое значение, для которого в части исключения устанавливается значение false. — person diedie2; 30.04.2014

Хорошо, я думаю, что нашел его.

Вот что я сделал:

  1. Я убрал Main из списка автосоздающихся форм, чтобы там остался только DMOD. Я заметил, что программа действительно зависала здесь, если не было связи.
  2. Я удалил Application.terminate; в Exception-parts.
  3. Это код, который находится ниже кода, который я разместил ранее. Это также код, который все еще выполнялся после вызова Application.terminate; в части исключения. Я добавил дополнительную проверку здесь и позвоню Main также здесь, если все в порядке.

if cnConnect.Connected then begin ADOPermissions.Open; ADOGroupMembers.Open; ADOGroupAccess.Open; ADOGroups.Open; ADOUserAccess.Open; ADOUsers.Open; Application.CreateForm(TfrmMain, frmMain); end else Application.terminate;

Я чувствую себя немного глупо, что не обнаружил этого сам, используя точку останова, как я сделал сейчас, но я думал, что Application.terminate; остановит и уничтожит процесс напрямую.

person diedie2 schedule 30.04.2014

Хм, удалив Main как форму по умолчанию, теперь файл .dproj открывается, когда я открываю проект в RAD Studio вместо Main. Есть ли способ изменить это? — person diedie2; 02.05.2014

Читайте также:
Scl step 7 примеры программ

Ваша первоначальная проблема заключается в том, что вы пытаетесь упорядоченно закрыть программу до создания основной формы. Как правило, это рискованный процесс, так как на обработку сообщения WM_QUIT (которое отправляет команда terminate) могут негативно повлиять всевозможные вещи в вашей программе, которые происходят между вашим вызовом функции terminate и входом в основной цикл обработки сообщений приложения.

Я обычно использую одну из двух конструкций для управления этим

Первый вариант заключается в том, чтобы основная форма запрашивала у модуля данных его состояние во время инициализации основной формы, а основная форма принимала решение о выходе.

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

Любой вариант помещает код завершения в основную форму, которая помещает его после того, как среда выполнения Delphi поняла идентификатор основной формы, которой необходимо отправить сообщение о закрытии, чтобы инициировать завершение работы.

Источник: questu.ru

Как завершить любой процесс, в том числе и системный

Delphi , Программа и Интерфейс , Процессы и Сервисы

Как завершить любой процесс, в том числе и системный

Женщина спрашивает совета у доктора: — Доктор,мой 17-летний сын так увлекся компьютером,что даже спит возле него.Как его отучить? — Очень просто! Вино, водка, сигареты, женщины .
// Включение, приминение и отключения привилегии. // Для примера возьмем привилегию отладки приложений ‘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; // Название добавление/удаление привилгии немного неправильные.

Привилегия или // есть в токене процесса или ее нет. Если привилегия есть, то она может быть в // двух состояниях — или включеная или отключеная. И в этом примере мы только // включаем или выключаем необходимую привилегию, а не добавляем ее.

Статья Как завершить любой процесс, в том числе и системный раздела Программа и Интерфейс Процессы и Сервисы может быть полезна для разработчиков на Delphi и FreePascal.

Комментарии и вопросы

Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.

Источник: www.kansoftware.ru

Вы очень активны! Это здорово!

Когда обработчик завершения C ++ является правильным (TM)?

Завершение работы другого приложения — Какао

Как правильно остановить многопоточную службу Windows .NET?

delphi — завершать все потоки (TThread) при закрытии приложения

Завершить дерево процессов (C для Windows)

May 23, 2015, 07:06 PM

Как правильно завершить работу приложения Delphi?

Я хотел бы завершить приложение Delphi без выполнения какой-либо другой строки кода, и мне интересно, какой из этих способов является правильным. Кроме того, я хотел бы знать, если что-то не так в том, что я сейчас делаю. В основном мой код выглядит так:

//Freeing all objects (Obj1.Free, etc..) Application.Terminate; Halt;

Это правильный способ остановить приложение Delphi или это должно быть сделано по-другому?

Комментировать

Ответы на вопрос ( 3 )

Популярные вопросы

Можно ли разместить организацию в своем собственном процессе?

Как сбросить состояние базы данных после каждого модульного теста, не делая весь тест транзакцией?

Как скрыть некоторые функции, основанные на имени пользователя? [закрыто]

как получить тело сообщения при нажатии на уведомление FCM?

Источник: techfeed.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru