Delphi как закрыть приложение
Сообщество программистов
Общение, помощь, обмен опытом
Другие разделы портала
Переход к вопросу:
Статистика за сегодня:
Вопросы: 0
Ответы: 0
Мини-форумы: 0
Лучшие эксперты
Ответ отправил: Alexey6522 (статус: 1-ый класс)
Время отправки: 17 февраля 2010, 08:07
Мини-форум вопроса
Цитата (Alexey6522):
Скажи, а какая разница какое это приложение, будь то оконное или без оконное? Блин достали уже эти новички однодневки Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!Цитата (Alexey6522):
Консольные приложения тоже отображаются в процессах, cmd.exeНу тогда попробуй корректно завершить вот такое:
Тут, кроме как убить процесс, ничего не выйдет. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Приложение оконное но к сожалению закрыть с помощью CloseHandle не выходит вот код:
procedure TForm1.Button1Click(Sender: TObject);
begin
Цитата (Кириченко Сергей):
Ясен пень, ты же не удосужился узнать, что на самом деле функция ShellExecute() возвращает, RTFM! Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Как тебе это. В ответ на твой вопрос попробуй убей это >> while true do writeln('killme!');
Цитата (Alexey6522):
Как тебе это. В ответ на твой вопрос попробуй убей это >> while true do writeln('killme!');Да запросто
Да я и не говорил, что УБИТЬ невозможно.
Где-то я уже эту функцию видел. Объясни-ка, как она работает. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
И вообще, что за программу ты делаешь? Может в ней можно обойтись без InternetExplorer?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!1.Функция возвращает Хендл открытого приложения или сервера DDE. Возвращаемое значение должно быть больше 32.
2.Функция возвращает Хендл экземпляра обьекта. Возвращаемое значение должно быть больше 32.
3.Функция возвращает Хендл окна запущенного приложения или сервера DDE. Возвращаемое значение должно быть больше 32.
И самое интересное что ни один способ закрыть приложение по этому Handle у меня не срабатывал. Вот я и решил прояснить ситуацию у вас.
Цитата (Кириченко Сергей):
но я хочу разобраться с этим гребаным ShellExecute и как можно использовать Handle который он возвращает.ShellExecute() НЕ ВОЗВРАЩАЕТ никаких хэндлов! Тебя дезинформировали. Читай ты MSDN, там вот что написано:
Цитата:
Return Value
Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below .
Цитата (Кириченко Сергей):
Спасибо. Теперь все ясно. Вот видите меня дезинформировали, а я вам голову морочу. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!Наверное многие заметили, что событие onActivate формы ведет себя по странному, иногда происходит его активация просто при приобретении формой фокуса, а иногда событие происходит только в случае, когда форма становится видимой?
Виной тому виндовые API. Помните начиная с 98 виндов возникла фича - когда активация окна приводит к мельканию заголовка в таскбаре. Под win95/NT4 событие формы onActivate происходит только в момент показа формы (Show, ShowModal), а в остальных осях может возникать и просто при попадании фокуса на форму (уж не знаю почему, но не всегда). Есть хороший способ избавиться от такого поведения и заставить это событие возникать только 1 раз при активации формы и в дальнейшем только тогда когда это нужно.
Как запретить кнопку close в любом окне?
Следующий пример запрещает кнопку закрытия (и пункт "закрыть" (close) в системном меню) нужного нам окна (в данном случае Notepad).
Отследить завершение работы, (перезагрузку, смену пользователя) в Windows.
Очень часто мы сталкиваемся с проблемой, когда наша программа будучи запущенная в фоне и/или свёрнутая, например, в панель задач должна что-то сделать, когда Windows выключается, перезагружается или просто меняется пользователь.
Процессы, потоки и функции ShellExecute и WinExec
Устройство Windows. Процессы, потоки и функции ShellExecute и WinExec. Часть 1.
По просьбам общественности и была написана эта статья.
Действительно невозможно профессионально разрабатывать многопоточные программы,
не зная, что такое процессы, потоки, нити и синхронизация (надеюсь посвятить этому одну из следующих статей) и,
не представляя, как они работают. В статье за основу взята операционная система Windows 2000.
Так же в этой статье будут подробно рассмотрены различные методы запуска новых процессов (программ).
Запустить приложение и подождать
Function ExecuteFile(FileName, Params, WorkingDir: string ; Wait:boolean):integer;
buffer: array [ 0 .. 511 ] of Char;
ext, key, fname, path: string ;
if WorkingDir<> '' then ChDir(WorkingDir);
if ext<> '.exe' then
With TRegistry.create do
OpenKey(key+ '\Shell\open\command' , false);
if pos( '/' , fname)> 0 then fname:=copy(fname, 1 , pos( '/' ,fname)- 1 );
FName:=StringReplace(FName, '%1' , '' , [rfReplaceAll, rfIgnoreCase]);
if pos( ' ' ,FileName)> 0 then FileName:= '"' +Filename+ '"' ;
if Params<> '' then TmpStr := TmpStr + ' ' + Params;
TmpStr := TmpStr + ' ' + Params;
if CreateProcess( nil , buffer, nil , nil , false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_ CLASS , nil , nil , StartupInfo, ProcessInfo) then
while WaitforSingleObject(ProcessInfo.hProcess, 200 )=WAIT_TIMEOUT do application.ProcessMessages;
События, происходящие в приложениях Delphi при завершении работы Windows
Я провел небольшое исследование, и вот что я выяснил:
При закрытии приложения (используя системное меню или вызывая метод закрытия формы), возникают следующие события:
FormCloseQuery - действие по умолчанию, устанавливает переменную CanClose в значание TRUE и продолжает закрытие формы.
Если приложение активно и вы пытаетесь завершить работу Windows (Shut Down), происходят следующие события (с соблюдением последовательности):
Запустить приложение с помощью ShellExecute и подождать
FillChar( exInfo, Sizeof(exInfo), 0 );
With exInfo Do Begin
cbSize:= Sizeof( exInfo ); // required!
Wnd := Handle; // forms handle
lpFile:= Pchar( pdffilename );
lpParameters := PChar( printernameAndPort );
If ShellExecuteEx( @exInfo ) Then Begin
While GetExitCodeProcess( exinfo.hProcess, exitcode )
and (exitcode = STILL_ACTIVE)
Завершение всех работающих приложений
Как мне завершить все работающие задачи?
Ниже приведен код, который поможет вам завершить ВСЕ задачи без всяких уведомлений о необходимости сохранения данных.
Поэтому, прежде чем запустить этот код, убедитесь в наличии сохраненных данных и в том, что пользователь осведомлен об этой операции.
Я хотел бы завершить приложение Delphi без выполнения какой-либо другой строки кода, и мне интересно, какой способ сделать это правильно. Кроме того, я хотел бы знать, есть ли что-то не так в том, что я на самом деле делаю сейчас. В основном мой код выглядит так:
Это правильный способ остановить приложение Delphi или это нужно сделать по-другому?
3 ответа
Halt() , с другой стороны, является немедленным аварийным завершением. По сути, вырывание процесса из памяти. Используйте его только в экстремальных ситуациях, когда нет других вариантов.
Инициирует аварийное завершение программы.
Halt выполняет аварийное завершение программы и возвращается в операционную систему.
Чтобы выполнить нормальное завершение работы приложения Delphi, вызовите метод Terminate для глобального объекта Application . Если приложение не использует модуль, который предоставляет объект Application , вызовите процедуру Exit из основного блока Program.
Просто хочу отметить дополнительную проблему, если код должен находиться в главной форме OnCreate.
Попробуйте использовать такой код в событии OnCreate Main Form. Это не работает должным образом, отображается основная форма, затем приложение завершено.
Чтобы увидеть его, добавьте еще одну форму и наденьте на ее создание длинный цикл.
Кажется, что все Application.CreateForm в основном исходном коде проекта выполнены.
Единственный способ не показывать [3] - это вызвать Halt.
Примечание: почему такой код на MainForm OnCreate? Простой ответ может заключаться в том, что exe проверяет условия для запуска и видит, что они не выполняются (отсутствующие файлы и т. Д.), Грубые (извините за это) просто потому, что я хочу / должен.
Я хотел бы завершить работу приложения Delphi без выполнения какого-либо другого кода.
Ни Application.Terminate , ни Halt этого не достигнут. Первый выполняет упорядоченное завершение. Будет выполнено много кода. Звонок Halt более обнадеживает. Это ненормальное завершение. Но код завершения модуля выполняется.
Если вы хотите выйти как можно быстрее, выполняя при этом минимальный объем кода, вызовите ExitProcess . Это последний шаг Halt , и, вызывая ExitProcess напрямую, вы избегаете всех шагов, которые выполняет Halt перед вызовом ExitProcess .
по какой-то причине или выбран пользователем, "попросите" текущее приложение перезапустить его самостоятельно.
есть еще один способ закрытия-перезапуск приложения:
сохраните запланированную задачу на короткое время после закрытия приложения. Это должно быть ПОСЛЕДНИЙ вещь, которую ваше приложение делает перед выходом (без дальнейшей обработки данных, сохранения, загрузки или чего-либо еще)
- сначала получите системное время
- установите запланированную задачу через некоторое время после этого времени (запланированное событие должно будет начать исполняемый файл)
- выход из приложения (закрытие основной формы или приложения.terminate сделает это)
когда ваша программа запускается снова, она должна проверить наличие любой такой запланированной задачи и удалить их. Это должно быть ПЕРВЫЙ действие ваше приложение должно делать при запуске. (очистка)
- проверьте наличие запланированных задач, созданных исполняемым файлом
- удалить их
АФАИК, Дельфийский джедай в наборе компонентов есть компонент, с помощью которого можно выполнять планирование задач.
Я могу добавить к @Andreas Rejbrand ответ:
если код выполнен .файл dpr перед Application.Initialize. для меня лучше позвонить Halt(0) вместо Application.Terminate . Мне это нужно, потому что при первом запуске программа выполняет некоторую установку, а затем перезапускается. Если я позову Application.Terminate основная форма мигает в течение нескольких секунд (но она не должна быть создана вообще!) и затем приложение закрывается. Итак, мой код следующий:
вы можете иметь отдельный простой перезапуск.exe программа, которую вы запускаете из своей программы и передаете ей имя исполняемого файла. Затем закройте программу. Программа перезапуска может подождать некоторое время или пока исполняемый файл не будет доступен для чтения, что, по-видимому, означает, что он не работает, затем он может выполнить его и закрыть себя.
Я ожидаю, что есть лучший способ сделать это, возможно, sombody может предоставить лучшее решение, но эта функция, похоже, говорит мне, является ли исполняемый файл в настоящее время работает:
Читайте также: